define( [

"./core",
"./core/init",
"./manipulation", // clone
"./traversing" // parent, contents

], function( jQuery ) {

“use strict”;

jQuery.fn.extend( {

wrapAll: function( html ) {
        var wrap;

        if ( this[ 0 ] ) {
                if ( jQuery.isFunction( html ) ) {
                        html = html.call( this[ 0 ] );
                }

                // The elements to wrap the target around
                wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );

                if ( this[ 0 ].parentNode ) {
                        wrap.insertBefore( this[ 0 ] );
                }

                wrap.map( function() {
                        var elem = this;

                        while ( elem.firstElementChild ) {
                                elem = elem.firstElementChild;
                        }

                        return elem;
                } ).append( this );
        }

        return this;
},

wrapInner: function( html ) {
        if ( jQuery.isFunction( html ) ) {
                return this.each( function( i ) {
                        jQuery( this ).wrapInner( html.call( this, i ) );
                } );
        }

        return this.each( function() {
                var self = jQuery( this ),
                        contents = self.contents();

                if ( contents.length ) {
                        contents.wrapAll( html );

                } else {
                        self.append( html );
                }
        } );
},

wrap: function( html ) {
        var isFunction = jQuery.isFunction( html );

        return this.each( function( i ) {
                jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );
        } );
},

unwrap: function( selector ) {
        this.parent( selector ).not( "body" ).each( function() {
                jQuery( this ).replaceWith( this.childNodes );
        } );
        return this;
}

} );

return jQuery; } );