http://git-wip-us.apache.org/repos/asf/struts/blob/d586fd50/archetypes/struts2-archetype-angularjs/src/main/resources/archetype-resources/src/main/webapp/js/lib/angular/angular-scenario.js
----------------------------------------------------------------------
diff --git 
a/archetypes/struts2-archetype-angularjs/src/main/resources/archetype-resources/src/main/webapp/js/lib/angular/angular-scenario.js
 
b/archetypes/struts2-archetype-angularjs/src/main/resources/archetype-resources/src/main/webapp/js/lib/angular/angular-scenario.js
index 6d2e023..6b71934 100644
--- 
a/archetypes/struts2-archetype-angularjs/src/main/resources/archetype-resources/src/main/webapp/js/lib/angular/angular-scenario.js
+++ 
b/archetypes/struts2-archetype-angularjs/src/main/resources/archetype-resources/src/main/webapp/js/lib/angular/angular-scenario.js
@@ -1,17 +1,41 @@
 /*!
- * jQuery JavaScript Library v1.10.2
+ * jQuery JavaScript Library v2.1.1
  * http://jquery.com/
  *
  * Includes Sizzle.js
  * http://sizzlejs.com/
  *
- * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors
+ * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
  * Released under the MIT license
  * http://jquery.org/license
  *
- * Date: 2013-07-03T13:48Z
+ * Date: 2014-05-01T17:11Z
  */
-(function( window, undefined ) {'use strict';
+
+(function( global, factory ) {'use strict';
+
+       if ( typeof module === "object" && typeof module.exports === "object" ) 
{
+               // For CommonJS and CommonJS-like environments where a proper 
window is present,
+               // execute the factory and get jQuery
+               // For environments that do not inherently posses a window with 
a document
+               // (such as Node.js), expose a jQuery-making factory as 
module.exports
+               // This accentuates the need for the creation of a real window
+               // e.g. var jQuery = require("jquery")(window);
+               // See ticket #14549 for more info
+               module.exports = global.document ?
+                       factory( global, true ) :
+                       function( w ) {
+                               if ( !w.document ) {
+                                       throw new Error( "jQuery requires a 
window with a document" );
+                               }
+                               return factory( w );
+                       };
+       } else {
+               factory( global );
+       }
+
+// Pass this if window is not defined yet
+}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
 
 // Can't do this because several apps including ASP.NET trace
 // the stack via arguments.caller.callee and Firefox dies if
@@ -19,74 +43,43 @@
 // Support: Firefox 18+
 //
 
-var
-       // The deferred used on DOM ready
-       readyList,
+var arr = [];
 
-       // A central reference to the root jQuery(document)
-       rootjQuery,
+var slice = arr.slice;
 
-       // Support: IE<10
-       // For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`
-       core_strundefined = typeof undefined,
+var concat = arr.concat;
 
-       // Use the correct document accordingly with window argument (sandbox)
-       location = window.location,
-       document = window.document,
-       docElem = document.documentElement,
+var push = arr.push;
 
-       // Map over jQuery in case of overwrite
-       _jQuery = window.jQuery,
+var indexOf = arr.indexOf;
 
-       // Map over the $ in case of overwrite
-       _$ = window.$,
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
 
-       // [[Class]] -> type pairs
-       class2type = {},
+var support = {};
 
-       // List of deleted data cache ids, so we can reuse them
-       core_deletedIds = [],
 
-       core_version = "1.10.2",
 
-       // Save a reference to some core methods
-       core_concat = core_deletedIds.concat,
-       core_push = core_deletedIds.push,
-       core_slice = core_deletedIds.slice,
-       core_indexOf = core_deletedIds.indexOf,
-       core_toString = class2type.toString,
-       core_hasOwn = class2type.hasOwnProperty,
-       core_trim = core_version.trim,
+var
+       // Use the correct document accordingly with window argument (sandbox)
+       document = window.document,
+
+       version = "2.1.1",
 
        // 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 );
+               // Need init if jQuery is called (just allow error to be thrown 
if not included)
+               return new jQuery.fn.init( selector, context );
        },
 
-       // Used for matching numbers
-       core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
-
-       // Used for splitting on whitespace
-       core_rnotwhite = /\S+/g,
-
-       // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 
and IE)
+       // Support: Android<4.1
+       // Make sure we trim BOM and NBSP
        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)
-       // Strict HTML recognition (#11290: must start with <)
-       rquickExpr = /^(?:\s*(<[\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+(?:[eE][+-]?\d+|)/g,
-
        // Matches dashed string for camelizing
        rmsPrefix = /^-ms-/,
        rdashAlpha = /-([\da-z])/gi,
@@ -94,134 +87,13 @@ var
        // Used by jQuery.camelCase as callback to replace()
        fcamelCase = function( all, letter ) {
                return letter.toUpperCase();
-       },
-
-       // The ready event handler
-       completed = function( event ) {
-
-               // readyState === "complete" is good enough for us to call the 
dom ready in oldIE
-               if ( document.addEventListener || event.type === "load" || 
document.readyState === "complete" ) {
-                       detach();
-                       jQuery.ready();
-               }
-       },
-       // Clean-up method for dom ready events
-       detach = function() {
-               if ( document.addEventListener ) {
-                       document.removeEventListener( "DOMContentLoaded", 
completed, false );
-                       window.removeEventListener( "load", completed, false );
-
-               } else {
-                       document.detachEvent( "onreadystatechange", completed );
-                       window.detachEvent( "onload", completed );
-               }
        };
 
 jQuery.fn = jQuery.prototype = {
        // The current version of jQuery being used
-       jquery: core_version,
+       jquery: version,
 
        constructor: jQuery,
-       init: function( selector, context, rootjQuery ) {
-               var match, elem;
-
-               // HANDLE: $(""), $(null), $(undefined), $(false)
-               if ( !selector ) {
-                       return this;
-               }
-
-               // 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 ];
-
-                       } else {
-                               match = rquickExpr.exec( selector );
-                       }
-
-                       // Match html or make sure no context is specified for 
#id
-                       if ( match && (match[1] || !context) ) {
-
-                               // HANDLE: $(html) -> $(array)
-                               if ( match[1] ) {
-                                       context = context instanceof jQuery ? 
context[0] : context;
-
-                                       // scripts is true for back-compat
-                                       jQuery.merge( this, jQuery.parseHTML(
-                                               match[1],
-                                               context && context.nodeType ? 
context.ownerDocument || context : document,
-                                               true
-                                       ) );
-
-                                       // HANDLE: $(html, props)
-                                       if ( rsingleTag.test( match[1] ) && 
jQuery.isPlainObject( context ) ) {
-                                               for ( match in context ) {
-                                                       // Properties of 
context are called as methods if possible
-                                                       if ( jQuery.isFunction( 
this[ match ] ) ) {
-                                                               this[ match ]( 
context[ match ] );
-
-                                                       // ...and otherwise set 
as attributes
-                                                       } else {
-                                                               this.attr( 
match, context[ match ] );
-                                                       }
-                                               }
-                                       }
-
-                                       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 );
-                                               }
-
-                                               // Otherwise, we inject the 
element directly into the jQuery object
-                                               this.length = 1;
-                                               this[0] = elem;
-                                       }
-
-                                       this.context = document;
-                                       this.selector = selector;
-                                       return this;
-                               }
-
-                       // HANDLE: $(expr, $(...))
-                       } else if ( !context || context.jquery ) {
-                               return ( context || rootjQuery ).find( selector 
);
-
-                       // HANDLE: $(expr, context)
-                       // (which is just equivalent to: $(context).find(expr)
-                       } else {
-                               return this.constructor( context ).find( 
selector );
-                       }
-
-               // HANDLE: $(DOMElement)
-               } else if ( selector.nodeType ) {
-                       this.context = this[0] = selector;
-                       this.length = 1;
-                       return this;
-
-               // HANDLE: $(function)
-               // Shortcut for document ready
-               } else if ( jQuery.isFunction( selector ) ) {
-                       return rootjQuery.ready( selector );
-               }
-
-               if ( selector.selector !== undefined ) {
-                       this.selector = selector.selector;
-                       this.context = selector.context;
-               }
-
-               return jQuery.makeArray( selector, this );
-       },
 
        // Start with an empty selector
        selector: "",
@@ -230,19 +102,19 @@ jQuery.fn = jQuery.prototype = {
        length: 0,
 
        toArray: function() {
-               return core_slice.call( this );
+               return slice.call( this );
        },
 
        // 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 ?
+               return num != null ?
 
-                       // Return a 'clean' array
-                       this.toArray() :
+                       // Return just the one element from the set
+                       ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
 
-                       // Return just the object
-                       ( num < 0 ? this[ this.length + num ] : this[ num ] );
+                       // Return all the elements in a clean array
+                       slice.call( this );
        },
 
        // Take an array of elements and push it onto the stack
@@ -267,15 +139,14 @@ jQuery.fn = jQuery.prototype = {
                return jQuery.each( this, callback, args );
        },
 
-       ready: function( fn ) {
-               // Add the callback
-               jQuery.ready.promise().done( fn );
-
-               return this;
+       map: function( callback ) {
+               return this.pushStack( jQuery.map(this, function( elem, i ) {
+                       return callback.call( elem, i, elem );
+               }));
        },
 
        slice: function() {
-               return this.pushStack( core_slice.apply( this, arguments ) );
+               return this.pushStack( slice.apply( this, arguments ) );
        },
 
        first: function() {
@@ -292,28 +163,19 @@ jQuery.fn = jQuery.prototype = {
                return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
        },
 
-       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
+       push: push,
+       sort: arr.sort,
+       splice: arr.splice
 };
 
-// Give the init function the jQuery prototype for later instantiation
-jQuery.fn.init.prototype = jQuery.fn;
-
 jQuery.extend = jQuery.fn.extend = function() {
-       var src, copyIsArray, copy, name, options, clone,
+       var options, name, src, copy, copyIsArray, clone,
                target = arguments[0] || {},
                i = 1,
                length = arguments.length,
@@ -322,9 +184,10 @@ jQuery.extend = jQuery.fn.extend = function() {
        // Handle a deep copy situation
        if ( typeof target === "boolean" ) {
                deep = target;
-               target = arguments[1] || {};
+
                // skip the boolean and the target
-               i = 2;
+               target = arguments[ i ] || {};
+               i++;
        }
 
        // Handle case when target is a string or something (possible in deep 
copy)
@@ -333,9 +196,9 @@ jQuery.extend = jQuery.fn.extend = function() {
        }
 
        // extend jQuery itself if only one argument is passed
-       if ( length === i ) {
+       if ( i === length ) {
                target = this;
-               --i;
+               i--;
        }
 
        for ( ; i < length; i++ ) {
@@ -378,66 +241,16 @@ jQuery.extend = jQuery.fn.extend = function() {
 
 jQuery.extend({
        // Unique for each copy of jQuery on the page
-       // Non-digits removed to match rinlinejQuery
-       expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" 
),
-
-       noConflict: function( deep ) {
-               if ( window.$ === jQuery ) {
-                       window.$ = _$;
-               }
-
-               if ( deep && window.jQuery === jQuery ) {
-                       window.jQuery = _jQuery;
-               }
-
-               return jQuery;
-       },
+       expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
 
-       // Is the DOM ready to be used? Set to true once it occurs.
-       isReady: false,
-
-       // A counter to track how many items to wait for before
-       // the ready event fires. See #6781
-       readyWait: 1,
+       // Assume jQuery is ready without the ready module
+       isReady: true,
 
-       // Hold (or release) the ready event
-       holdReady: function( hold ) {
-               if ( hold ) {
-                       jQuery.readyWait++;
-               } else {
-                       jQuery.ready( true );
-               }
+       error: function( msg ) {
+               throw new Error( msg );
        },
 
-       // Handle when the DOM is ready
-       ready: function( wait ) {
-
-               // Abort if there are pending holds or we're already ready
-               if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
-                       return;
-               }
-
-               // Make sure body exists, at least, in case IE gets a little 
overzealous (ticket #5443).
-               if ( !document.body ) {
-                       return setTimeout( jQuery.ready );
-               }
-
-               // 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;
-               }
-
-               // If there are functions bound, to execute
-               readyList.resolveWith( document, [ jQuery ] );
-
-               // Trigger any bound ready events
-               if ( jQuery.fn.trigger ) {
-                       jQuery( document ).trigger("ready").off("ready");
-               }
-       },
+       noop: function() {},
 
        // See test/unit/core.js for details concerning isFunction.
        // Since version 1.3, DOM methods and functions like alert
@@ -446,63 +259,36 @@ jQuery.extend({
                return jQuery.type(obj) === "function";
        },
 
-       isArray: Array.isArray || function( obj ) {
-               return jQuery.type(obj) === "array";
-       },
+       isArray: Array.isArray,
 
        isWindow: function( obj ) {
-               /* jshint eqeqeq: false */
-               return obj != null && obj == obj.window;
+               return obj != null && obj === obj.window;
        },
 
        isNumeric: function( obj ) {
-               return !isNaN( parseFloat(obj) ) && isFinite( obj );
-       },
-
-       type: function( obj ) {
-               if ( obj == null ) {
-                       return String( obj );
-               }
-               return typeof obj === "object" || typeof obj === "function" ?
-                       class2type[ core_toString.call(obj) ] || "object" :
-                       typeof obj;
+               // parseFloat NaNs numeric-cast false positives 
(null|true|false|"")
+               // ...but misinterprets leading-number strings, particularly 
hex literals ("0x...")
+               // subtraction forces infinities to NaN
+               return !jQuery.isArray( obj ) && obj - parseFloat( obj ) >= 0;
        },
 
        isPlainObject: function( obj ) {
-               var key;
-
-               // 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 ) ) {
+               // Not plain objects:
+               // - Any object or value whose internal [[Class]] property is 
not "[object Object]"
+               // - DOM nodes
+               // - window
+               if ( jQuery.type( obj ) !== "object" || obj.nodeType || 
jQuery.isWindow( obj ) ) {
                        return false;
                }
 
-               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
+               if ( obj.constructor &&
+                               !hasOwn.call( obj.constructor.prototype, 
"isPrototypeOf" ) ) {
                        return false;
                }
 
-               // Support: IE<9
-               // Handle iteration over inherited properties before own 
properties.
-               if ( jQuery.support.ownLast ) {
-                       for ( key in obj ) {
-                               return core_hasOwn.call( obj, key );
-                       }
-               }
-
-               // Own properties are enumerated firstly, so to speed up,
-               // if last one is own, then all properties are own.
-               for ( key in obj ) {}
-
-               return key === undefined || core_hasOwn.call( obj, key );
+               // If the function hasn't returned already, we're confident that
+               // |obj| is a plain object, created by {} or constructed with 
new Object
+               return true;
        },
 
        isEmptyObject: function( obj ) {
@@ -513,105 +299,36 @@ jQuery.extend({
                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
-       // keepScripts (optional): If true, will include scripts passed in the 
html string
-       parseHTML: function( data, context, keepScripts ) {
-               if ( !data || typeof data !== "string" ) {
-                       return null;
-               }
-               if ( typeof context === "boolean" ) {
-                       keepScripts = context;
-                       context = false;
-               }
-               context = context || document;
-
-               var parsed = rsingleTag.exec( data ),
-                       scripts = !keepScripts && [];
-
-               // Single tag
-               if ( parsed ) {
-                       return [ context.createElement( parsed[1] ) ];
-               }
-
-               parsed = jQuery.buildFragment( [ data ], context, scripts );
-               if ( scripts ) {
-                       jQuery( scripts ).remove();
+       type: function( obj ) {
+               if ( obj == null ) {
+                       return obj + "";
                }
-               return jQuery.merge( [], parsed.childNodes );
+               // Support: Android < 4.0, iOS < 6 (functionish RegExp)
+               return typeof obj === "object" || typeof obj === "function" ?
+                       class2type[ toString.call(obj) ] || "object" :
+                       typeof obj;
        },
 
-       parseJSON: function( data ) {
-               // Attempt to parse using the native JSON parser first
-               if ( window.JSON && window.JSON.parse ) {
-                       return window.JSON.parse( data );
-               }
-
-               if ( data === null ) {
-                       return data;
-               }
-
-               if ( typeof data === "string" ) {
-
-                       // Make sure leading/trailing whitespace is removed (IE 
can't handle it)
-                       data = jQuery.trim( data );
-
-                       if ( data ) {
-                               // 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 ( new Function( "return " + data 
) )();
-                               }
-                       }
-               }
+       // Evaluates a script in a global context
+       globalEval: function( code ) {
+               var script,
+                       indirect = eval;
 
-               jQuery.error( "Invalid JSON: " + data );
-       },
+               code = jQuery.trim( code );
 
-       // 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 );
+               if ( code ) {
+                       // If the code includes a valid, prologue position
+                       // strict mode pragma, execute code by injecting a
+                       // script tag into the document.
+                       if ( code.indexOf("use strict") === 1 ) {
+                               script = document.createElement("script");
+                               script.text = code;
+                               document.head.appendChild( script 
).parentNode.removeChild( script );
+                       } else {
+                       // Otherwise, avoid the DOM node creation, insertion
+                       // and removal by using an indirect global eval
+                               indirect( code );
                        }
-               } 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 && jQuery.trim( 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 );
                }
        },
 
@@ -675,20 +392,12 @@ jQuery.extend({
                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 );
-               } :
-
-               // Otherwise use our own trimming functionality
-               function( text ) {
-                       return text == null ?
-                               "" :
-                               ( text + "" ).replace( rtrim, "" );
-               },
+       // Support: Android<4.1
+       trim: function( text ) {
+               return text == null ?
+                       "" :
+                       ( text + "" ).replace( rtrim, "" );
+       },
 
        // results is for internal usage only
        makeArray: function( arr, results ) {
@@ -701,7 +410,7 @@ jQuery.extend({
                                        [ arr ] : arr
                                );
                        } else {
-                               core_push.call( ret, arr );
+                               push.call( ret, arr );
                        }
                }
 
@@ -709,40 +418,16 @@ jQuery.extend({
        },
 
        inArray: function( elem, arr, i ) {
-               var len;
-
-               if ( arr ) {
-                       if ( core_indexOf ) {
-                               return core_indexOf.call( arr, elem, i );
-                       }
-
-                       len = arr.length;
-                       i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
-
-                       for ( ; i < len; i++ ) {
-                               // Skip accessing in sparse arrays
-                               if ( i in arr && arr[ i ] === elem ) {
-                                       return i;
-                               }
-                       }
-               }
-
-               return -1;
+               return arr == null ? -1 : indexOf.call( arr, elem, i );
        },
 
        merge: function( first, second ) {
-               var l = second.length,
-                       i = first.length,
-                       j = 0;
+               var len = +second.length,
+                       j = 0,
+                       i = first.length;
 
-               if ( typeof l === "number" ) {
-                       for ( ; j < l; j++ ) {
-                               first[ i++ ] = second[ j ];
-                       }
-               } else {
-                       while ( second[j] !== undefined ) {
-                               first[ i++ ] = second[ j++ ];
-                       }
+               for ( ; j < len; j++ ) {
+                       first[ i++ ] = second[ j ];
                }
 
                first.length = i;
@@ -750,23 +435,23 @@ jQuery.extend({
                return first;
        },
 
-       grep: function( elems, callback, inv ) {
-               var retVal,
-                       ret = [],
+       grep: function( elems, callback, invert ) {
+               var callbackInverse,
+                       matches = [],
                        i = 0,
-                       length = elems.length;
-               inv = !!inv;
+                       length = elems.length,
+                       callbackExpect = !invert;
 
                // 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 ] );
+                       callbackInverse = !callback( elems[ i ], i );
+                       if ( callbackInverse !== callbackExpect ) {
+                               matches.push( elems[ i ] );
                        }
                }
 
-               return ret;
+               return matches;
        },
 
        // arg is for internal usage only
@@ -777,13 +462,13 @@ jQuery.extend({
                        isArray = isArraylike( elems ),
                        ret = [];
 
-               // Go through the array, translating each of the items to their
+               // Go through the array, translating each of the items to their 
new values
                if ( isArray ) {
                        for ( ; i < length; i++ ) {
                                value = callback( elems[ i ], i, arg );
 
                                if ( value != null ) {
-                                       ret[ ret.length ] = value;
+                                       ret.push( value );
                                }
                        }
 
@@ -793,13 +478,13 @@ jQuery.extend({
                                value = callback( elems[ i ], i, arg );
 
                                if ( value != null ) {
-                                       ret[ ret.length ] = value;
+                                       ret.push( value );
                                }
                        }
                }
 
                // Flatten any nested arrays
-               return core_concat.apply( [], ret );
+               return concat.apply( [], ret );
        },
 
        // A global GUID counter for objects
@@ -808,7 +493,7 @@ jQuery.extend({
        // Bind a function to a context, optionally partially applying any
        // arguments.
        proxy: function( fn, context ) {
-               var args, proxy, tmp;
+               var tmp, args, proxy;
 
                if ( typeof context === "string" ) {
                        tmp = fn[ context ];
@@ -823,9 +508,9 @@ jQuery.extend({
                }
 
                // Simulated bind
-               args = core_slice.call( arguments, 2 );
+               args = slice.call( arguments, 2 );
                proxy = function() {
-                       return fn.apply( context || this, args.concat( 
core_slice.call( arguments ) ) );
+                       return fn.apply( context || this, args.concat( 
slice.call( arguments ) ) );
                };
 
                // Set the guid of unique handler to the same of original 
handler, so it can be removed
@@ -834,148 +519,13 @@ jQuery.extend({
                return proxy;
        },
 
-       // 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, raw ) {
-               var i = 0,
-                       length = elems.length,
-                       bulk = key == null;
-
-               // Sets many values
-               if ( jQuery.type( key ) === "object" ) {
-                       chainable = true;
-                       for ( i in key ) {
-                               jQuery.access( elems, fn, i, key[i], true, 
emptyGet, raw );
-                       }
-
-               // Sets one value
-               } else if ( value !== undefined ) {
-                       chainable = true;
-
-                       if ( !jQuery.isFunction( value ) ) {
-                               raw = true;
-                       }
-
-                       if ( bulk ) {
-                               // Bulk operations run against the entire set
-                               if ( raw ) {
-                                       fn.call( elems, value );
-                                       fn = null;
-
-                               // ...except when executing function values
-                               } else {
-                                       bulk = fn;
-                                       fn = function( elem, key, value ) {
-                                               return bulk.call( jQuery( elem 
), value );
-                                       };
-                               }
-                       }
-
-                       if ( fn ) {
-                               for ( ; i < length; i++ ) {
-                                       fn( elems[i], key, raw ? value : 
value.call( elems[i], i, fn( elems[i], key ) ) );
-                               }
-                       }
-               }
-
-               return chainable ?
-                       elems :
-
-                       // Gets
-                       bulk ?
-                               fn.call( elems ) :
-                               length ? fn( elems[0], key ) : emptyGet;
-       },
-
-       now: function() {
-               return ( new Date() ).getTime();
-       },
-
-       // A method for quickly swapping in/out CSS properties to get correct 
calculations.
-       // Note: this method belongs to the css module but it's needed here for 
the support module.
-       // If support gets modularized, this method should be moved back to the 
css module.
-       swap: function( elem, options, callback, args ) {
-               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 ];
-               }
+       now: Date.now,
 
-               ret = callback.apply( elem, args || [] );
-
-               // Revert the old values
-               for ( name in options ) {
-                       elem.style[ name ] = old[ name ];
-               }
-
-               return ret;
-       }
+       // jQuery.support is not used in Core but other projects attach their
+       // properties to it so it needs to exist.
+       support: support
 });
 
-jQuery.ready.promise = function( obj ) {
-       if ( !readyList ) {
-
-               readyList = jQuery.Deferred();
-
-               // 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 );
-
-               // Standards-based browsers support DOMContentLoaded
-               } else if ( document.addEventListener ) {
-                       // Use the handy event callback
-                       document.addEventListener( "DOMContentLoaded", 
completed, false );
-
-                       // A fallback to window.onload, that will always work
-                       window.addEventListener( "load", completed, false );
-
-               // If IE event model is used
-               } else {
-                       // Ensure firing before onload, maybe late but safe 
also for iframes
-                       document.attachEvent( "onreadystatechange", completed );
-
-                       // A fallback to window.onload, that will always work
-                       window.attachEvent( "onload", completed );
-
-                       // If IE and not a frame
-                       // continually check to see if the document is ready
-                       var top = false;
-
-                       try {
-                               top = window.frameElement == null && 
document.documentElement;
-                       } catch(e) {}
-
-                       if ( top && top.doScroll ) {
-                               (function doScrollCheck() {
-                                       if ( !jQuery.isReady ) {
-
-                                               try {
-                                                       // Use the trick by 
Diego Perini
-                                                       // 
http://javascript.nwbox.com/IEContentLoaded/
-                                                       top.doScroll("left");
-                                               } catch(e) {
-                                                       return setTimeout( 
doScrollCheck, 50 );
-                                               }
-
-                                               // detach all dom ready events
-                                               detach();
-
-                                               // and execute any waiting 
functions
-                                               jQuery.ready();
-                                       }
-                               })();
-                       }
-               }
-       }
-       return readyList.promise( obj );
-};
-
 // Populate the class2type map
 jQuery.each("Boolean Number String Function Array Date RegExp Object 
Error".split(" "), function(i, name) {
        class2type[ "[object " + name + "]" ] = name.toLowerCase();
@@ -985,7 +535,7 @@ function isArraylike( obj ) {
        var length = obj.length,
                type = jQuery.type( obj );
 
-       if ( jQuery.isWindow( obj ) ) {
+       if ( type === "function" || jQuery.isWindow( obj ) ) {
                return false;
        }
 
@@ -993,34 +543,33 @@ function isArraylike( obj ) {
                return true;
        }
 
-       return type === "array" || type !== "function" &&
-               ( length === 0 ||
-               typeof length === "number" && length > 0 && ( length - 1 ) in 
obj );
+       return type === "array" || length === 0 ||
+               typeof length === "number" && length > 0 && ( length - 1 ) in 
obj;
 }
-
-// All jQuery objects should point back to these
-rootjQuery = jQuery(document);
+var Sizzle =
 /*!
- * Sizzle CSS Selector Engine v1.10.2
+ * Sizzle CSS Selector Engine v1.10.19
  * http://sizzlejs.com/
  *
  * Copyright 2013 jQuery Foundation, Inc. and other contributors
  * Released under the MIT license
  * http://jquery.org/license
  *
- * Date: 2013-07-03
+ * Date: 2014-04-18
  */
-(function( window, undefined ) {
+(function( window ) {
 
 var i,
        support,
-       cachedruns,
        Expr,
        getText,
        isXML,
+       tokenize,
        compile,
+       select,
        outermostContext,
        sortInput,
+       hasDuplicate,
 
        // Local document vars
        setDocument,
@@ -1040,11 +589,9 @@ var i,
        classCache = createCache(),
        tokenCache = createCache(),
        compilerCache = createCache(),
-       hasDuplicate = false,
        sortOrder = function( a, b ) {
                if ( a === b ) {
                        hasDuplicate = true;
-                       return 0;
                }
                return 0;
        },
@@ -1086,17 +633,23 @@ var i,
        // Proper syntax: 
http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
        identifier = characterEncoding.replace( "w", "w#" ),
 
-       // Acceptable operators 
http://www.w3.org/TR/selectors/#attribute-selectors
-       attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + 
whitespace +
-               "*(?:([*^$|!~]?=)" + whitespace + 
"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + 
"*\\]",
-
-       // Prefer arguments quoted,
-       //   then not containing pseudos/brackets,
-       //   then attribute selectors/non-parenthetical expressions,
-       //   then anything else
-       // These preferences are here to reduce the number of selectors
-       //   needing tokenize in the PSEUDO preFilter
-       pseudos = ":(" + characterEncoding + 
")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + 
attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
+       // Attribute selectors: 
http://www.w3.org/TR/selectors/#attribute-selectors
+       attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + 
whitespace +
+               // Operator (capture 2)
+               "*([*^$|!~]?=)" + whitespace +
+               // "Attribute values must be CSS identifiers [capture 5] or 
strings [capture 3 or capture 4]"
+               "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + 
identifier + "))|)" + whitespace +
+               "*\\]",
+
+       pseudos = ":(" + characterEncoding + ")(?:\\((" +
+               // To reduce the number of selectors needing tokenize in the 
preFilter, prefer arguments:
+               // 1. quoted (capture 3; capture 4 or capture 5)
+               "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+               // 2. simple (capture 6)
+               "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+               // 3. anything else (capture 2)
+               ".*" +
+               ")\\)|)",
 
        // Leading and non-escaped trailing whitespace, capturing some 
non-whitespace characters preceding the latter
        rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + 
whitespace + "+$", "g" ),
@@ -1104,8 +657,7 @@ var i,
        rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
        rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + 
")" + whitespace + "*" ),
 
-       rsibling = new RegExp( whitespace + "*[+~]" ),
-       rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*)" + 
whitespace + "*\\]", "g" ),
+       rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + 
whitespace + "*\\]", "g" ),
 
        rpseudo = new RegExp( pseudos ),
        ridentifier = new RegExp( "^" + identifier + "$" ),
@@ -1126,14 +678,15 @@ var i,
                        whitespace + "*((?:-\\d)?\\d*)" + whitespace + 
"*\\)|)(?=[^-]|$)", "i" )
        },
 
+       rinputs = /^(?:input|select|textarea|button)$/i,
+       rheader = /^h\d$/i,
+
        rnative = /^[^{]+\{\s*\[native \w/,
 
        // Easily-parseable/retrievable ID or TAG or CLASS selectors
        rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
 
-       rinputs = /^(?:input|select|textarea|button)$/i,
-       rheader = /^h\d$/i,
-
+       rsibling = /[+~]/,
        rescape = /'|\\/g,
 
        // CSS escapes 
http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
@@ -1141,12 +694,12 @@ var i,
        funescape = function( _, escaped, escapedWhitespace ) {
                var high = "0x" + escaped - 0x10000;
                // NaN means non-codepoint
-               // Support: Firefox
+               // Support: Firefox<24
                // Workaround erroneous numeric interpretation of +"0x"
                return high !== high || escapedWhitespace ?
                        escaped :
-                       // BMP codepoint
                        high < 0 ?
+                               // BMP codepoint
                                String.fromCharCode( high + 0x10000 ) :
                                // Supplemental Plane codepoint (surrogate pair)
                                String.fromCharCode( high >> 10 | 0xD800, high 
& 0x3FF | 0xDC00 );
@@ -1210,7 +763,7 @@ function Sizzle( selector, context, results, seed ) {
                                if ( nodeType === 9 ) {
                                        elem = context.getElementById( m );
                                        // Check parentNode to catch when 
Blackberry 4.6 returns
-                                       // nodes that are no longer in the 
document #6963
+                                       // nodes that are no longer in the 
document (jQuery #6963)
                                        if ( elem && elem.parentNode ) {
                                                // Handle the case where IE, 
Opera, and Webkit return items
                                                // by name instead of ID
@@ -1266,7 +819,7 @@ function Sizzle( selector, context, results, seed ) {
                                while ( i-- ) {
                                        groups[i] = nid + toSelector( groups[i] 
);
                                }
-                               newContext = rsibling.test( selector ) && 
context.parentNode || context;
+                               newContext = rsibling.test( selector ) && 
testContext( context.parentNode ) || context;
                                newSelector = groups.join(",");
                        }
 
@@ -1301,11 +854,11 @@ function createCache() {
 
        function cache( key, value ) {
                // Use (key + " ") to avoid collision with native prototype 
properties (see Issue #157)
-               if ( keys.push( key += " " ) > Expr.cacheLength ) {
+               if ( keys.push( key + " " ) > Expr.cacheLength ) {
                        // Only keep the most recent entries
                        delete cache[ keys.shift() ];
                }
-               return (cache[ key ] = value);
+               return (cache[ key + " " ] = value);
        }
        return cache;
 }
@@ -1428,8 +981,21 @@ function createPositionalPseudo( fn ) {
 }
 
 /**
- * Detect xml
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a 
falsy value
+ */
+function testContext( context ) {
+       return context && typeof context.getElementsByTagName !== strundefined 
&& context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
  * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
  */
 isXML = Sizzle.isXML = function( elem ) {
        // documentElement is verified for cases where it doesn't yet exist
@@ -1438,16 +1004,14 @@ isXML = Sizzle.isXML = function( elem ) {
        return documentElement ? documentElement.nodeName !== "HTML" : false;
 };
 
-// Expose support vars for convenience
-support = Sizzle.support = {};
-
 /**
  * Sets document-related variables once based on the current document
  * @param {Element|Object} [doc] An element or document object to use to set 
the document
  * @returns {Object} Returns the current document
  */
 setDocument = Sizzle.setDocument = function( node ) {
-       var doc = node ? node.ownerDocument || node : preferredDoc,
+       var hasCompare,
+               doc = node ? node.ownerDocument || node : preferredDoc,
                parent = doc.defaultView;
 
        // If no document and documentElement is available, return
@@ -1466,10 +1030,17 @@ setDocument = Sizzle.setDocument = function( node ) {
        // If iframe document is assigned to "document" variable and if iframe 
has been reloaded,
        // IE will throw "permission denied" error when accessing "document" 
variable, see jQuery #13936
        // IE6-8 do not support the defaultView property so parent will be 
undefined
-       if ( parent && parent.attachEvent && parent !== parent.top ) {
-               parent.attachEvent( "onbeforeunload", function() {
-                       setDocument();
-               });
+       if ( parent && parent !== parent.top ) {
+               // IE11 does not have attachEvent, so all must suffer
+               if ( parent.addEventListener ) {
+                       parent.addEventListener( "unload", function() {
+                               setDocument();
+                       }, false );
+               } else if ( parent.attachEvent ) {
+                       parent.attachEvent( "onunload", function() {
+                               setDocument();
+                       });
+               }
        }
 
        /* Attributes
@@ -1492,7 +1063,7 @@ setDocument = Sizzle.setDocument = function( node ) {
        });
 
        // Check if getElementsByClassName can be trusted
-       support.getElementsByClassName = assert(function( div ) {
+       support.getElementsByClassName = rnative.test( 
doc.getElementsByClassName ) && assert(function( div ) {
                div.innerHTML = "<div class='a'></div><div class='a i'></div>";
 
                // Support: Safari<4
@@ -1519,7 +1090,7 @@ setDocument = Sizzle.setDocument = function( node ) {
                                var m = context.getElementById( id );
                                // Check parentNode to catch when Blackberry 
4.6 returns
                                // nodes that are no longer in the document 
#6963
-                               return m && m.parentNode ? [m] : [];
+                               return m && m.parentNode ? [ m ] : [];
                        }
                };
                Expr.filter["ID"] = function( id ) {
@@ -1599,7 +1170,15 @@ setDocument = Sizzle.setDocument = function( node ) {
                        // setting a boolean content attribute,
                        // since its presence should be enough
                        // http://bugs.jquery.com/ticket/12359
-                       div.innerHTML = "<select><option 
selected=''></option></select>";
+                       div.innerHTML = "<select msallowclip=''><option 
selected=''></option></select>";
+
+                       // Support: IE8, Opera 11-12.16
+                       // Nothing should be selected when empty strings follow 
^= or $= or *=
+                       // The test attribute must be unknown in Opera but 
"safe" for WinRT
+                       // 
http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+                       if ( div.querySelectorAll("[msallowclip^='']").length ) 
{
+                               rbuggyQSA.push( "[*^$]=" + whitespace + 
"*(?:''|\"\")" );
+                       }
 
                        // Support: IE8
                        // Boolean attributes and "value" are not treated 
correctly
@@ -1616,18 +1195,16 @@ setDocument = Sizzle.setDocument = function( node ) {
                });
 
                assert(function( div ) {
-
-                       // Support: Opera 10-12/IE8
-                       // ^= $= *= and empty values
-                       // Should not select anything
                        // Support: Windows 8 Native Apps
-                       // The type attribute is restricted during .innerHTML 
assignment
+                       // The type and name attributes are restricted during 
.innerHTML assignment
                        var input = doc.createElement("input");
                        input.setAttribute( "type", "hidden" );
-                       div.appendChild( input ).setAttribute( "t", "" );
+                       div.appendChild( input ).setAttribute( "name", "D" );
 
-                       if ( div.querySelectorAll("[t^='']").length ) {
-                               rbuggyQSA.push( "[*^$]=" + whitespace + 
"*(?:''|\"\")" );
+                       // Support: IE8
+                       // Enforce case-sensitivity of name attribute
+                       if ( div.querySelectorAll("[name=d]").length ) {
+                               rbuggyQSA.push( "name" + whitespace + 
"*[*^$|!~]?=" );
                        }
 
                        // FF 3.5 - :enabled/:disabled and hidden elements 
(hidden elements are still enabled)
@@ -1642,7 +1219,8 @@ setDocument = Sizzle.setDocument = function( node ) {
                });
        }
 
-       if ( (support.matchesSelector = rnative.test( (matches = 
docElem.webkitMatchesSelector ||
+       if ( (support.matchesSelector = rnative.test( (matches = 
docElem.matches ||
+               docElem.webkitMatchesSelector ||
                docElem.mozMatchesSelector ||
                docElem.oMatchesSelector ||
                docElem.msMatchesSelector) )) ) {
@@ -1664,11 +1242,12 @@ setDocument = Sizzle.setDocument = function( node ) {
 
        /* Contains
        ---------------------------------------------------------------------- 
*/
+       hasCompare = rnative.test( docElem.compareDocumentPosition );
 
        // Element contains another
        // Purposefully does not implement inclusive descendent
        // As in, an element does not contain itself
-       contains = rnative.test( docElem.contains ) || 
docElem.compareDocumentPosition ?
+       contains = hasCompare || rnative.test( docElem.contains ) ?
                function( a, b ) {
                        var adown = a.nodeType === 9 ? a.documentElement : a,
                                bup = b && b.parentNode;
@@ -1693,7 +1272,7 @@ setDocument = Sizzle.setDocument = function( node ) {
        ---------------------------------------------------------------------- 
*/
 
        // Document order sorting
-       sortOrder = docElem.compareDocumentPosition ?
+       sortOrder = hasCompare ?
        function( a, b ) {
 
                // Flag for duplicate removal
@@ -1702,34 +1281,46 @@ setDocument = Sizzle.setDocument = function( node ) {
                        return 0;
                }
 
-               var compare = b.compareDocumentPosition && 
a.compareDocumentPosition && a.compareDocumentPosition( b );
-
+               // Sort on method existence if only one input has 
compareDocumentPosition
+               var compare = !a.compareDocumentPosition - 
!b.compareDocumentPosition;
                if ( compare ) {
-                       // Disconnected nodes
-                       if ( compare & 1 ||
-                               (!support.sortDetached && 
b.compareDocumentPosition( a ) === compare) ) {
+                       return compare;
+               }
 
-                               // Choose the first element that is related to 
our preferred document
-                               if ( a === doc || contains(preferredDoc, a) ) {
-                                       return -1;
-                               }
-                               if ( b === doc || contains(preferredDoc, b) ) {
-                                       return 1;
-                               }
+               // Calculate position if both inputs belong to the same document
+               compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) 
?
+                       a.compareDocumentPosition( b ) :
+
+                       // Otherwise we know they are disconnected
+                       1;
 
-                               // Maintain original order
-                               return sortInput ?
-                                       ( indexOf.call( sortInput, a ) - 
indexOf.call( sortInput, b ) ) :
-                                       0;
+               // Disconnected nodes
+               if ( compare & 1 ||
+                       (!support.sortDetached && b.compareDocumentPosition( a 
) === compare) ) {
+
+                       // Choose the first element that is related to our 
preferred document
+                       if ( a === doc || a.ownerDocument === preferredDoc && 
contains(preferredDoc, a) ) {
+                               return -1;
+                       }
+                       if ( b === doc || b.ownerDocument === preferredDoc && 
contains(preferredDoc, b) ) {
+                               return 1;
                        }
 
-                       return compare & 4 ? -1 : 1;
+                       // Maintain original order
+                       return sortInput ?
+                               ( indexOf.call( sortInput, a ) - indexOf.call( 
sortInput, b ) ) :
+                               0;
                }
 
-               // Not directly comparable, sort on existence of method
-               return a.compareDocumentPosition ? -1 : 1;
+               return compare & 4 ? -1 : 1;
        } :
        function( a, b ) {
+               // Exit early if the nodes are identical
+               if ( a === b ) {
+                       hasDuplicate = true;
+                       return 0;
+               }
+
                var cur,
                        i = 0,
                        aup = a.parentNode,
@@ -1737,13 +1328,8 @@ setDocument = Sizzle.setDocument = function( node ) {
                        ap = [ a ],
                        bp = [ b ];
 
-               // Exit early if the nodes are identical
-               if ( a === b ) {
-                       hasDuplicate = true;
-                       return 0;
-
                // Parentless nodes are either documents or disconnected
-               } else if ( !aup || !bup ) {
+               if ( !aup || !bup ) {
                        return a === doc ? -1 :
                                b === doc ? 1 :
                                aup ? -1 :
@@ -1815,7 +1401,7 @@ Sizzle.matchesSelector = function( elem, expr ) {
                } catch(e) {}
        }
 
-       return Sizzle( expr, document, null, [elem] ).length > 0;
+       return Sizzle( expr, document, null, [ elem ] ).length > 0;
 };
 
 Sizzle.contains = function( context, elem ) {
@@ -1838,13 +1424,13 @@ Sizzle.attr = function( elem, name ) {
                        fn( elem, name, !documentIsHTML ) :
                        undefined;
 
-       return val === undefined ?
+       return val !== undefined ?
+               val :
                support.attributes || !documentIsHTML ?
                        elem.getAttribute( name ) :
                        (val = elem.getAttributeNode(name)) && val.specified ?
                                val.value :
-                               null :
-               val;
+                               null;
 };
 
 Sizzle.error = function( msg ) {
@@ -1877,6 +1463,10 @@ Sizzle.uniqueSort = function( results ) {
                }
        }
 
+       // Clear input after sorting to release objects
+       // See https://github.com/jquery/sizzle/pull/225
+       sortInput = null;
+
        return results;
 };
 
@@ -1892,13 +1482,13 @@ getText = Sizzle.getText = function( elem ) {
 
        if ( !nodeType ) {
                // If no nodeType, this is expected to be an array
-               for ( ; (node = elem[i]); i++ ) {
+               while ( (node = elem[i++]) ) {
                        // Do not traverse comment nodes
                        ret += getText( node );
                }
        } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
                // Use textContent for elements
-               // innerText usage removed for consistency of new lines (see 
#11153)
+               // innerText usage removed for consistency of new lines (jQuery 
#11153)
                if ( typeof elem.textContent === "string" ) {
                        return elem.textContent;
                } else {
@@ -1940,7 +1530,7 @@ Expr = Sizzle.selectors = {
                        match[1] = match[1].replace( runescape, funescape );
 
                        // Move the given value to match[3] whether quoted or 
unquoted
-                       match[3] = ( match[4] || match[5] || "" ).replace( 
runescape, funescape );
+                       match[3] = ( match[3] || match[4] || match[5] || "" 
).replace( runescape, funescape );
 
                        if ( match[2] === "~=" ) {
                                match[3] = " " + match[3] + " ";
@@ -1983,15 +1573,15 @@ Expr = Sizzle.selectors = {
 
                "PSEUDO": function( match ) {
                        var excess,
-                               unquoted = !match[5] && match[2];
+                               unquoted = !match[6] && match[2];
 
                        if ( matchExpr["CHILD"].test( match[0] ) ) {
                                return null;
                        }
 
                        // Accept quoted arguments as-is
-                       if ( match[3] && match[4] !== undefined ) {
-                               match[2] = match[4];
+                       if ( match[3] ) {
+                               match[2] = match[4] || match[5] || "";
 
                        // Strip excess characters from unquoted arguments
                        } else if ( unquoted && rpseudo.test( unquoted ) &&
@@ -2295,12 +1885,11 @@ Expr = Sizzle.selectors = {
                // Contents
                "empty": function( elem ) {
                        // http://www.w3.org/TR/selectors/#empty-pseudo
-                       // :empty is only affected by element nodes and content 
nodes(including text(3), cdata(4)),
-                       //   not comment, processing instructions, or others
-                       // Thanks to Diego Perini for the nodeName shortcut
-                       //   Greater than "@" means alpha characters 
(specifically not starting with "#" or "?")
+                       // :empty is negated by element (1) or content nodes 
(text: 3; cdata: 4; entity ref: 5),
+                       //   but not by others (comment: 8; processing 
instruction: 7; etc.)
+                       // nodeType < 6 works because attributes (2) do not 
appear as children
                        for ( elem = elem.firstChild; elem; elem = 
elem.nextSibling ) {
-                               if ( elem.nodeName > "@" || elem.nodeType === 3 
|| elem.nodeType === 4 ) {
+                               if ( elem.nodeType < 6 ) {
                                        return false;
                                }
                        }
@@ -2327,11 +1916,12 @@ Expr = Sizzle.selectors = {
 
                "text": function( elem ) {
                        var attr;
-                       // 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" &&
                                elem.type === "text" &&
-                               ( (attr = elem.getAttribute("type")) == null || 
attr.toLowerCase() === elem.type );
+
+                               // Support: IE<8
+                               // New HTML5 attribute values (e.g., "search") 
appear with elem.type === "text"
+                               ( (attr = elem.getAttribute("type")) == null || 
attr.toLowerCase() === "text" );
                },
 
                // Position-in-collection
@@ -2396,7 +1986,7 @@ function setFilters() {}
 setFilters.prototype = Expr.filters = Expr.pseudos;
 Expr.setFilters = new setFilters();
 
-function tokenize( selector, parseOnly ) {
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
        var matched, match, tokens, type,
                soFar, groups, preFilters,
                cached = tokenCache[ selector + " " ];
@@ -2417,7 +2007,7 @@ function tokenize( selector, parseOnly ) {
                                // Don't consume trailing commas as valid
                                soFar = soFar.slice( match[0].length ) || soFar;
                        }
-                       groups.push( tokens = [] );
+                       groups.push( (tokens = []) );
                }
 
                matched = false;
@@ -2461,7 +2051,7 @@ function tokenize( selector, parseOnly ) {
                        Sizzle.error( selector ) :
                        // Cache the tokens
                        tokenCache( selector, groups ).slice( 0 );
-}
+};
 
 function toSelector( tokens ) {
        var i = 0,
@@ -2490,8 +2080,8 @@ function addCombinator( matcher, combinator, base ) {
 
                // Check against all ancestor/preceding elements
                function( elem, context, xml ) {
-                       var data, cache, outerCache,
-                               dirkey = dirruns + " " + doneName;
+                       var oldCache, outerCache,
+                               newCache = [ dirruns, doneName ];
 
                        // We can't set arbitrary data on XML nodes, so they 
don't benefit from dir caching
                        if ( xml ) {
@@ -2506,14 +2096,17 @@ function addCombinator( matcher, combinator, base ) {
                                while ( (elem = elem[ dir ]) ) {
                                        if ( elem.nodeType === 1 || 
checkNonElements ) {
                                                outerCache = elem[ expando ] || 
(elem[ expando ] = {});
-                                               if ( (cache = outerCache[ dir 
]) && cache[0] === dirkey ) {
-                                                       if ( (data = cache[1]) 
=== true || data === cachedruns ) {
-                                                               return data === 
true;
-                                                       }
+                                               if ( (oldCache = outerCache[ 
dir ]) &&
+                                                       oldCache[ 0 ] === 
dirruns && oldCache[ 1 ] === doneName ) {
+
+                                                       // Assign to newCache 
so results back-propagate to previous elements
+                                                       return (newCache[ 2 ] = 
oldCache[ 2 ]);
                                                } else {
-                                                       cache = outerCache[ dir 
] = [ dirkey ];
-                                                       cache[1] = matcher( 
elem, context, xml ) || cachedruns;
-                                                       if ( cache[1] === true 
) {
+                                                       // Reuse newcache so 
results back-propagate to previous elements
+                                                       outerCache[ dir ] = 
newCache;
+
+                                                       // A match means we're 
done; a fail means we have to keep checking
+                                                       if ( (newCache[ 2 ] = 
matcher( elem, context, xml )) ) {
                                                                return true;
                                                        }
                                                }
@@ -2537,6 +2130,15 @@ function elementMatcher( matchers ) {
                matchers[0];
 }
 
+function multipleContexts( selector, contexts, results ) {
+       var i = 0,
+               len = contexts.length;
+       for ( ; i < len; i++ ) {
+               Sizzle( selector, contexts[i], results );
+       }
+       return results;
+}
+
 function condense( unmatched, map, filter, context, xml ) {
        var elem,
                newUnmatched = [],
@@ -2707,31 +2309,30 @@ function matcherFromTokens( tokens ) {
 }
 
 function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
-       // A counter to specify which element is currently being matched
-       var matcherCachedRuns = 0,
-               bySet = setMatchers.length > 0,
+       var bySet = setMatchers.length > 0,
                byElement = elementMatchers.length > 0,
-               superMatcher = function( seed, context, xml, results, 
expandContext ) {
+               superMatcher = function( seed, context, xml, results, outermost 
) {
                        var elem, j, matcher,
-                               setMatched = [],
                                matchedCount = 0,
                                i = "0",
                                unmatched = seed && [],
-                               outermost = expandContext != null,
+                               setMatched = [],
                                contextBackup = outermostContext,
-                               // We must always have either seed elements or 
context
-                               elems = seed || byElement && Expr.find["TAG"]( 
"*", expandContext && context.parentNode || context ),
+                               // We must always have either seed elements or 
outermost context
+                               elems = seed || byElement && Expr.find["TAG"]( 
"*", outermost ),
                                // Use integer dirruns iff this is the 
outermost matcher
-                               dirrunsUnique = (dirruns += contextBackup == 
null ? 1 : Math.random() || 0.1);
+                               dirrunsUnique = (dirruns += contextBackup == 
null ? 1 : Math.random() || 0.1),
+                               len = elems.length;
 
                        if ( outermost ) {
                                outermostContext = context !== document && 
context;
-                               cachedruns = matcherCachedRuns;
                        }
 
                        // Add elements passing elementMatchers directly to 
results
                        // Keep `i` a string if there are no elements so 
`matchedCount` will be "00" below
-                       for ( ; (elem = elems[i]) != null; i++ ) {
+                       // Support: IE<9, Safari
+                       // Tolerate NodeList properties (IE: "length"; Safari: 
<number>) matching elements by id
+                       for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
                                if ( byElement && elem ) {
                                        j = 0;
                                        while ( (matcher = 
elementMatchers[j++]) ) {
@@ -2742,7 +2343,6 @@ function matcherFromGroupMatchers( elementMatchers, 
setMatchers ) {
                                        }
                                        if ( outermost ) {
                                                dirruns = dirrunsUnique;
-                                               cachedruns = 
++matcherCachedRuns;
                                        }
                                }
 
@@ -2807,7 +2407,7 @@ function matcherFromGroupMatchers( elementMatchers, 
setMatchers ) {
                superMatcher;
 }
 
-compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) 
{
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) 
{
        var i,
                setMatchers = [],
                elementMatchers = [],
@@ -2815,12 +2415,12 @@ compile = Sizzle.compile = function( selector, group /* 
Internal Use Only */ ) {
 
        if ( !cached ) {
                // Generate a function of recursive functions that can be used 
to check each element
-               if ( !group ) {
-                       group = tokenize( selector );
+               if ( !match ) {
+                       match = tokenize( selector );
                }
-               i = group.length;
+               i = match.length;
                while ( i-- ) {
-                       cached = matcherFromTokens( group[i] );
+                       cached = matcherFromTokens( match[i] );
                        if ( cached[ expando ] ) {
                                setMatchers.push( cached );
                        } else {
@@ -2830,82 +2430,91 @@ compile = Sizzle.compile = function( selector, group /* 
Internal Use Only */ ) {
 
                // Cache the compiled function
                cached = compilerCache( selector, matcherFromGroupMatchers( 
elementMatchers, setMatchers ) );
+
+               // Save selector and tokenization
+               cached.selector = selector;
        }
        return cached;
 };
 
-function multipleContexts( selector, contexts, results ) {
-       var i = 0,
-               len = contexts.length;
-       for ( ; i < len; i++ ) {
-               Sizzle( selector, contexts[i], results );
-       }
-       return results;
-}
-
-function select( selector, context, results, seed ) {
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ *  selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ *  selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
        var i, tokens, token, type, find,
-               match = tokenize( selector );
+               compiled = typeof selector === "function" && selector,
+               match = !seed && tokenize( (selector = compiled.selector || 
selector) );
 
-       if ( !seed ) {
-               // Try to minimize operations if there is only one group
-               if ( match.length === 1 ) {
+       results = results || [];
 
-                       // Take a shortcut and set the context if the root 
selector is an ID
-                       tokens = match[0] = match[0].slice( 0 );
-                       if ( tokens.length > 2 && (token = tokens[0]).type === 
"ID" &&
-                                       support.getById && context.nodeType === 
9 && documentIsHTML &&
-                                       Expr.relative[ tokens[1].type ] ) {
+       // Try to minimize operations if there is no seed and only one group
+       if ( match.length === 1 ) {
 
-                               context = ( Expr.find["ID"]( 
token.matches[0].replace(runescape, funescape), context ) || [] )[0];
-                               if ( !context ) {
-                                       return results;
-                               }
-                               selector = selector.slice( 
tokens.shift().value.length );
+               // Take a shortcut and set the context if the root selector is 
an ID
+               tokens = match[0] = match[0].slice( 0 );
+               if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+                               support.getById && context.nodeType === 9 && 
documentIsHTML &&
+                               Expr.relative[ tokens[1].type ] ) {
+
+                       context = ( Expr.find["ID"]( 
token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+                       if ( !context ) {
+                               return results;
+
+                       // Precompiled matchers will still verify ancestry, so 
step up a level
+                       } else if ( compiled ) {
+                               context = context.parentNode;
                        }
 
-                       // Fetch a seed set for right-to-left matching
-                       i = matchExpr["needsContext"].test( selector ) ? 0 : 
tokens.length;
-                       while ( i-- ) {
-                               token = tokens[i];
+                       selector = selector.slice( tokens.shift().value.length 
);
+               }
 
-                               // Abort if we hit a combinator
-                               if ( Expr.relative[ (type = token.type) ] ) {
-                                       break;
-                               }
-                               if ( (find = Expr.find[ type ]) ) {
-                                       // Search, expanding context for 
leading sibling combinators
-                                       if ( (seed = find(
-                                               token.matches[0].replace( 
runescape, funescape ),
-                                               rsibling.test( tokens[0].type ) 
&& context.parentNode || context
-                                       )) ) {
-
-                                               // If seed is empty or no 
tokens remain, we can return early
-                                               tokens.splice( i, 1 );
-                                               selector = seed.length && 
toSelector( tokens );
-                                               if ( !selector ) {
-                                                       push.apply( results, 
seed );
-                                                       return results;
-                                               }
+               // Fetch a seed set for right-to-left matching
+               i = matchExpr["needsContext"].test( selector ) ? 0 : 
tokens.length;
+               while ( i-- ) {
+                       token = tokens[i];
 
-                                               break;
+                       // Abort if we hit a combinator
+                       if ( Expr.relative[ (type = token.type) ] ) {
+                               break;
+                       }
+                       if ( (find = Expr.find[ type ]) ) {
+                               // Search, expanding context for leading 
sibling combinators
+                               if ( (seed = find(
+                                       token.matches[0].replace( runescape, 
funescape ),
+                                       rsibling.test( tokens[0].type ) && 
testContext( context.parentNode ) || context
+                               )) ) {
+
+                                       // If seed is empty or no tokens 
remain, we can return early
+                                       tokens.splice( i, 1 );
+                                       selector = seed.length && toSelector( 
tokens );
+                                       if ( !selector ) {
+                                               push.apply( results, seed );
+                                               return results;
                                        }
+
+                                       break;
                                }
                        }
                }
        }
 
-       // Compile and execute a filtering function
+       // Compile and execute a filtering function if one is not provided
        // Provide `match` to avoid retokenization if we modified the selector 
above
-       compile( selector, match )(
+       ( compiled || compile( selector, match ) )(
                seed,
                context,
                !documentIsHTML,
                results,
-               rsibling.test( selector )
+               rsibling.test( selector ) && testContext( context.parentNode ) 
|| context
        );
        return results;
-}
+};
 
 // One-time assignments
 
@@ -2914,7 +2523,7 @@ support.sortStable = expando.split("").sort( sortOrder 
).join("") === expando;
 
 // Support: Chrome<14
 // Always assume duplicates if they aren't passed to the comparison function
-support.detectDuplicates = hasDuplicate;
+support.detectDuplicates = !!hasDuplicate;
 
 // Initialize against the default document
 setDocument();
@@ -2962,13 +2571,20 @@ if ( !assert(function( div ) {
        addHandle( booleans, function( elem, name, isXML ) {
                var val;
                if ( !isXML ) {
-                       return (val = elem.getAttributeNode( name )) && 
val.specified ?
-                               val.value :
-                               elem[ name ] === true ? name.toLowerCase() : 
null;
+                       return elem[ name ] === true ? name.toLowerCase() :
+                                       (val = elem.getAttributeNode( name )) 
&& val.specified ?
+                                       val.value :
+                               null;
                }
        });
 }
 
+return Sizzle;
+
+})( window );
+
+
+
 jQuery.find = Sizzle;
 jQuery.expr = Sizzle.selectors;
 jQuery.expr[":"] = jQuery.expr.pseudos;
@@ -2978,42 +2594,450 @@ jQuery.isXMLDoc = Sizzle.isXML;
 jQuery.contains = Sizzle.contains;
 
 
-})( window );
-// 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.match( core_rnotwhite ) || [], function( _, flag ) 
{
-               object[ flag ] = true;
+var rneedsContext = jQuery.expr.match.needsContext;
+
+var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);
+
+
+
+var risSimple = /^.[^:#\[\.,]*$/;
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+       if ( jQuery.isFunction( qualifier ) ) {
+               return jQuery.grep( elements, function( elem, i ) {
+                       /* jshint -W018 */
+                       return !!qualifier.call( elem, i, elem ) !== not;
+               });
+
+       }
+
+       if ( qualifier.nodeType ) {
+               return jQuery.grep( elements, function( elem ) {
+                       return ( elem === qualifier ) !== not;
+               });
+
+       }
+
+       if ( typeof qualifier === "string" ) {
+               if ( risSimple.test( qualifier ) ) {
+                       return jQuery.filter( qualifier, elements, not );
+               }
+
+               qualifier = jQuery.filter( qualifier, elements );
+       }
+
+       return jQuery.grep( elements, function( elem ) {
+               return ( indexOf.call( qualifier, elem ) >= 0 ) !== not;
        });
-       return object;
 }
 
-/*
- * 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 ) {
+jQuery.filter = function( expr, elems, not ) {
+       var elem = elems[ 0 ];
+
+       if ( not ) {
+               expr = ":not(" + expr + ")";
+       }
+
+       return elems.length === 1 && elem.nodeType === 1 ?
+               jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+               jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) 
{
+                       return elem.nodeType === 1;
+               }));
+};
+
+jQuery.fn.extend({
+       find: function( selector ) {
+               var i,
+                       len = this.length,
+                       ret = [],
+                       self = this;
+
+               if ( typeof selector !== "string" ) {
+                       return this.pushStack( jQuery( selector 
).filter(function() {
+                               for ( i = 0; i < len; i++ ) {
+                                       if ( jQuery.contains( self[ i ], this ) 
) {
+                                               return true;
+                                       }
+                               }
+                       }) );
+               }
+
+               for ( i = 0; i < len; i++ ) {
+                       jQuery.find( selector, self[ i ], ret );
+               }
+
+               // Needed because $( selector, context ) becomes $( context 
).find( selector )
+               ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+               ret.selector = this.selector ? this.selector + " " + selector : 
selector;
+               return ret;
+       },
+       filter: function( selector ) {
+               return this.pushStack( winnow(this, selector || [], false) );
+       },
+       not: function( selector ) {
+               return this.pushStack( winnow(this, selector || [], true) );
+       },
+       is: function( selector ) {
+               return !!winnow(
+                       this,
+
+                       // 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".
+                       typeof selector === "string" && rneedsContext.test( 
selector ) ?
+                               jQuery( selector ) :
+                               selector || [],
+                       false
+               ).length;
+       }
+});
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+       // A simple way to check for HTML strings
+       // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+       // Strict HTML recognition (#11290: must start with <)
+       rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+       init = jQuery.fn.init = function( selector, context ) {
+               var match, elem;
+
+               // HANDLE: $(""), $(null), $(undefined), $(false)
+               if ( !selector ) {
+                       return this;
+               }
+
+               // Handle HTML strings
+               if ( typeof selector === "string" ) {
+                       if ( selector[0] === "<" && selector[ 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 ];
+
+                       } else {
+                               match = rquickExpr.exec( selector );
+                       }
+
+                       // Match html or make sure no context is specified for 
#id
+                       if ( match && (match[1] || !context) ) {
+
+                               // HANDLE: $(html) -> $(array)
+                               if ( match[1] ) {
+                                       context = context instanceof jQuery ? 
context[0] : context;
+
+                                       // scripts is true for back-compat
+                                       // Intentionally let the error be 
thrown if parseHTML is not present
+                                       jQuery.merge( this, jQuery.parseHTML(
+                                               match[1],
+                                               context && context.nodeType ? 
context.ownerDocument || context : document,
+                                               true
+                                       ) );
+
+                                       // HANDLE: $(html, props)
+                                       if ( rsingleTag.test( match[1] ) && 
jQuery.isPlainObject( context ) ) {
+                                               for ( match in context ) {
+                                                       // Properties of 
context are called as methods if possible
+                                                       if ( jQuery.isFunction( 
this[ match ] ) ) {
+                                                               this[ match ]( 
context[ match ] );
+
+                                                       // ...and otherwise set 
as attributes
+                                                       } else {
+                                                               this.attr( 
match, context[ match ] );
+                                                       }
+                                               }
+                                       }
+
+                                       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 ) {
+                                               // Inject the element directly 
into the jQuery object
+                                               this.length = 1;
+                                               this[0] = elem;
+                                       }
+
+                                       this.context = document;
+                                       this.selector = selector;
+                                       return this;
+                               }
+
+                       // HANDLE: $(expr, $(...))
+                       } else if ( !context || context.jquery ) {
+                               return ( context || rootjQuery ).find( selector 
);
+
+                       // HANDLE: $(expr, context)
+                       // (which is just equivalent to: $(context).find(expr)
+                       } else {
+                               return this.constructor( context ).find( 
selector );
+                       }
+
+               // HANDLE: $(DOMElement)
+               } else if ( selector.nodeType ) {
+                       this.context = this[0] = selector;
+                       this.length = 1;
+                       return this;
+
+               // HANDLE: $(function)
+               // Shortcut for document ready
+               } else if ( jQuery.isFunction( selector ) ) {
+                       return typeof rootjQuery.ready !== "undefined" ?
+                               rootjQuery.ready( selector ) :
+                               // Execute immediately if ready is not present
+                               selector( jQuery );
+               }
+
+               if ( selector.selector !== undefined ) {
+                       this.selector = selector.selector;
+                       this.context = selector.context;
+               }
+
+               return jQuery.makeArray( selector, this );
+       };
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+       // methods guaranteed to produce a unique set when starting from a 
unique set
+       guaranteedUnique = {
+               children: true,
+               contents: true,
+               next: true,
+               prev: true
+       };
+
+jQuery.extend({
+       dir: function( elem, dir, until ) {
+               var matched = [],
+                       truncate = until !== undefined;
+
+               while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {
+                       if ( elem.nodeType === 1 ) {
+                               if ( truncate && jQuery( elem ).is( until ) ) {
+                                       break;
+                               }
+                               matched.push( elem );
+                       }
+               }
+               return matched;
+       },
+
+       sibling: function( n, elem ) {
+               var matched = [];
+
+               for ( ; n; n = n.nextSibling ) {
+                       if ( n.nodeType === 1 && n !== elem ) {
+                               matched.push( n );
+                       }
+               }
+
+               return matched;
+       }
+});
+
+jQuery.fn.extend({
+       has: function( target ) {
+               var targets = jQuery( target, this ),
+                       l = targets.length;
+
+               return this.filter(function() {
+                       var i = 0;
+                       for ( ; i < l; i++ ) {
+                               if ( jQuery.contains( this, targets[i] ) ) {
+                                       return true;
+                               }
+                       }
+               });
+       },
+
+       closest: function( selectors, context ) {
+               var cur,
+                       i = 0,
+                       l = this.length,
+                       matched = [],
+                       pos = rneedsContext.test( selectors ) || typeof 
selectors !== "string" ?
+                               jQuery( selectors, context || this.context ) :
+                               0;
+
+               for ( ; i < l; i++ ) {
+                       for ( cur = this[i]; cur && cur !== context; cur = 
cur.parentNode ) {
+                               // Always skip document fragments
+                               if ( cur.nodeType < 11 && (pos ?
+                                       pos.index(cur) > -1 :
+
+                                       // Don't pass non-elements to Sizzle
+                                       cur.nodeType === 1 &&
+                                               
jQuery.find.matchesSelector(cur, selectors)) ) {
+
+                                       matched.push( cur );
+                                       break;
+                               }
+                       }
+               }
+
+               return this.pushStack( matched.length > 1 ? jQuery.unique( 
matched ) : matched );
+       },
+
+       // Determine the position of an element within
+       // the matched set of elements
+       index: function( elem ) {
+
+               // No argument, return index in parent
+               if ( !elem ) {
+                       return ( this[ 0 ] && this[ 0 ].parentNode ) ? 
this.first().prevAll().length : -1;
+               }
+
+               // index in selector
+               if ( typeof elem === "string" ) {
+                       return indexOf.call( jQuery( elem ), this[ 0 ] );
+               }
+
+               // Locate the position of the desired element
+               return indexOf.call( this,
+
+                       // If it receives a jQuery object, the first element is 
used
+                       elem.jquery ? elem[ 0 ] : elem
+               );
+       },
+
+       add: function( selector, context ) {
+               return this.pushStack(
+                       jQuery.unique(
+                               jQuery.merge( this.get(), jQuery( selector, 
context ) )
+                       )
+               );
+       },
+
+       addBack: function( selector ) {
+               return this.add( selector == null ?
+                       this.prevObject : this.prevObject.filter(selector)
+               );
+       }
+});
+
+function sibling( cur, dir ) {
+       while ( (cur = cur[dir]) && 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 elem.contentDocument || jQuery.merge( [], 
elem.childNodes );
+       }
+}, function( name, fn ) {
+       jQuery.fn[ name ] = function( until, selector ) {
+               var matched = jQuery.map( this, fn, until );
+
+               if ( name.slice( -5 ) !== "Until" ) {
+                       selector = until;
+               }
+
+               if ( selector && typeof selector === "string" ) {
+                       matched = jQuery.filter( selector, matched );
+               }
+
+               if ( this.length > 1 ) {
+                       // Remove duplicates
+                       if ( !guaranteedUnique[ name ] ) {
+                               jQuery.unique( matched );
+                       }
+
+                       // Reverse order for parents* and prev-derivatives
+                       if ( rparentsprev.test( name ) ) {
+                               matched.reverse();
+                       }
+               }
+
+               return this.pushStack( matched );
+       };
+});
+var rnotwhite = (/\S+/g);
+
+
+
+// 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.match( rnotwhite ) || [], function( _, flag ) {
+               object[ flag ] = true;
+       });
+       return object;
+}
+
+/*
+ * 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 options from String-formatted to Object-formatted if needed
        // (we check in cache first)
@@ -3021,18 +3045,18 @@ jQuery.Callbacks = function( options ) {
                ( optionsCache[ options ] || createOptions( options ) ) :
                jQuery.extend( {}, options );
 
-       var // Flag to know if list is currently firing
-               firing,
-               // Last fire value (for non-forgettable lists)
+       var // Last fire value (for non-forgettable lists)
                memory,
                // Flag to know if list was already fired
                fired,
+               // Flag to know if list is currently firing
+               firing,
+               // First callback to fire (used internally by add and fireWith)
+               firingStart,
                // End of the loop when firing
                firingLength,
                // Index of currently firing callback (modified by remove if 
needed)
                firingIndex,
-               // First callback to fire (used internally by add and fireWith)
-               firingStart,
                // Actual callback list
                list = [],
                // Stack of fire calls for repeatable lists
@@ -3102,7 +3126,7 @@ jQuery.Callbacks = function( options ) {
                                if ( list ) {
                                        jQuery.each( arguments, function( _, 
arg ) {
                                                var index;
-                                               while( ( index = 
jQuery.inArray( arg, list, index ) ) > -1 ) {
+                                               while ( ( index = 
jQuery.inArray( arg, list, index ) ) > -1 ) {
                                                        list.splice( index, 1 );
                                                        // Handle firing indexes
                                                        if ( firing ) {
@@ -3176,6 +3200,8 @@ jQuery.Callbacks = function( options ) {
 
        return self;
 };
+
+
 jQuery.extend({
 
        Deferred: function( func ) {
@@ -3198,8 +3224,7 @@ jQuery.extend({
                                        var fns = arguments;
                                        return jQuery.Deferred(function( 
newDefer ) {
                                                jQuery.each( tuples, function( 
i, tuple ) {
-                                                       var action = tuple[ 0 ],
-                                                               fn = 
jQuery.isFunction( fns[ i ] ) && fns[ i ];
+                                                       var fn = 
jQuery.isFunction( fns[ i ] ) && fns[ i ];
                                                        // deferred[ done | 
fail | progress ] for forwarding actions to newDefer
                                                        deferred[ tuple[1] 
](function() {
                                                                var returned = 
fn && fn.apply( this, arguments );
@@ -3209,7 +3234,7 @@ jQuery.extend({
                                                                                
.fail( newDefer.reject )
                                                                                
.progress( newDefer.notify );
                                                                } else {
-                                                                       
newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? 
[ returned ] : arguments );
+                                                                       
newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, 
fn ? [ returned ] : arguments );
                                                                }
                                                        });
                                                });
@@ -3268,1445 +3293,747 @@ jQuery.extend({
        // Deferred helper
        when: function( subordinate /* , ..., subordinateN */ ) {
                var i = 0,
-                       resolveValues = core_slice.call( arguments ),
+                       resolveValues = slice.call( arguments ),
                        length = resolveValues.length,
 
-                       // the count of uncompleted subordinates
-                       remaining = length !== 1 || ( subordinate && 
jQuery.isFunction( subordinate.promise ) ) ? length : 0,
-
-                       // the master Deferred. If resolveValues consist of 
only a single Deferred, just use that.
-                       deferred = remaining === 1 ? subordinate : 
jQuery.Deferred(),
-
-                       // Update function for both resolve and progress values
-                       updateFunc = function( i, contexts, values ) {
-                               return function( value ) {
-                                       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 );
-                                       }
-                               };
-                       },
-
-                       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;
-                               }
-                       }
-               }
-
-               // if we're not waiting on anything, resolve the master
-               if ( !remaining ) {
-                       deferred.resolveWith( resolveContexts, resolveValues );
-               }
-
-               return deferred.promise();
-       }
-});
-jQuery.support = (function( support ) {
-
-       var all, a, input, select, fragment, opt, eventName, isSupported, i,
-               div = document.createElement("div");
-
-       // Setup
-       div.setAttribute( "className", "t" );
-       div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input 
type='checkbox'/>";
-
-       // Finish early in limited (non-browser) environments
-       all = div.getElementsByTagName("*") || [];
-       a = div.getElementsByTagName("a")[ 0 ];
-       if ( !a || !a.style || !all.length ) {
-               return support;
-       }
-
-       // First batch of tests
-       select = document.createElement("select");
-       opt = select.appendChild( document.createElement("option") );
-       input = div.getElementsByTagName("input")[ 0 ];
-
-       a.style.cssText = "top:1px;float:left;opacity:.5";
-
-       // Test setAttribute on camelCase class. If it works, we need attrFixes 
when doing get/setAttribute (ie6/7)
-       support.getSetAttribute = div.className !== "t";
-
-       // IE strips leading whitespace when .innerHTML is used
-       support.leadingWhitespace = div.firstChild.nodeType === 3;
-
-       // Make sure that tbody elements aren't automatically inserted
-       // IE will insert them into empty tables
-       support.tbody = !div.getElementsByTagName("tbody").length;
-
-       // Make sure that link elements get serialized correctly by innerHTML
-       // This requires a wrapper element in IE
-       support.htmlSerialize = !!div.getElementsByTagName("link").length;
-
-       // Get the style information from getAttribute
-       // (IE uses .cssText instead)
-       support.style = /top/.test( a.getAttribute("style") );
-
-       // Make sure that URLs aren't manipulated
-       // (IE normalizes it by default)
-       support.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
-       support.opacity = /^0.5/.test( a.style.opacity );
-
-       // Verify style float existence
-       // (IE uses styleFloat instead of cssFloat)
-       support.cssFloat = !!a.style.cssFloat;
-
-       // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
-       support.checkOn = !!input.value;
-
-       // 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)
-       support.optSelected = opt.selected;
-
-       // Tests for enctype support on a form (#6743)
-       support.enctype = !!document.createElement("form").enctype;
-
-       // Makes sure cloning an html5 element does not cause problems
-       // Where outerHTML is undefined, this still works
-       support.html5Clone = document.createElement("nav").cloneNode( true 
).outerHTML !== "<:nav></:nav>";
-
-       // Will be defined later
-       support.inlineBlockNeedsLayout = false;
-       support.shrinkWrapBlocks = false;
-       support.pixelPosition = false;
-       support.deleteExpando = true;
-       support.noCloneEvent = true;
-       support.reliableMarginRight = true;
-       support.boxSizingReliable = true;
-
-       // 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;
-
-       // Support: IE<9
-       try {
-               delete div.test;
-       } catch( e ) {
-               support.deleteExpando = false;
-       }
-
-       // Check if we can trust getAttribute("value")
-       input = document.createElement("input");
-       input.setAttribute( "value", "" );
-       support.input = input.getAttribute( "value" ) === "";
-
-       // Check if an input maintains its value after becoming a radio
-       input.value = "t";
-       input.setAttribute( "type", "radio" );
-       support.radioValue = input.value === "t";
-
-       // #11217 - WebKit loses check when the name is after the checked 
attribute
-       input.setAttribute( "checked", "t" );
-       input.setAttribute( "name", "t" );
-
-       fragment = document.createDocumentFragment();
-       fragment.appendChild( input );
-
-       // Check if a disconnected checkbox will retain its checked
-       // value of true after appended to the DOM (IE6/7)
-       support.appendChecked = input.checked;
-
-       // WebKit doesn't clone checked state correctly in fragments
-       support.checkClone = fragment.cloneNode( true ).cloneNode( true 
).lastChild.checked;
-
-       // Support: IE<9
-       // Opera does not clone events (and typeof div.attachEvent === 
undefined).
-       // IE9-10 clones events bound via attachEvent, but they don't trigger 
with .click()
-       if ( div.attachEvent ) {
-               div.attachEvent( "onclick", function() {
-                       support.noCloneEvent = false;
-               });
-
-               div.cloneNode( true ).click();
-       }
-
-       // Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin 
event)
-       // Beware of CSP restrictions 
(https://developer.mozilla.org/en/Security/CSP)
-       for ( i in { submit: true, change: true, focusin: true }) {
-               div.setAttribute( eventName = "on" + i, "t" );
-
-               support[ i + "Bubbles" ] = eventName in window || 
div.attributes[ eventName ].expando === false;
-       }
-
-       div.style.backgroundClip = "content-box";
-       div.cloneNode( true ).style.backgroundClip = "";
-       support.clearCloneStyle = div.style.backgroundClip === "content-box";
-
-       // Support: IE<9
-       // Iteration over object's inherited properties before its own.
-       for ( i in jQuery( support ) ) {
-               break;
-       }
-       support.ownLast = i !== "0";
-
-       // Run tests that need a body at doc ready
-       jQuery(function() {
-               var container, marginDiv, tds,
-                       divReset = 
"padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
-                       body = document.getElementsByTagName("body")[0];
-
-               if ( !body ) {
-                       // Return for frameset docs that don't have a body
-                       return;
-               }
-
-               container = document.createElement("div");
-               container.style.cssText = 
"border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";
-
-               body.appendChild( container ).appendChild( div );
-
-               // Support: IE8
-               // 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).
-               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";
-
-               // Support: IE8
-               // Check if empty table cells still have offsetWidth/Height
-               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%;";
-
-               // Workaround failing boxSizing test due to offsetWidth 
returning wrong value
-               // with some non-1 values of body zoom, ticket #13543
-               jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, 
function() {
-                       support.boxSizing = div.offsetWidth === 4;
-               });
-
-               // Use 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. (#3333)
-                       // Fails in WebKit before Feb 2011 nightlies
-                       // WebKit Bug 13343 - getComputedStyle returns wrong 
value for margin-right
-                       marginDiv = div.appendChild( 
document.createElement("div") );
-                       marginDiv.style.cssText = div.style.cssText = divReset;
-                       marginDiv.style.marginRight = marginDiv.style.width = 
"0";
-                       div.style.width = "1px";
-
-                       support.reliableMarginRight =
-                               !parseFloat( ( window.getComputedStyle( 
marginDiv, null ) || {} ).marginRight );
-               }
-
-               if ( typeof div.style.zoom !== core_strundefined ) {
-                       // Support: IE<8
-                       // Check if natively block-level elements act like 
inline-block
-                       // elements when setting their display to 'inline' and 
giving
-                       // them layout
-                       div.innerHTML = "";
-                       div.style.cssText = divReset + 
"width:1px;padding:1px;display:inline;zoom:1";
-                       support.inlineBlockNeedsLayout = ( div.offsetWidth === 
3 );
-
-                       // Support: IE6
-                       // Check if elements with layout shrink-wrap their 
children
-                       div.style.display = "block";
-                       div.innerHTML = "<div></div>";
-                       div.firstChild.style.width = "5px";
-                       support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
-
-                       if ( support.inlineBlockNeedsLayout ) {
-                               // Prevent IE 6 from affecting layout for 
positioned elements #11048
-                               // Prevent IE from shrinking the body in IE 7 
mode #12869
-                               // Support: IE<8
-                               body.style.zoom = 1;
-                       }
-               }
-
-               body.removeChild( container );
-
-               // Null elements to avoid leaks in IE
-               container = div = tds = marginDiv = null;
-       });
-
-       // Null elements to avoid leaks in IE
-       all = select = fragment = opt = a = input = null;
-
-       return support;
-})({});
-
-var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
-       rmultiDash = /([A-Z])/g;
-
-function internalData( elem, name, data, pvt /* Internal Use Only */ ){
-       if ( !jQuery.acceptData( elem ) ) {
-               return;
-       }
-
-       var ret, thisCache,
-               internalKey = jQuery.expando,
-
-               // 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,
-
-               // 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,
-
-               // 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;
-
-       // 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)) && data === 
undefined && typeof name === "string" ) {
-               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 ) {
-                       id = elem[ internalKey ] = core_deletedIds.pop() || 
jQuery.guid++;
-               } else {
-                       id = internalKey;
-               }
-       }
-
-       if ( !cache[ id ] ) {
-               // Avoid exposing jQuery metadata on plain JS objects when the 
object
-               // is serialized using JSON.stringify
-               cache[ id ] = isNode ? {} : { 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 );
-               }
-       }
-
-       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;
-       }
-
-       // Check for both converted-to-camel and non-converted data property 
names
-       // If a data property was specified
-       if ( typeof name === "string" ) {
-
-               // 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;
-}
-
-function internalRemoveData( elem, name, pvt ) {
-       if ( !jQuery.acceptData( elem ) ) {
-               return;
-       }
-
-       var thisCache, i,
-               isNode = elem.nodeType,
-
-               // See jQuery.data for more information
-               cache = isNode ? jQuery.cache : elem,
-               id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
-
-       // 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(" ");
-                                       }
-                               }
-                       } 

<TRUNCATED>

Reply via email to