You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@roller.apache.org by gm...@apache.org on 2014/07/07 18:51:05 UTC

svn commit: r1608514 [2/5] - in /roller/trunk: app/src/main/webapp/WEB-INF/jsps/editor/ app/src/main/webapp/roller-ui/yui3/yui/ docs/

Added: roller/trunk/app/src/main/webapp/roller-ui/yui3/yui/yui-debug.js
URL: http://svn.apache.org/viewvc/roller/trunk/app/src/main/webapp/roller-ui/yui3/yui/yui-debug.js?rev=1608514&view=auto
==============================================================================
--- roller/trunk/app/src/main/webapp/roller-ui/yui3/yui/yui-debug.js (added)
+++ roller/trunk/app/src/main/webapp/roller-ui/yui3/yui/yui-debug.js Mon Jul  7 16:51:04 2014
@@ -0,0 +1,12236 @@
+/*
+YUI 3.17.2 (build 9c3c78e)
+Copyright 2014 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+
+/**
+The YUI module contains the components required for building the YUI seed file.
+This includes the script loading mechanism, a simple queue, and the core
+utilities for the library.
+
+@module yui
+@main yui
+@submodule yui-base
+**/
+
+/*jshint eqeqeq: false*/
+if (typeof YUI != 'undefined') {
+    YUI._YUI = YUI;
+}
+
+/**
+The YUI global namespace object. This is the constructor for all YUI instances.
+
+This is a self-instantiable factory function, meaning you don't need to precede
+it with the `new` operator. You can invoke it directly like this:
+
+    YUI().use('*', function (Y) {
+        // Y is a new YUI instance.
+    });
+
+But it also works like this:
+
+    var Y = YUI();
+
+The `YUI` constructor accepts an optional config object, like this:
+
+    YUI({
+        debug: true,
+        combine: false
+    }).use('node', function (Y) {
+        // Y.Node is ready to use.
+    });
+
+See the API docs for the <a href="config.html">Config</a> class for the complete
+list of supported configuration properties accepted by the YUI constuctor.
+
+If a global `YUI` object is already defined, the existing YUI object will not be
+overwritten, to ensure that defined namespaces are preserved.
+
+Each YUI instance has full custom event support, but only if the event system is
+available.
+
+@class YUI
+@uses EventTarget
+@constructor
+@global
+@param {Object} [config]* Zero or more optional configuration objects. Config
+    values are stored in the `Y.config` property. See the
+    <a href="config.html">Config</a> docs for the list of supported properties.
+**/
+
+    /*global YUI*/
+    /*global YUI_config*/
+    var YUI = function() {
+        var i = 0,
+            Y = this,
+            args = arguments,
+            l = args.length,
+            instanceOf = function(o, type) {
+                return (o && o.hasOwnProperty && (o instanceof type));
+            },
+            gconf = (typeof YUI_config !== 'undefined') && YUI_config;
+
+        if (!(instanceOf(Y, YUI))) {
+            Y = new YUI();
+        } else {
+            // set up the core environment
+            Y._init();
+
+            /**
+            Master configuration that might span multiple contexts in a non-
+            browser environment. It is applied first to all instances in all
+            contexts.
+
+            @example
+
+                YUI.GlobalConfig = {
+                    filter: 'debug'
+                };
+
+                YUI().use('node', function (Y) {
+                    // debug files used here
+                });
+
+                YUI({
+                    filter: 'min'
+                }).use('node', function (Y) {
+                    // min files used here
+                });
+
+            @property {Object} GlobalConfig
+            @global
+            @static
+            **/
+            if (YUI.GlobalConfig) {
+                Y.applyConfig(YUI.GlobalConfig);
+            }
+
+            /**
+            Page-level config applied to all YUI instances created on the
+            current page. This is applied after `YUI.GlobalConfig` and before
+            any instance-level configuration.
+
+            @example
+
+                // Single global var to include before YUI seed file
+                YUI_config = {
+                    filter: 'debug'
+                };
+
+                YUI().use('node', function (Y) {
+                    // debug files used here
+                });
+
+                YUI({
+                    filter: 'min'
+                }).use('node', function (Y) {
+                    // min files used here
+                });
+
+            @property {Object} YUI_config
+            @global
+            **/
+            if (gconf) {
+                Y.applyConfig(gconf);
+            }
+
+            // bind the specified additional modules for this instance
+            if (!l) {
+                Y._setup();
+            }
+        }
+
+        if (l) {
+            // Each instance can accept one or more configuration objects.
+            // These are applied after YUI.GlobalConfig and YUI_Config,
+            // overriding values set in those config files if there is a
+            // matching property.
+            for (; i < l; i++) {
+                Y.applyConfig(args[i]);
+            }
+
+            Y._setup();
+        }
+
+        Y.instanceOf = instanceOf;
+
+        return Y;
+    };
+
+(function() {
+
+    var proto, prop,
+        VERSION = '3.17.2',
+        PERIOD = '.',
+        BASE = 'http://yui.yahooapis.com/',
+        /*
+            These CSS class names can't be generated by
+            getClassName since it is not available at the
+            time they are being used.
+        */
+        DOC_LABEL = 'yui3-js-enabled',
+        CSS_STAMP_EL = 'yui3-css-stamp',
+        NOOP = function() {},
+        SLICE = Array.prototype.slice,
+        APPLY_TO_AUTH = { 'io.xdrReady': 1,   // the functions applyTo
+                          'io.xdrResponse': 1,   // can call. this should
+                          'SWF.eventHandler': 1 }, // be done at build time
+        hasWin = (typeof window != 'undefined'),
+        win = (hasWin) ? window : null,
+        doc = (hasWin) ? win.document : null,
+        docEl = doc && doc.documentElement,
+        docClass = docEl && docEl.className,
+        instances = {},
+        time = new Date().getTime(),
+        add = function(el, type, fn, capture) {
+            if (el && el.addEventListener) {
+                el.addEventListener(type, fn, capture);
+            } else if (el && el.attachEvent) {
+                el.attachEvent('on' + type, fn);
+            }
+        },
+        remove = function(el, type, fn, capture) {
+            if (el && el.removeEventListener) {
+                // this can throw an uncaught exception in FF
+                try {
+                    el.removeEventListener(type, fn, capture);
+                } catch (ex) {}
+            } else if (el && el.detachEvent) {
+                el.detachEvent('on' + type, fn);
+            }
+        },
+        handleReady = function() {
+            YUI.Env.DOMReady = true;
+            if (hasWin) {
+                remove(doc, 'DOMContentLoaded', handleReady);
+            }        
+        },
+        handleLoad = function() {
+            YUI.Env.windowLoaded = true;
+            YUI.Env.DOMReady = true;
+            if (hasWin) {
+                remove(window, 'load', handleLoad);
+            }
+        },
+        getLoader = function(Y, o) {
+            var loader = Y.Env._loader,
+                lCore = [ 'loader-base' ],
+                G_ENV = YUI.Env,
+                mods = G_ENV.mods;
+
+            if (loader) {
+                //loader._config(Y.config);
+                loader.ignoreRegistered = false;
+                loader.onEnd = null;
+                loader.data = null;
+                loader.required = [];
+                loader.loadType = null;
+            } else {
+                loader = new Y.Loader(Y.config);
+                Y.Env._loader = loader;
+            }
+            if (mods && mods.loader) {
+                lCore = [].concat(lCore, YUI.Env.loaderExtras);
+            }
+            YUI.Env.core = Y.Array.dedupe([].concat(YUI.Env.core, lCore));
+
+            return loader;
+        },
+
+        clobber = function(r, s) {
+            for (var i in s) {
+                if (s.hasOwnProperty(i)) {
+                    r[i] = s[i];
+                }
+            }
+        },
+
+        ALREADY_DONE = { success: true };
+
+//  Stamp the documentElement (HTML) with a class of "yui-loaded" to
+//  enable styles that need to key off of JS being enabled.
+if (docEl && docClass.indexOf(DOC_LABEL) == -1) {
+    if (docClass) {
+        docClass += ' ';
+    }
+    docClass += DOC_LABEL;
+    docEl.className = docClass;
+}
+
+if (VERSION.indexOf('@') > -1) {
+    VERSION = '3.5.0'; // dev time hack for cdn test
+}
+
+proto = {
+    /**
+    Applies a new configuration object to the config of this YUI instance. This
+    will merge new group/module definitions, and will also update the loader
+    cache if necessary. Updating `Y.config` directly will not update the cache.
+
+    @method applyConfig
+    @param {Object} o the configuration object.
+    @since 3.2.0
+    **/
+    applyConfig: function(o) {
+
+        o = o || NOOP;
+
+        var attr,
+            name,
+            // detail,
+            config = this.config,
+            mods = config.modules,
+            groups = config.groups,
+            aliases = config.aliases,
+            loader = this.Env._loader;
+
+        for (name in o) {
+            if (o.hasOwnProperty(name)) {
+                attr = o[name];
+                if (mods && name == 'modules') {
+                    clobber(mods, attr);
+                } else if (aliases && name == 'aliases') {
+                    clobber(aliases, attr);
+                } else if (groups && name == 'groups') {
+                    clobber(groups, attr);
+                } else if (name == 'win') {
+                    config[name] = (attr && attr.contentWindow) || attr;
+                    config.doc = config[name] ? config[name].document : null;
+                } else if (name == '_yuid') {
+                    // preserve the guid
+                } else {
+                    config[name] = attr;
+                }
+            }
+        }
+
+        if (loader) {
+            loader._config(o);
+        }
+
+    },
+
+    /**
+    Old way to apply a config to this instance (calls `applyConfig` under the
+    hood).
+
+    @private
+    @method _config
+    @param {Object} o The config to apply
+    **/
+    _config: function(o) {
+        this.applyConfig(o);
+    },
+
+    /**
+    Initializes this YUI instance.
+
+    @private
+    @method _init
+    **/
+    _init: function() {
+        var filter, el,
+            Y = this,
+            G_ENV = YUI.Env,
+            Env = Y.Env,
+            prop;
+
+        /**
+        The version number of this YUI instance.
+
+        This value is typically updated by a script when a YUI release is built,
+        so it may not reflect the correct version number when YUI is run from
+        the development source tree.
+
+        @property {String} version
+        **/
+        Y.version = VERSION;
+
+        if (!Env) {
+            Y.Env = {
+                core: ['get', 'features', 'intl-base', 'yui-log', 'yui-later', 'loader-base', 'loader-rollup', 'loader-yui3'],
+                loaderExtras: ['loader-rollup', 'loader-yui3'],
+                mods: {}, // flat module map
+                versions: {}, // version module map
+                base: BASE,
+                cdn: BASE + VERSION + '/build/',
+                // bootstrapped: false,
+                _idx: 0,
+                _used: {},
+                _attached: {},
+                _exported: {},
+                _missed: [],
+                _yidx: 0,
+                _uidx: 0,
+                _guidp: 'y',
+                _loaded: {},
+                // serviced: {},
+                // Regex in English:
+                // I'll start at the \b(yui).
+                // 1. Look in the test string for "yui" or
+                //    "yui-base" or "yui-davglass" or "yui-foobar" that comes after a word break.  That is, it
+                //    can't match "foyui" or "i_heart_yui". This can be anywhere in the string.
+                // 2. After #1 must come a forward slash followed by the string matched in #1, so
+                //    "yui-base/yui-base" or "yui-pants/yui-pants".
+                // 3. The second occurence of the #1 token can optionally be followed by "-debug" or "-min",
+                //    so "yui/yui-min", "yui/yui-debug", "yui-base/yui-base-debug". NOT "yui/yui-tshirt".
+                // 4. This is followed by ".js", so "yui/yui.js".
+                // 0. Going back to the beginning, now. If all that stuff in 1-4 comes after a "?" in the string,
+                //    then capture the junk between the LAST "&" and the string in 1-4.  So
+                //    "blah?foo/yui/yui.js" will capture "foo/" and "blah?some/thing.js&3.3.0/build/yui-davglass/yui-davglass.js"
+                //    will capture "3.3.0/build/"
+                //
+                // Regex Exploded:
+                // (?:\?             Find a ?
+                //   (?:[^&]*&)      followed by 0..n characters followed by an &
+                //   *               in fact, find as many sets of characters followed by a & as you can
+                //   ([^&]*)         capture the stuff after the last & in \1
+                // )?                but it's ok if all this ?junk&more_junk stuff isn't even there
+                // \b(               after a word break find either the string
+                //    yui(?:-\w+)?   "yui" optionally followed by a -, then more characters
+                // )                 and store the yui-* string in \2
+                // \/\2              then comes a / followed by the yui-* string in \2
+                // (?:-(min|debug))? optionally followed by "-min" or "-debug"
+                // .js               and ending in ".js"
+                _BASE_RE: /(?:\?(?:[^&]*&)*([^&]*))?\b(yui(?:-\w+)?)\/\2(?:-(min|debug))?\.js/,
+                parseBasePath: function(src, pattern) {
+                    var match = src.match(pattern),
+                        path, filter;
+
+                    if (match) {
+                        path = RegExp.leftContext || src.slice(0, src.indexOf(match[0]));
+
+                        // this is to set up the path to the loader.  The file
+                        // filter for loader should match the yui include.
+                        filter = match[3];
+
+                        // extract correct path for mixed combo urls
+                        // http://yuilibrary.com/projects/yui3/ticket/2528423
+                        if (match[1]) {
+                            path += '?' + match[1];
+                        }
+                        path = {
+                            filter: filter,
+                            path: path
+                        };
+                    }
+                    return path;
+                },
+                getBase: G_ENV && G_ENV.getBase ||
+                        function(pattern) {
+                            var nodes = (doc && doc.getElementsByTagName('script')) || [],
+                                path = Env.cdn, parsed,
+                                i, len, src;
+
+                            for (i = 0, len = nodes.length; i < len; ++i) {
+                                src = nodes[i].src;
+                                if (src) {
+                                    parsed = Y.Env.parseBasePath(src, pattern);
+                                    if (parsed) {
+                                        filter = parsed.filter;
+                                        path = parsed.path;
+                                        break;
+                                    }
+                                }
+                            }
+
+                            // use CDN default
+                            return path;
+                        }
+
+            };
+
+            Env = Y.Env;
+
+            Env._loaded[VERSION] = {};
+
+            if (G_ENV && Y !== YUI) {
+                Env._yidx = ++G_ENV._yidx;
+                Env._guidp = ('yui_' + VERSION + '_' +
+                             Env._yidx + '_' + time).replace(/[^a-z0-9_]+/g, '_');
+            } else if (YUI._YUI) {
+
+                G_ENV = YUI._YUI.Env;
+                Env._yidx += G_ENV._yidx;
+                Env._uidx += G_ENV._uidx;
+
+                for (prop in G_ENV) {
+                    if (!(prop in Env)) {
+                        Env[prop] = G_ENV[prop];
+                    }
+                }
+
+                delete YUI._YUI;
+            }
+
+            Y.id = Y.stamp(Y);
+            instances[Y.id] = Y;
+
+        }
+
+        Y.constructor = YUI;
+
+        // configuration defaults
+        Y.config = Y.config || {
+            bootstrap: true,
+            cacheUse: true,
+            debug: true,
+            doc: doc,
+            fetchCSS: true,
+            throwFail: true,
+            useBrowserConsole: true,
+            useNativeES5: true,
+            win: win,
+            global: Function('return this')()
+        };
+
+        //Register the CSS stamp element
+        if (doc && !doc.getElementById(CSS_STAMP_EL)) {
+            el = doc.createElement('div');
+            el.innerHTML = '<div id="' + CSS_STAMP_EL + '" style="position: absolute !important; visibility: hidden !important"></div>';
+            YUI.Env.cssStampEl = el.firstChild;
+            if (doc.body) {
+                doc.body.appendChild(YUI.Env.cssStampEl);
+            } else {
+                docEl.insertBefore(YUI.Env.cssStampEl, docEl.firstChild);
+            }
+        } else if (doc && doc.getElementById(CSS_STAMP_EL) && !YUI.Env.cssStampEl) {
+            YUI.Env.cssStampEl = doc.getElementById(CSS_STAMP_EL);
+        }
+
+        Y.config.lang = Y.config.lang || 'en-US';
+
+        Y.config.base = YUI.config.base || Y.Env.getBase(Y.Env._BASE_RE);
+
+        if (!filter || (!('mindebug').indexOf(filter))) {
+            filter = 'min';
+        }
+        filter = (filter) ? '-' + filter : filter;
+        Y.config.loaderPath = YUI.config.loaderPath || 'loader/loader' + filter + '.js';
+
+    },
+
+    /**
+    Finishes the instance setup. Attaches whatever YUI modules were defined
+    at the time that this instance was created.
+
+    @method _setup
+    @private
+    **/
+    _setup: function() {
+        var i, Y = this,
+            core = [],
+            mods = YUI.Env.mods,
+            extras = Y.config.core || [].concat(YUI.Env.core); //Clone it..
+
+        for (i = 0; i < extras.length; i++) {
+            if (mods[extras[i]]) {
+                core.push(extras[i]);
+            }
+        }
+
+        Y._attach(['yui-base']);
+        Y._attach(core);
+
+        if (Y.Loader) {
+            getLoader(Y);
+        }
+
+        // Y.log(Y.id + ' initialized', 'info', 'yui');
+    },
+
+    /**
+    Executes the named method on the specified YUI instance if that method is
+    whitelisted.
+
+    @method applyTo
+    @param {String} id YUI instance id.
+    @param {String} method Name of the method to execute. For example:
+        'Object.keys'.
+    @param {Array} args Arguments to apply to the method.
+    @return {Mixed} Return value from the applied method, or `null` if the
+        specified instance was not found or the method was not whitelisted.
+    **/
+    applyTo: function(id, method, args) {
+        if (!(method in APPLY_TO_AUTH)) {
+            this.log(method + ': applyTo not allowed', 'warn', 'yui');
+            return null;
+        }
+
+        var instance = instances[id], nest, m, i;
+        if (instance) {
+            nest = method.split('.');
+            m = instance;
+            for (i = 0; i < nest.length; i = i + 1) {
+                m = m[nest[i]];
+                if (!m) {
+                    this.log('applyTo not found: ' + method, 'warn', 'yui');
+                }
+            }
+            return m && m.apply(instance, args);
+        }
+
+        return null;
+    },
+
+/**
+Registers a YUI module and makes it available for use in a `YUI().use()` call or
+as a dependency for other modules.
+
+The easiest way to create a first-class YUI module is to use
+<a href="http://yui.github.com/shifter/">Shifter</a>, the YUI component build
+tool.
+
+Shifter will automatically wrap your module code in a `YUI.add()` call along
+with any configuration info required for the module.
+
+@example
+
+    YUI.add('davglass', function (Y) {
+        Y.davglass = function () {
+            Y.log('Dav was here!');
+        };
+    }, '3.4.0', {
+        requires: ['harley-davidson', 'mt-dew']
+    });
+
+@method add
+@param {String} name Module name.
+@param {Function} fn Function containing module code. This function will be
+    executed whenever the module is attached to a specific YUI instance.
+
+    @param {YUI} fn.Y The YUI instance to which this module is attached.
+    @param {String} fn.name Name of the module
+
+@param {String} version Module version number. This is currently used only for
+    informational purposes, and is not used internally by YUI.
+
+@param {Object} [details] Module config.
+    @param {Array} [details.requires] Array of other module names that must be
+        attached before this module can be attached.
+    @param {Array} [details.optional] Array of optional module names that should
+        be attached before this module is attached if they've already been
+        loaded. If the `loadOptional` YUI option is `true`, optional modules
+        that have not yet been loaded will be loaded just as if they were hard
+        requirements.
+    @param {Array} [details.use] Array of module names that are included within
+        or otherwise provided by this module, and which should be attached
+        automatically when this module is attached. This makes it possible to
+        create "virtual rollup" modules that simply attach a collection of other
+        modules or submodules.
+
+@return {YUI} This YUI instance.
+**/
+    add: function(name, fn, version, details) {
+        details = details || {};
+        var env = YUI.Env,
+            mod = {
+                name: name,
+                fn: fn,
+                version: version,
+                details: details
+            },
+            //Instance hash so we don't apply it to the same instance twice
+            applied = {},
+            loader, inst, modInfo,
+            i, versions = env.versions;
+
+        env.mods[name] = mod;
+        versions[version] = versions[version] || {};
+        versions[version][name] = mod;
+
+        for (i in instances) {
+            if (instances.hasOwnProperty(i)) {
+                inst = instances[i];
+                if (!applied[inst.id]) {
+                    applied[inst.id] = true;
+                    loader = inst.Env._loader;
+                    if (loader) {
+                        modInfo = loader.getModuleInfo(name);
+                        if (!modInfo || modInfo.temp) {
+                            loader.addModule(details, name);
+                        }
+                    }
+                }
+            }
+        }
+
+        return this;
+    },
+
+    /**
+    Executes the callback function associated with each required module,
+    attaching the module to this YUI instance.
+
+    @method _attach
+    @param {Array} r The array of modules to attach
+    @param {Boolean} [moot=false] If `true`, don't throw a warning if the module
+        is not attached.
+    @private
+    **/
+    _attach: function(r, moot) {
+        var i, name, mod, details, req, use, after,
+            mods = YUI.Env.mods,
+            aliases = YUI.Env.aliases,
+            Y = this, j,
+            cache = YUI.Env._renderedMods,
+            loader = Y.Env._loader,
+            done = Y.Env._attached,
+            exported = Y.Env._exported,
+            len = r.length, loader, def, go,
+            c = [],
+            modArgs, esCompat, reqlen, modInfo,
+            condition,
+            __exports__, __imports__;
+
+        //Check for conditional modules (in a second+ instance) and add their requirements
+        //TODO I hate this entire method, it needs to be fixed ASAP (3.5.0) ^davglass
+        for (i = 0; i < len; i++) {
+            name = r[i];
+            mod = mods[name];
+            c.push(name);
+            if (loader && loader.conditions[name]) {
+                for (j in loader.conditions[name]) {
+                    if (loader.conditions[name].hasOwnProperty(j)) {
+                        def = loader.conditions[name][j];
+                        go = def && ((def.ua && Y.UA[def.ua]) || (def.test && def.test(Y)));
+                        if (go) {
+                            c.push(def.name);
+                        }
+                    }
+                }
+            }
+        }
+        r = c;
+        len = r.length;
+
+        for (i = 0; i < len; i++) {
+            if (!done[r[i]]) {
+                name = r[i];
+                mod = mods[name];
+
+                if (aliases && aliases[name] && !mod) {
+                    Y._attach(aliases[name]);
+                    continue;
+                }
+                if (!mod) {
+                    modInfo = loader && loader.getModuleInfo(name);
+                    if (modInfo) {
+                        mod = modInfo;
+                        moot = true;
+                    }
+
+                    // Y.log('no js def for: ' + name, 'info', 'yui');
+
+                    //if (!loader || !loader.moduleInfo[name]) {
+                    //if ((!loader || !loader.moduleInfo[name]) && !moot) {
+                    if (!moot && name) {
+                        if ((name.indexOf('skin-') === -1) && (name.indexOf('css') === -1)) {
+                            Y.Env._missed.push(name);
+                            Y.Env._missed = Y.Array.dedupe(Y.Env._missed);
+                            Y.message('NOT loaded: ' + name, 'warn', 'yui');
+                        }
+                    }
+                } else {
+                    done[name] = true;
+                    //Don't like this, but in case a mod was asked for once, then we fetch it
+                    //We need to remove it from the missed list ^davglass
+                    for (j = 0; j < Y.Env._missed.length; j++) {
+                        if (Y.Env._missed[j] === name) {
+                            Y.message('Found: ' + name + ' (was reported as missing earlier)', 'warn', 'yui');
+                            Y.Env._missed.splice(j, 1);
+                        }
+                    }
+
+                    // Optional dependencies normally work by modifying the
+                    // dependency list of a module. If the dependency's test
+                    // passes it is added to the list. If not, it's not loaded.
+                    // This following check ensures that optional dependencies
+                    // are not attached when they were already loaded into the
+                    // page (when bundling for example)
+                    if (loader && !loader._canBeAttached(name)) {
+                        Y.log('Failed to attach module ' + name, 'warn', 'yui');
+                        return true;
+                    }
+
+                    /*
+                        If it's a temp module, we need to redo it's requirements if it's already loaded
+                        since it may have been loaded by another instance and it's dependencies might
+                        have been redefined inside the fetched file.
+                    */
+                    if (loader && cache && cache[name] && cache[name].temp) {
+                        loader.getRequires(cache[name]);
+                        req = [];
+                        modInfo = loader.getModuleInfo(name);
+                        for (j in modInfo.expanded_map) {
+                            if (modInfo.expanded_map.hasOwnProperty(j)) {
+                                req.push(j);
+                            }
+                        }
+                        Y._attach(req);
+                    }
+
+                    details = mod.details;
+                    req = details.requires;
+                    esCompat = details.es;
+                    use = details.use;
+                    after = details.after;
+                    //Force Intl load if there is a language (Loader logic) @todo fix this shit
+                    if (details.lang) {
+                        req = req || [];
+                        req.unshift('intl');
+                    }
+
+                    if (req) {
+                        reqlen = req.length;
+                        for (j = 0; j < reqlen; j++) {
+                            if (!done[req[j]]) {
+                                if (!Y._attach(req)) {
+                                    return false;
+                                }
+                                break;
+                            }
+                        }
+                    }
+
+                    if (after) {
+                        for (j = 0; j < after.length; j++) {
+                            if (!done[after[j]]) {
+                                if (!Y._attach(after, true)) {
+                                    return false;
+                                }
+                                break;
+                            }
+                        }
+                    }
+
+                    if (mod.fn) {
+                        modArgs = [Y, name];
+                        if (esCompat) {
+                            __imports__ = {};
+                            __exports__ = {};
+                            // passing `exports` and `imports` onto the module function
+                            modArgs.push(__imports__, __exports__);
+                            if (req) {
+                                reqlen = req.length;
+                                for (j = 0; j < reqlen; j++) {
+                                    __imports__[req[j]] = exported.hasOwnProperty(req[j]) ? exported[req[j]] : Y;
+                                }
+                            }
+                        }
+                        if (Y.config.throwFail) {
+                            __exports__ = mod.fn.apply(esCompat ? undefined : mod, modArgs);
+                        } else {
+                            try {
+                                __exports__ = mod.fn.apply(esCompat ? undefined : mod, modArgs);
+                            } catch (e) {
+                                Y.error('Attach error: ' + name, e, name);
+                                return false;
+                            }
+                        }
+                        if (esCompat) {
+                            // store the `exports` in case others `es` modules requires it
+                            exported[name] = __exports__;
+
+                            // If an ES module is conditionally loaded and set
+                            // to be used "instead" another module, replace the
+                            // trigger module's content with the conditionally
+                            // loaded one so the values returned by require()
+                            // still makes sense
+                            condition = mod.details.condition;
+                            if (condition && condition.when === 'instead') {
+                                exported[condition.trigger] = __exports__;
+                            }
+                        }
+                    }
+
+                    if (use) {
+                        for (j = 0; j < use.length; j++) {
+                            if (!done[use[j]]) {
+                                if (!Y._attach(use)) {
+                                    return false;
+                                }
+                                break;
+                            }
+                        }
+                    }
+
+
+
+                }
+            }
+        }
+
+        return true;
+    },
+
+    /**
+    Delays the `use` callback until another event has taken place such as
+    `window.onload`, `domready`, `contentready`, or `available`.
+
+    @private
+    @method _delayCallback
+    @param {Function} cb The original `use` callback.
+    @param {String|Object} until Either an event name ('load', 'domready', etc.)
+        or an object containing event/args keys for contentready/available.
+    @return {Function}
+    **/
+    _delayCallback: function(cb, until) {
+
+        var Y = this,
+            mod = ['event-base'];
+
+        until = (Y.Lang.isObject(until) ? until : { event: until });
+
+        if (until.event === 'load') {
+            mod.push('event-synthetic');
+        }
+
+        Y.log('Delaying use callback until: ' + until.event, 'info', 'yui');
+        return function() {
+            Y.log('Use callback fired, waiting on delay', 'info', 'yui');
+            var args = arguments;
+            Y._use(mod, function() {
+                Y.log('Delayed use wrapper callback after dependencies', 'info', 'yui');
+                Y.on(until.event, function() {
+                    args[1].delayUntil = until.event;
+                    Y.log('Delayed use callback done after ' + until.event, 'info', 'yui');
+                    cb.apply(Y, args);
+                }, until.args);
+            });
+        };
+    },
+
+    /**
+    Attaches one or more modules to this YUI instance. When this is executed,
+    the requirements of the desired modules are analyzed, and one of several
+    things can happen:
+
+
+      * All required modules have already been loaded, and just need to be
+        attached to this YUI instance. In this case, the `use()` callback will
+        be executed synchronously after the modules are attached.
+
+      * One or more modules have not yet been loaded, or the Get utility is not
+        available, or the `bootstrap` config option is `false`. In this case,
+        a warning is issued indicating that modules are missing, but all
+        available modules will still be attached and the `use()` callback will
+        be executed synchronously.
+
+      * One or more modules are missing and the Loader is not available but the
+        Get utility is, and `bootstrap` is not `false`. In this case, the Get
+        utility will be used to load the Loader, and we will then proceed to
+        the following state:
+
+      * One or more modules are missing and the Loader is available. In this
+        case, the Loader will be used to resolve the dependency tree for the
+        missing modules and load them and their dependencies. When the Loader is
+        finished loading modules, the `use()` callback will be executed
+        asynchronously.
+
+    @example
+
+        // Loads and attaches dd and its dependencies.
+        YUI().use('dd', function (Y) {
+            // ...
+        });
+
+        // Loads and attaches dd and node as well as all of their dependencies.
+        YUI().use(['dd', 'node'], function (Y) {
+            // ...
+        });
+
+        // Attaches all modules that have already been loaded.
+        YUI().use('*', function (Y) {
+            // ...
+        });
+
+        // Attaches a gallery module.
+        YUI().use('gallery-yql', function (Y) {
+            // ...
+        });
+
+        // Attaches a YUI 2in3 module.
+        YUI().use('yui2-datatable', function (Y) {
+            // ...
+        });
+
+    @method use
+    @param {String|Array} modules* One or more module names to attach.
+    @param {Function} [callback] Callback function to be executed once all
+        specified modules and their dependencies have been attached.
+    @param {YUI} callback.Y The YUI instance created for this sandbox.
+    @param {Object} callback.status Object containing `success`, `msg` and
+        `data` properties.
+    @chainable
+    **/
+    use: function() {
+        var args = SLICE.call(arguments, 0),
+            callback = args[args.length - 1],
+            Y = this,
+            i = 0,
+            name,
+            Env = Y.Env,
+            provisioned = true;
+
+        // The last argument supplied to use can be a load complete callback
+        if (Y.Lang.isFunction(callback)) {
+            args.pop();
+            if (Y.config.delayUntil) {
+                callback = Y._delayCallback(callback, Y.config.delayUntil);
+            }
+        } else {
+            callback = null;
+        }
+        if (Y.Lang.isArray(args[0])) {
+            args = args[0];
+        }
+
+        if (Y.config.cacheUse) {
+            while ((name = args[i++])) {
+                if (!Env._attached[name]) {
+                    provisioned = false;
+                    break;
+                }
+            }
+
+            if (provisioned) {
+                if (args.length) {
+                    Y.log('already provisioned: ' + args, 'info', 'yui');
+                }
+                Y._notify(callback, ALREADY_DONE, args);
+                return Y;
+            }
+        }
+
+        if (Y._loading) {
+            Y._useQueue = Y._useQueue || new Y.Queue();
+            Y._useQueue.add([args, callback]);
+        } else {
+            Y._use(args, function(Y, response) {
+                Y._notify(callback, response, args);
+            });
+        }
+
+        return Y;
+    },
+
+    /**
+    Sugar for loading both legacy and ES6-based YUI modules.
+
+    @method require
+    @param {String} [modules*] List of module names to import or a single
+        module name.
+    @param {Function} callback Callback that gets called once all the modules
+        were loaded. Each parameter of the callback is the export value of the
+        corresponding module in the list. If the module is a legacy YUI module,
+        the YUI instance is used instead of the module exports.
+    @example
+    ```
+    YUI().require(['es6-set'], function (Y, imports) {
+        var Set = imports.Set,
+            set = new Set();
+    });
+    ```
+    **/
+    require: function () {
+        var args = SLICE.call(arguments),
+            callback;
+
+        if (typeof args[args.length - 1] === 'function') {
+            callback = args.pop();
+
+            // only add the callback if one was provided
+            // YUI().require('foo'); is valid
+            args.push(function (Y) {
+                var i, length = args.length,
+                    exported = Y.Env._exported,
+                    __imports__ = {};
+
+                // Get only the imports requested as arguments
+                for (i = 0; i < length; i++) {
+                    if (exported.hasOwnProperty(args[i])) {
+                        __imports__[args[i]] = exported[args[i]];
+                    }
+                }
+
+                // Using `undefined` because:
+                // - Using `Y.config.global` would force the value of `this` to be
+                //   the global object even in strict mode
+                // - Using `Y` goes against the goal of moving away from a shared
+                //   object and start thinking in terms of imported and exported
+                //   objects
+                callback.call(undefined, Y, __imports__);
+            });
+        }
+        // Do not return the Y object. This makes it hard to follow this
+        // traditional pattern:
+        //   var Y = YUI().use(...);
+        // This is a good idea in the light of ES6 modules, to avoid working
+        // in the global scope.
+        // This also leaves the door open for returning a promise, once the
+        // YUI loader is based on the ES6 loader which uses
+        // loader.import(...).then(...)
+        this.use.apply(this, args);
+    },
+
+    /**
+    Handles Loader notifications about attachment/load errors.
+
+    @method _notify
+    @param {Function} callback Callback to pass to `Y.config.loadErrorFn`.
+    @param {Object} response Response returned from Loader.
+    @param {Array} args Arguments passed from Loader.
+    @private
+    **/
+    _notify: function(callback, response, args) {
+        if (!response.success && this.config.loadErrorFn) {
+            this.config.loadErrorFn.call(this, this, callback, response, args);
+        } else if (callback) {
+            if (this.Env._missed && this.Env._missed.length) {
+                response.msg = 'Missing modules: ' + this.Env._missed.join();
+                response.success = false;
+            }
+            if (this.config.throwFail) {
+                callback(this, response);
+            } else {
+                try {
+                    callback(this, response);
+                } catch (e) {
+                    this.error('use callback error', e, args);
+                }
+            }
+        }
+    },
+
+    /**
+    Called from the `use` method queue to ensure that only one set of loading
+    logic is performed at a time.
+
+    @method _use
+    @param {String} args* One or more modules to attach.
+    @param {Function} [callback] Function to call once all required modules have
+        been attached.
+    @private
+    **/
+    _use: function(args, callback) {
+
+        if (!this.Array) {
+            this._attach(['yui-base']);
+        }
+
+        var len, loader, handleBoot,
+            Y = this,
+            G_ENV = YUI.Env,
+            mods = G_ENV.mods,
+            Env = Y.Env,
+            used = Env._used,
+            aliases = G_ENV.aliases,
+            queue = G_ENV._loaderQueue,
+            firstArg = args[0],
+            YArray = Y.Array,
+            config = Y.config,
+            boot = config.bootstrap,
+            missing = [],
+            i,
+            r = [],
+            ret = true,
+            fetchCSS = config.fetchCSS,
+            process = function(names, skip) {
+
+                var i = 0, a = [], name, len, m, req, use;
+
+                if (!names.length) {
+                    return;
+                }
+
+                if (aliases) {
+                    len = names.length;
+                    for (i = 0; i < len; i++) {
+                        if (aliases[names[i]] && !mods[names[i]]) {
+                            a = [].concat(a, aliases[names[i]]);
+                        } else {
+                            a.push(names[i]);
+                        }
+                    }
+                    names = a;
+                }
+
+                len = names.length;
+
+                for (i = 0; i < len; i++) {
+                    name = names[i];
+                    if (!skip) {
+                        r.push(name);
+                    }
+
+                    // only attach a module once
+                    if (used[name]) {
+                        continue;
+                    }
+
+                    m = mods[name];
+                    req = null;
+                    use = null;
+
+                    if (m) {
+                        used[name] = true;
+                        req = m.details.requires;
+                        use = m.details.use;
+                    } else {
+                        // CSS files don't register themselves, see if it has
+                        // been loaded
+                        if (!G_ENV._loaded[VERSION][name]) {
+                            missing.push(name);
+                        } else {
+                            used[name] = true; // probably css
+                        }
+                    }
+
+                    // make sure requirements are attached
+                    if (req && req.length) {
+                        process(req);
+                    }
+
+                    // make sure we grab the submodule dependencies too
+                    if (use && use.length) {
+                        process(use, 1);
+                    }
+                }
+
+            },
+
+            handleLoader = function(fromLoader) {
+                var response = fromLoader || {
+                        success: true,
+                        msg: 'not dynamic'
+                    },
+                    redo, origMissing,
+                    ret = true,
+                    data = response.data;
+
+                Y._loading = false;
+
+                if (data) {
+                    origMissing = missing;
+                    missing = [];
+                    r = [];
+                    process(data);
+                    redo = missing.length;
+                    if (redo) {
+                        if ([].concat(missing).sort().join() ==
+                                origMissing.sort().join()) {
+                            redo = false;
+                        }
+                    }
+                }
+
+                if (redo && data) {
+                    Y._loading = true;
+                    Y._use(missing, function() {
+                        Y.log('Nested use callback: ' + data, 'info', 'yui');
+                        if (Y._attach(data)) {
+                            Y._notify(callback, response, data);
+                        }
+                    });
+                } else {
+                    if (data) {
+                        // Y.log('attaching from loader: ' + data, 'info', 'yui');
+                        ret = Y._attach(data);
+                    }
+                    if (ret) {
+                        Y._notify(callback, response, args);
+                    }
+                }
+
+                if (Y._useQueue && Y._useQueue.size() && !Y._loading) {
+                    Y._use.apply(Y, Y._useQueue.next());
+                }
+
+            };
+
+// Y.log(Y.id + ': use called: ' + a + ' :: ' + callback, 'info', 'yui');
+
+        // YUI().use('*'); // bind everything available
+        if (firstArg === '*') {
+            args = [];
+            for (i in mods) {
+                if (mods.hasOwnProperty(i)) {
+                    args.push(i);
+                }
+            }
+            ret = Y._attach(args);
+            if (ret) {
+                handleLoader();
+            }
+            return Y;
+        }
+
+        if ((mods.loader || mods['loader-base']) && !Y.Loader) {
+            Y.log('Loader was found in meta, but it is not attached. Attaching..', 'info', 'yui');
+            Y._attach(['loader' + ((!mods.loader) ? '-base' : '')]);
+        }
+
+        // Y.log('before loader requirements: ' + args, 'info', 'yui');
+
+        // use loader to expand dependencies and sort the
+        // requirements if it is available.
+        if (boot && Y.Loader && args.length) {
+            Y.log('Using loader to expand dependencies', 'info', 'yui');
+            loader = getLoader(Y);
+            loader.require(args);
+            loader.ignoreRegistered = true;
+            loader._boot = true;
+            loader.calculate(null, (fetchCSS) ? null : 'js');
+            args = loader.sorted;
+            loader._boot = false;
+        }
+
+        process(args);
+
+        len = missing.length;
+
+
+        if (len) {
+            missing = YArray.dedupe(missing);
+            len = missing.length;
+Y.log('Modules missing: ' + missing + ', ' + missing.length, 'info', 'yui');
+        }
+
+
+        // dynamic load
+        if (boot && len && Y.Loader) {
+// Y.log('Using loader to fetch missing deps: ' + missing, 'info', 'yui');
+            Y.log('Using Loader', 'info', 'yui');
+            Y._loading = true;
+            loader = getLoader(Y);
+            loader.onEnd = handleLoader;
+            loader.context = Y;
+            loader.data = args;
+            loader.ignoreRegistered = false;
+            loader.require(missing);
+            loader.insert(null, (fetchCSS) ? null : 'js');
+
+        } else if (boot && len && Y.Get && !Env.bootstrapped) {
+
+            Y._loading = true;
+
+            handleBoot = function() {
+                Y._loading = false;
+                queue.running = false;
+                Env.bootstrapped = true;
+                G_ENV._bootstrapping = false;
+                if (Y._attach(['loader'])) {
+                    Y._use(args, callback);
+                }
+            };
+
+            if (G_ENV._bootstrapping) {
+Y.log('Waiting for loader', 'info', 'yui');
+                queue.add(handleBoot);
+            } else {
+                G_ENV._bootstrapping = true;
+Y.log('Fetching loader: ' + config.base + config.loaderPath, 'info', 'yui');
+                Y.Get.script(config.base + config.loaderPath, {
+                    onEnd: handleBoot
+                });
+            }
+
+        } else {
+            Y.log('Attaching available dependencies: ' + args, 'info', 'yui');
+            ret = Y._attach(args);
+            if (ret) {
+                handleLoader();
+            }
+        }
+
+        return Y;
+    },
+
+
+    /**
+    Utility method for safely creating namespaces if they don't already exist.
+    May be called statically on the YUI global object or as a method on a YUI
+    instance.
+
+    When called statically, a namespace will be created on the YUI global
+    object:
+
+        // Create `YUI.your.namespace.here` as nested objects, preserving any
+        // objects that already exist instead of overwriting them.
+        YUI.namespace('your.namespace.here');
+
+    When called as a method on a YUI instance, a namespace will be created on
+    that instance:
+
+        // Creates `Y.property.package`.
+        Y.namespace('property.package');
+
+    Dots in the input string cause `namespace` to create nested objects for each
+    token. If any part of the requested namespace already exists, the current
+    object will be left in place and will not be overwritten. This allows
+    multiple calls to `namespace` to preserve existing namespaced properties.
+
+    If the first token in the namespace string is "YAHOO", that token is
+    discarded. This is legacy behavior for backwards compatibility with YUI 2.
+
+    Be careful with namespace tokens. Reserved words may work in some browsers
+    and not others. For instance, the following will fail in some browsers
+    because the supported version of JavaScript reserves the word "long":
+
+        Y.namespace('really.long.nested.namespace');
+
+    Note: If you pass multiple arguments to create multiple namespaces, only the
+    last one created is returned from this function.
+
+    @method namespace
+    @param {String} namespace* One or more namespaces to create.
+    @return {Object} Reference to the last namespace object created.
+    **/
+    namespace: function() {
+        var a = arguments, o, i = 0, j, d, arg;
+
+        for (; i < a.length; i++) {
+            o = this; //Reset base object per argument or it will get reused from the last
+            arg = a[i];
+            if (arg.indexOf(PERIOD) > -1) { //Skip this if no "." is present
+                d = arg.split(PERIOD);
+                for (j = (d[0] == 'YAHOO') ? 1 : 0; j < d.length; j++) {
+                    o[d[j]] = o[d[j]] || {};
+                    o = o[d[j]];
+                }
+            } else {
+                o[arg] = o[arg] || {};
+                o = o[arg]; //Reset base object to the new object so it's returned
+            }
+        }
+        return o;
+    },
+
+    // this is replaced if the log module is included
+    log: NOOP,
+    message: NOOP,
+    // this is replaced if the dump module is included
+    dump: function (o) { return ''+o; },
+
+    /**
+    Reports an error.
+
+    The reporting mechanism is controlled by the `throwFail` configuration
+    attribute. If `throwFail` is falsy, the message is logged. If `throwFail` is
+    truthy, a JS exception is thrown.
+
+    If an `errorFn` is specified in the config it must return `true` to indicate
+    that the exception was handled and keep it from being thrown.
+
+    @method error
+    @param {String} msg Error message.
+    @param {Error|String} [e] JavaScript error object or an error string.
+    @param {String} [src] Source of the error (such as the name of the module in
+        which the error occurred).
+    @chainable
+    **/
+    error: function(msg, e, src) {
+        //TODO Add check for window.onerror here
+
+        var Y = this, ret;
+
+        if (Y.config.errorFn) {
+            ret = Y.config.errorFn.apply(Y, arguments);
+        }
+
+        if (!ret) {
+            throw (e || new Error(msg));
+        } else {
+            Y.message(msg, 'error', ''+src); // don't scrub this one
+        }
+
+        return Y;
+    },
+
+    /**
+    Generates an id string that is unique among all YUI instances in this
+    execution context.
+
+    @method guid
+    @param {String} [pre] Prefix.
+    @return {String} Unique id.
+    **/
+    guid: function(pre) {
+        var id = this.Env._guidp + '_' + (++this.Env._uidx);
+        return (pre) ? (pre + id) : id;
+    },
+
+    /**
+    Returns a unique id associated with the given object and (if *readOnly* is
+    falsy) stamps the object with that id so it can be identified in the future.
+
+    Stamping an object involves adding a `_yuid` property to it that contains
+    the object's id. One exception to this is that in Internet Explorer, DOM
+    nodes have a `uniqueID` property that contains a browser-generated unique
+    id, which will be used instead of a YUI-generated id when available.
+
+    @method stamp
+    @param {Object} o Object to stamp.
+    @param {Boolean} readOnly If truthy and the given object has not already
+        been stamped, the object will not be modified and `null` will be
+        returned.
+    @return {String} Object's unique id, or `null` if *readOnly* was truthy and
+        the given object was not already stamped.
+    **/
+    stamp: function(o, readOnly) {
+        var uid;
+        if (!o) {
+            return o;
+        }
+
+        // IE generates its own unique ID for dom nodes
+        // The uniqueID property of a document node returns a new ID
+        if (o.uniqueID && o.nodeType && o.nodeType !== 9) {
+            uid = o.uniqueID;
+        } else {
+            uid = (typeof o === 'string') ? o : o._yuid;
+        }
+
+        if (!uid) {
+            uid = this.guid();
+            if (!readOnly) {
+                try {
+                    o._yuid = uid;
+                } catch (e) {
+                    uid = null;
+                }
+            }
+        }
+        return uid;
+    },
+
+    /**
+    Destroys this YUI instance.
+
+    @method destroy
+    @since 3.3.0
+    **/
+    destroy: function() {
+        var Y = this;
+        if (Y.Event) {
+            Y.Event._unload();
+        }
+        delete instances[Y.id];
+        delete Y.Env;
+        delete Y.config;
+    }
+
+    /**
+    Safe `instanceof` wrapper that works around a memory leak in IE when the
+    object being tested is `window` or `document`.
+
+    Unless you are testing objects that may be `window` or `document`, you
+    should use the native `instanceof` operator instead of this method.
+
+    @method instanceOf
+    @param {Object} o Object to check.
+    @param {Object} type Class to check against.
+    @since 3.3.0
+    **/
+};
+
+    YUI.prototype = proto;
+
+    // inheritance utilities are not available yet
+    for (prop in proto) {
+        if (proto.hasOwnProperty(prop)) {
+            YUI[prop] = proto[prop];
+        }
+    }
+
+    /**
+    Applies a configuration to all YUI instances in this execution context.
+
+    The main use case for this method is in "mashups" where several third-party
+    scripts need to write to a global YUI config, but cannot share a single
+    centrally-managed config object. This way they can all call
+    `YUI.applyConfig({})` instead of overwriting the single global config.
+
+    @example
+
+        YUI.applyConfig({
+            modules: {
+                davglass: {
+                    fullpath: './davglass.js'
+                }
+            }
+        });
+
+        YUI.applyConfig({
+            modules: {
+                foo: {
+                    fullpath: './foo.js'
+                }
+            }
+        });
+
+        YUI().use('davglass', function (Y) {
+            // Module davglass will be available here.
+        });
+
+    @method applyConfig
+    @param {Object} o Configuration object to apply.
+    @static
+    @since 3.5.0
+    **/
+    YUI.applyConfig = function(o) {
+        if (!o) {
+            return;
+        }
+        //If there is a GlobalConfig, apply it first to set the defaults
+        if (YUI.GlobalConfig) {
+            this.prototype.applyConfig.call(this, YUI.GlobalConfig);
+        }
+        //Apply this config to it
+        this.prototype.applyConfig.call(this, o);
+        //Reset GlobalConfig to the combined config
+        YUI.GlobalConfig = this.config;
+    };
+
+    // set up the environment
+    YUI._init();
+
+    if (hasWin) {
+        add(doc, 'DOMContentLoaded', handleReady);
+
+        // add a window load event at load time so we can capture
+        // the case where it fires before dynamic loading is
+        // complete.
+        add(window, 'load', handleLoad);
+    } else {
+        handleReady();
+        handleLoad();
+    }
+
+    YUI.Env.add = add;
+    YUI.Env.remove = remove;
+
+    /*global exports*/
+    // Support the CommonJS method for exporting our single global
+    if (typeof exports == 'object') {
+        exports.YUI = YUI;
+        /**
+        * Set a method to be called when `Get.script` is called in Node.js
+        * `Get` will open the file, then pass it's content and it's path
+        * to this method before attaching it. Commonly used for code coverage
+        * instrumentation. <strong>Calling this multiple times will only
+        * attach the last hook method</strong>. This method is only
+        * available in Node.js.
+        * @method setLoadHook
+        * @static
+        * @param {Function} fn The function to set
+        * @param {String} fn.data The content of the file
+        * @param {String} fn.path The file path of the file
+        */
+        YUI.setLoadHook = function(fn) {
+            YUI._getLoadHook = fn;
+        };
+        /**
+        * Load hook for `Y.Get.script` in Node.js, see `YUI.setLoadHook`
+        * @method _getLoadHook
+        * @private
+        * @param {String} data The content of the file
+        * @param {String} path The file path of the file
+        */
+        YUI._getLoadHook = null;
+    }
+
+    YUI.Env[VERSION] = {};
+}());
+
+
+/**
+Config object that contains all of the configuration options for
+this `YUI` instance.
+
+This object is supplied by the implementer when instantiating YUI. Some
+properties have default values if they are not supplied by the implementer.
+
+This object should not be updated directly because some values are cached. Use
+`applyConfig()` to update the config object on a YUI instance that has already
+been configured.
+
+@class config
+@static
+**/
+
+/**
+If `true` (the default), YUI will "bootstrap" the YUI Loader and module metadata
+if they're needed to load additional dependencies and aren't already available.
+
+Setting this to `false` will prevent YUI from automatically loading the Loader
+and module metadata, so you will need to manually ensure that they're available
+or handle dependency resolution yourself.
+
+@property {Boolean} bootstrap
+@default true
+**/
+
+/**
+If `true`, `Y.log()` messages will be written to the browser's debug console
+when available and when `useBrowserConsole` is also `true`.
+
+@property {Boolean} debug
+@default true
+**/
+
+/**
+Log messages to the browser console if `debug` is `true` and the browser has a
+supported console.
+
+@property {Boolean} useBrowserConsole
+@default true
+**/
+
+/**
+A hash of log sources that should be logged. If specified, only messages from
+these sources will be logged. Others will be discarded.
+
+@property {Object} logInclude
+@type object
+**/
+
+/**
+A hash of log sources that should be not be logged. If specified, all sources
+will be logged *except* those on this list.
+
+@property {Object} logExclude
+**/
+
+/**
+When the YUI seed file is dynamically loaded after the `window.onload` event has
+fired, set this to `true` to tell YUI that it shouldn't wait for `window.onload`
+to occur.
+
+This ensures that components that rely on `window.onload` and the `domready`
+custom event will work as expected even when YUI is dynamically injected.
+
+@property {Boolean} injected
+@default false
+**/
+
+/**
+If `true`, `Y.error()` will generate or re-throw a JavaScript error. Otherwise,
+errors are merely logged silently.
+
+@property {Boolean} throwFail
+@default true
+**/
+
+/**
+Reference to the global object for this execution context.
+
+In a browser, this is the current `window` object. In Node.js, this is the
+Node.js `global` object.
+
+@property {Object} global
+**/
+
+/**
+The browser window or frame that this YUI instance should operate in.
+
+When running in Node.js, this property is `undefined`, since there is no
+`window` object. Use `global` to get a reference to the global object that will
+work in both browsers and Node.js.
+
+@property {Window} win
+**/
+
+/**
+The browser `document` object associated with this YUI instance's `win` object.
+
+When running in Node.js, this property is `undefined`, since there is no
+`document` object.
+
+@property {Document} doc
+**/
+
+/**
+A list of modules that defines the YUI core (overrides the default list).
+
+@property {Array} core
+@type Array
+@default ['get', 'features', 'intl-base', 'yui-log', 'yui-later', 'loader-base', 'loader-rollup', 'loader-yui3']
+**/
+
+/**
+A list of languages to use in order of preference.
+
+This list is matched against the list of available languages in modules that the
+YUI instance uses to determine the best possible localization of language
+sensitive modules.
+
+Languages are represented using BCP 47 language tags, such as "en-GB" for
+English as used in the United Kingdom, or "zh-Hans-CN" for simplified Chinese as
+used in China. The list may be provided as a comma-separated string or as an
+array.
+
+@property {String|String[]} lang
+**/
+
+/**
+Default date format.
+
+@property {String} dateFormat
+@deprecated Use configuration in `DataType.Date.format()` instead.
+**/
+
+/**
+Default locale.
+
+@property {String} locale
+@deprecated Use `config.lang` instead.
+**/
+
+/**
+Default generic polling interval in milliseconds.
+
+@property {Number} pollInterval
+@default 20
+**/
+
+/**
+The number of dynamic `<script>` nodes to insert by default before automatically
+removing them when loading scripts.
+
+This applies only to script nodes because removing the node will not make the
+evaluated script unavailable. Dynamic CSS nodes are not auto purged, because
+removing a linked style sheet will also remove the style definitions.
+
+@property {Number} purgethreshold
+@default 20
+**/
+
+/**
+Delay in milliseconds to wait after a window `resize` event before firing the
+event. If another `resize` event occurs before this delay has elapsed, the
+delay will start over to ensure that `resize` events are throttled.
+
+@property {Number} windowResizeDelay
+@default 40
+**/
+
+/**
+Base directory for dynamic loading.
+
+@property {String} base
+**/
+
+/**
+Base URL for a dynamic combo handler. This will be used to make combo-handled
+module requests if `combine` is set to `true.
+
+@property {String} comboBase
+@default "http://yui.yahooapis.com/combo?"
+**/
+
+/**
+Root path to prepend to each module path when creating a combo-handled request.
+
+This is updated for each YUI release to point to a specific version of the
+library; for example: "3.8.0/build/".
+
+@property {String} root
+**/
+
+/**
+Filter to apply to module urls. This filter will modify the default path for all
+modules.
+
+The default path for the YUI library is the minified version of the files (e.g.,
+event-min.js). The filter property can be a predefined filter or a custom
+filter. The valid predefined filters are:
+
+  - **debug**: Loads debug versions of modules (e.g., event-debug.js).
+  - **raw**: Loads raw, non-minified versions of modules without debug logging
+    (e.g., event.js).
+
+You can also define a custom filter, which must be an object literal containing
+a search regular expression and a replacement string:
+
+    myFilter: {
+        searchExp : "-min\\.js",
+        replaceStr: "-debug.js"
+    }
+
+@property {Object|String} filter
+**/
+
+/**
+Skin configuration and customizations.
+
+@property {Object} skin
+@param {String} [skin.defaultSkin='sam'] Default skin name. This skin will be
+    applied automatically to skinnable components if not overridden by a
+    component-specific skin name.
+@param {String} [skin.base='assets/skins/'] Default base path for a skin,
+    relative to Loader's `base` path.
+@param {Object} [skin.overrides] Component-specific skin name overrides. Specify
+    a component name as the key and, as the value, a string or array of strings
+    for a skin or skins that should be loaded for that component instead of the
+    `defaultSkin`.
+**/
+
+/**
+Hash of per-component filter specifications. If specified for a given component,
+this overrides the global `filter` config.
+
+@example
+    YUI({
+        modules: {
+            'foo': './foo.js',
+            'bar': './bar.js',
+            'baz': './baz.js'
+        },
+        filters: {
+            'foo': {
+                searchExp: '.js',
+                replaceStr: '-coverage.js'
+            }
+        }
+    }).use('foo', 'bar', 'baz', function (Y) {
+        // foo-coverage.js is loaded
+        // bar.js is loaded
+        // baz.js is loaded
+    });
+
+@property {Object} filters
+**/
+
+/**
+If `true`, YUI will use a combo handler to load multiple modules in as few
+requests as possible.
+
+The YUI CDN (which YUI uses by default) supports combo handling, but other
+servers may not. If the server from which you're loading YUI does not support
+combo handling, set this to `false`.
+
+Providing a value for the `base` config property will cause `combine` to default
+to `false` instead of `true`.
+
+@property {Boolean} combine
+@default true
+*/
+
+/**
+Array of module names that should never be dynamically loaded.
+
+@property {String[]} ignore
+**/
+
+/**
+Array of module names that should always be loaded when required, even if
+already present on the page.
+
+@property {String[]} force
+**/
+
+/**
+DOM element or id that should be used as the insertion point for dynamically
+added `<script>` and `<link>` nodes.
+
+@property {HTMLElement|String} insertBefore
+**/
+
+/**
+Object hash containing attributes to add to dynamically added `<script>` nodes.
+
+@property {Object} jsAttributes
+**/
+
+/**
+Object hash containing attributes to add to dynamically added `<link>` nodes.
+
+@property {Object} cssAttributes
+**/
+
+/**
+Timeout in milliseconds before a dynamic JS or CSS request will be considered a
+failure. If not set, no timeout will be enforced.
+
+@property {Number} timeout
+**/
+
+/**
+A hash of module definitions to add to the list of available YUI modules. These
+modules can then be dynamically loaded via the `use()` method.
+
+This is a hash in which keys are module names and values are objects containing
+module metadata.
+
+See `Loader.addModule()` for the supported module metadata fields. Also see
+`groups`, which provides a way to configure the base and combo spec for a set of
+modules.
+
+@example
+
+    modules: {
+        mymod1: {
+            requires: ['node'],
+            fullpath: '/mymod1/mymod1.js'
+        },
+
+        mymod2: {
+            requires: ['mymod1'],
+            fullpath: '/mymod2/mymod2.js'
+        },
+
+        mymod3: '/js/mymod3.js',
+        mycssmod: '/css/mycssmod.css'
+    }
+
+@property {Object} modules
+**/
+
+/**
+Aliases are dynamic groups of modules that can be used as shortcuts.
+
+@example
+
+    YUI({
+        aliases: {
+            davglass: [ 'node', 'yql', 'dd' ],
+            mine: [ 'davglass', 'autocomplete']
+        }
+    }).use('mine', function (Y) {
+        // Node, YQL, DD & AutoComplete available here.
+    });
+
+@property {Object} aliases
+**/
+
+/**
+A hash of module group definitions.
+
+For each group you can specify a list of modules and the base path and
+combo spec to use when dynamically loading the modules.
+
+@example
+
+    groups: {
+        yui2: {
+            // specify whether or not this group has a combo service
+            combine: true,
+
+            // The comboSeperator to use with this group's combo handler
+            comboSep: ';',
+
+            // The maxURLLength for this server
+            maxURLLength: 500,
+
+            // the base path for non-combo paths
+            base: 'http://yui.yahooapis.com/2.8.0r4/build/',
+
+            // the path to the combo service
+            comboBase: 'http://yui.yahooapis.com/combo?',
+
+            // a fragment to prepend to the path attribute when
+            // when building combo urls
+            root: '2.8.0r4/build/',
+
+            // the module definitions
+            modules:  {
+                yui2_yde: {
+                    path: "yahoo-dom-event/yahoo-dom-event.js"
+                },
+                yui2_anim: {
+                    path: "animation/animation.js",
+                    requires: ['yui2_yde']
+                }
+            }
+        }
+    }
+
+@property {Object} groups
+**/
+
+/**
+Path to the Loader JS file, relative to the `base` path.
+
+This is used to dynamically bootstrap the Loader when it's needed and isn't yet
+available.
+
+@property {String} loaderPath
+@default "loader/loader-min.js"
+**/
+
+/**
+If `true`, YUI will attempt to load CSS dependencies and skins. Set this to
+`false` to prevent YUI from loading any CSS, or set it to the string `"force"`
+to force CSS dependencies to be loaded even if their associated JS modules are
+already loaded.
+
+@property {Boolean|String} fetchCSS
+@default true
+**/
+
+/**
+Default gallery version used to build gallery module urls.
+
+@property {String} gallery
+@since 3.1.0
+**/
+
+/**
+Default YUI 2 version used to build YUI 2 module urls.
+
+This is used for intrinsic YUI 2 support via the 2in3 project. Also see the
+`2in3` config for pulling different revisions of the wrapped YUI 2 modules.
+
+@property {String} yui2
+@default "2.9.0"
+@since 3.1.0
+**/
+
+/**
+Revision number of YUI 2in3 modules that should be used when loading YUI 2in3.
+
+@property {String} 2in3
+@default "4"
+@since 3.1.0
+**/
+
+/**
+Alternate console log function that should be used in environments without a
+supported native console. This function is executed with the YUI instance as its
+`this` object.
+
+@property {Function} logFn
+@since 3.1.0
+**/
+
+/**
+The minimum log level to log messages for. Log levels are defined
+incrementally. Messages greater than or equal to the level specified will
+be shown. All others will be discarded. The order of log levels in
+increasing priority is:
+
+    debug
+    info
+    warn
+    error
+
+@property {String} logLevel
+@default 'debug'
+@since 3.10.0
+**/
+
+/**
+Callback to execute when `Y.error()` is called. It receives the error message
+and a JavaScript error object if one was provided.
+
+This function is executed with the YUI instance as its `this` object.
+
+Returning `true` from this function will prevent an exception from being thrown.
+
+@property {Function} errorFn
+@param {String} errorFn.msg Error message
+@param {Object} [errorFn.err] Error object (if one was provided).
+@since 3.2.0
+**/
+
+/**
+A callback to execute when Loader fails to load one or more resources.
+
+This could be because of a script load failure. It could also be because a
+module fails to register itself when the `requireRegistration` config is `true`.
+
+If this function is defined, the `use()` callback will only be called when the
+loader succeeds. Otherwise, `use()` will always executes unless there was a
+JavaScript error when attaching a module.
+
+@property {Function} loadErrorFn
+@since 3.3.0
+**/
+
+/**
+If `true`, Loader will expect all loaded scripts to be first-class YUI modules
+that register themselves with the YUI global, and will trigger a failure if a
+loaded script does not register a YUI module.
+
+@property {Boolean} requireRegistration
+@default false
+@since 3.3.0
+**/
+
+/**
+Cache serviced use() requests.
+
+@property {Boolean} cacheUse
+@default true
+@since 3.3.0
+@deprecated No longer used.
+**/
+
+/**
+Whether or not YUI should use native ES5 functionality when available for
+features like `Y.Array.each()`, `Y.Object()`, etc.
+
+When `false`, YUI will always use its own fallback implementations instead of
+relying on ES5 functionality, even when ES5 functionality is available.
+
+@property {Boolean} useNativeES5
+@default true
+@since 3.5.0
+**/
+
+/**
+ * Leverage native JSON stringify if the browser has a native
+ * implementation.  In general, this is a good idea.  See the Known Issues
+ * section in the JSON user guide for caveats.  The default value is true
+ * for browsers with native JSON support.
+ *
+ * @property useNativeJSONStringify
+ * @type Boolean
+ * @default true
+ * @since 3.8.0
+ */
+
+ /**
+ * Leverage native JSON parse if the browser has a native implementation.
+ * In general, this is a good idea.  See the Known Issues section in the
+ * JSON user guide for caveats.  The default value is true for browsers with
+ * native JSON support.
+ *
+ * @property useNativeJSONParse
+ * @type Boolean
+ * @default true
+ * @since 3.8.0
+ */
+
+/**
+Delay the `use` callback until a specific event has passed (`load`, `domready`, `contentready` or `available`)
+
+@property {Object|String} delayUntil
+@since 3.6.0
+@example
+
+You can use `load` or `domready` strings by default:
+
+    YUI({
+        delayUntil: 'domready'
+    }, function (Y) {
+        // This will not execute until 'domeready' occurs.
+    });
+
+Or you can delay until a node is available (with `available` or `contentready`):
+
+    YUI({
+        delayUntil: {
+            event: 'available',
+            args : '#foo'
+        }
+    }, function (Y) {
+        // This will not execute until a node matching the selector "#foo" is
+        // available in the DOM.
+    });
+
+**/
+YUI.add('yui-base', function (Y, NAME) {
+
+/*
+ * YUI stub
+ * @module yui
+ * @submodule yui-base
+ */
+/**
+ * The YUI module contains the components required for building the YUI
+ * seed file.  This includes the script loading mechanism, a simple queue,
+ * and the core utilities for the library.
+ * @module yui
+ * @submodule yui-base
+ */
+
+/**
+ * Provides core language utilites and extensions used throughout YUI.
+ *
+ * @class Lang
+ * @static
+ */
+
+var L = Y.Lang || (Y.Lang = {}),
+
+STRING_PROTO = String.prototype,
+TOSTRING     = Object.prototype.toString,
+
+TYPES = {
+    'undefined'        : 'undefined',
+    'number'           : 'number',
+    'boolean'          : 'boolean',
+    'string'           : 'string',
+    '[object Function]': 'function',
+    '[object RegExp]'  : 'regexp',
+    '[object Array]'   : 'array',
+    '[object Date]'    : 'date',
+    '[object Error]'   : 'error'
+},
+
+SUBREGEX         = /\{\s*([^|}]+?)\s*(?:\|([^}]*))?\s*\}/g,
+
+WHITESPACE       = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF",
+WHITESPACE_CLASS = "[\x09-\x0D\x20\xA0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]+",
+TRIM_LEFT_REGEX  = new RegExp("^" + WHITESPACE_CLASS),
+TRIM_RIGHT_REGEX = new RegExp(WHITESPACE_CLASS + "$"),
+TRIMREGEX        = new RegExp(TRIM_LEFT_REGEX.source + "|" + TRIM_RIGHT_REGEX.source, "g"),
+
+NATIVE_FN_REGEX  = /\{\s*\[(?:native code|function)\]\s*\}/i;
+
+// -- Protected Methods --------------------------------------------------------
+
+/**
+Returns `true` if the given function appears to be implemented in native code,
+`false` otherwise. Will always return `false` -- even in ES5-capable browsers --
+if the `useNativeES5` YUI config option is set to `false`.
+
+This isn't guaranteed to be 100% accurate and won't work for anything other than
+functions, but it can be useful for determining whether a function like
+`Array.prototype.forEach` is native or a JS shim provided by another library.
+
+There's a great article by @kangax discussing certain flaws with this technique:
+<http://perfectionkills.com/detecting-built-in-host-methods/>
+
+While his points are valid, it's still possible to benefit from this function
+as long as it's used carefully and sparingly, and in such a way that false
+negatives have minimal consequences. It's used internally to avoid using
+potentially broken non-native ES5 shims that have been added to the page by
+other libraries.
+
+@method _isNative
+@param {Function} fn Function to test.
+@return {Boolean} `true` if _fn_ appears to be native, `false` otherwise.
+@static
+@protected
+@since 3.5.0
+**/
+L._isNative = function (fn) {
+    return !!(Y.config.useNativeES5 && fn && NATIVE_FN_REGEX.test(fn));
+};
+
+// -- Public Methods -----------------------------------------------------------
+
+/**
+ * Determines whether or not the provided item is an array.
+ *
+ * Returns `false` for array-like collections such as the function `arguments`
+ * collection or `HTMLElement` collections. Use `Y.Array.test()` if you want to
+ * test for an array-like collection.
+ *
+ * @method isArray
+ * @param o The object to test.
+ * @return {boolean} true if o is an array.
+ * @static
+ */
+L.isArray = L._isNative(Array.isArray) ? Array.isArray : function (o) {
+    return L.type(o) === 'array';
+};
+
+/**
+ * Determines whether or not the provided item is a boolean.
+ * @method isBoolean
+ * @static
+ * @param o The object to test.
+ * @return {boolean} true if o is a boolean.
+ */
+L.isBoolean = function(o) {
+    return typeof o === 'boolean';
+};
+
+/**
+ * Determines whether or not the supplied item is a date instance.
+ * @method isDate
+ * @static
+ * @param o The object to test.
+ * @return {boolean} true if o is a date.
+ */
+L.isDate = function(o) {
+    return L.type(o) === 'date' && o.toString() !== 'Invalid Date' && !isNaN(o);
+};
+
+/**
+ * <p>
+ * Determines whether or not the provided item is a function.
+ * Note: Internet Explorer thinks certain functions are objects:
+ * </p>
+ *
+ * <pre>
+ * var obj = document.createElement("object");
+ * Y.Lang.isFunction(obj.getAttribute) // reports false in IE
+ * &nbsp;
+ * var input = document.createElement("input"); // append to body
+ * Y.Lang.isFunction(input.focus) // reports false in IE
+ * </pre>
+ *
+ * <p>
+ * You will have to implement additional tests if these functions
+ * matter to you.
+ * </p>
+ *
+ * @method isFunction
+ * @static
+ * @param o The object to test.
+ * @return {boolean} true if o is a function.
+ */
+L.isFunction = function(o) {
+    return L.type(o) === 'function';
+};
+
+/**
+ * Determines whether or not the provided item is null.
+ * @method isNull
+ * @static
+ * @param o The object to test.
+ * @return {boolean} true if o is null.
+ */
+L.isNull = function(o) {
+    return o === null;
+};
+
+/**
+ * Determines whether or not the provided item is a legal number.
+ * @method isNumber
+ * @static
+ * @param o The object to test.
+ * @return {boolean} true if o is a number.
+ */
+L.isNumber = function(o) {
+    return typeof o === 'number' && isFinite(o);
+};
+
+/**
+ * Determines whether or not the provided item is of type object
+ * or function. Note that arrays are also objects, so
+ * <code>Y.Lang.isObject([]) === true</code>.
+ * @method isObject
+ * @static
+ * @param o The object to test.
+ * @param failfn {boolean} fail if the input is a function.
+ * @return {boolean} true if o is an object.
+ * @see isPlainObject
+ */
+L.isObject = function(o, failfn) {
+    var t = typeof o;
+    return (o && (t === 'object' ||
+        (!failfn && (t === 'function' || L.isFunction(o))))) || false;
+};
+
+/**
+ * Determines whether or not the provided value is a regexp.
+ * @method isRegExp
+ * @static
+ * @param value The value or object to test.
+ * @return {boolean} true if value is a regexp.
+ */
+L.isRegExp = function(value) {
+    return L.type(value) === 'regexp';
+};
+
+/**
+ * Determines whether or not the provided item is a string.
+ * @method isString
+ * @static
+ * @param o The object to test.
+ * @return {boolean} true if o is a string.
+ */
+L.isString = function(o) {
+    return typeof o === 'string';
+};
+
+/**
+ * Determines whether or not the provided item is undefined.
+ * @method isUndefined
+ * @static
+ * @param o The object to test.
+ * @return {boolean} true if o is undefined.
+ */
+L.isUndefined = function(o) {
+    return typeof o === 'undefined';
+};
+
+/**
+ * A convenience method for detecting a legitimate non-null value.
+ * Returns false for null/undefined/NaN, true for other values,
+ * including 0/false/''
+ * @method isValue
+ * @static
+ * @param o The item to test.
+ * @return {boolean} true if it is not null/undefined/NaN || false.
+ */
+L.isValue = function(o) {
+    var t = L.type(o);
+
+    switch (t) {
+        case 'number':
+            return isFinite(o);
+
+        case 'null': // fallthru
+        case 'undefined':
+            return false;
+
+        default:
+            return !!t;
+    }
+};
+
+/**
+ * Returns the current time in milliseconds.
+ *
+ * @method now
+ * @return {Number} Current time in milliseconds.
+ * @static
+ * @since 3.3.0
+ */
+L.now = Date.now || function () {
+    return new Date().getTime();
+};
+
+/**
+ * Performs `{placeholder}` substitution on a string. The object passed as the 
+ * second parameter provides values to replace the `{placeholder}`s.
+ * `{placeholder}` token names must match property names of the object. For example,
+ * 
+ *`var greeting = Y.Lang.sub("Hello, {who}!", { who: "World" });`
+ *
+ * `{placeholder}` tokens that are undefined on the object map will be left 
+ * in tact (leaving unsightly `{placeholder}`'s in the output string). 
+ *
+ * @method sub
+ * @param {string} s String to be modified.
+ * @param {object} o Object containing replacement values.
+ * @return {string} the substitute result.
+ * @static
+ * @since 3.2.0
+ */
+L.sub = function(s, o) {
+    return s.replace ? s.replace(SUBREGEX, function (match, key) {
+        return L.isUndefined(o[key]) ? match : o[key];
+    }) : s;
+};
+
+/**
+ * Returns a string without any leading or trailing whitespace.  If
+ * the input is not a string, the input will be returned untouched.
+ * @method trim
+ * @static
+ * @param s {string} the string to trim.
+ * @return {string} the trimmed string.
+ */
+L.trim = L._isNative(STRING_PROTO.trim) && !WHITESPACE.trim() ? function(s) {
+    return s && s.trim ? s.trim() : s;
+} : function (s) {
+    try {
+        return s.replace(TRIMREGEX, '');
+    } catch (e) {
+        return s;
+    }
+};
+
+/**
+ * Returns a string without any leading whitespace.
+ * @method trimLeft
+ * @static
+ * @param s {string} the string to trim.
+ * @return {string} the trimmed string.
+ */
+L.trimLeft = L._isNative(STRING_PROTO.trimLeft) && !WHITESPACE.trimLeft() ? function (s) {
+    return s.trimLeft();
+} : function (s) {
+    return s.replace(TRIM_LEFT_REGEX, '');
+};
+
+/**
+ * Returns a string without any trailing whitespace.
+ * @method trimRight
+ * @static
+ * @param s {string} the string to trim.
+ * @return {string} the trimmed string.
+ */
+L.trimRight = L._isNative(STRING_PROTO.trimRight) && !WHITESPACE.trimRight() ? function (s) {
+    return s.trimRight();
+} : function (s) {
+    return s.replace(TRIM_RIGHT_REGEX, '');
+};
+
+/**
+Returns one of the following strings, representing the type of the item passed
+in:
+
+ * "array"
+ * "boolean"
+ * "date"
+ * "error"
+ * "function"
+ * "null"
+ * "number"
+ * "object"
+ * "regexp"
+ * "string"
+ * "undefined"
+
+Known issues:
+
+ * `typeof HTMLElementCollection` returns function in Safari, but
+    `Y.Lang.type()` reports "object", which could be a good thing --
+    but it actually caused the logic in <code>Y.Lang.isObject</code> to fail.
+
+@method type
+@param o the item to test.
+@return {string} the detected type.
+@static
+**/
+L.type = function(o) {
+    return TYPES[typeof o] || TYPES[TOSTRING.call(o)] || (o ? 'object' : 'null');
+};
+/**
+@module yui
+@submodule yui-base
+*/
+
+var Lang   = Y.Lang,
+    Native = Array.prototype,
+
+    hasOwn = Object.prototype.hasOwnProperty;
+
+/**
+Provides utility methods for working with arrays. Additional array helpers can
+be found in the `collection` and `array-extras` modules.
+
+`Y.Array(thing)` returns a native array created from _thing_. Depending on
+_thing_'s type, one of the following will happen:
+
+  * Arrays are returned unmodified unless a non-zero _startIndex_ is
+    specified.
+  * Array-like collections (see `Array.test()`) are converted to arrays.
+  * For everything else, a new array is created with _thing_ as the sole
+    item.
+
+Note: elements that are also collections, such as `<form>` and `<select>`
+elements, are not automatically converted to arrays. To force a conversion,
+pass `true` as the value of the _force_ parameter.
+
+@class Array
+@constructor
+@param {Any} thing The thing to arrayify.
+@param {Number} [startIndex=0] If non-zero and _thing_ is an array or array-like
+  collection, a subset of items starting at the specified index will be
+  returned.
+@param {Boolean} [force=false] If `true`, _thing_ will be treated as an
+  array-like collection no matter what.
+@return {Array} A native array created from _thing_, according to the rules
+  described above.
+**/
+function YArray(thing, startIndex, force) {
+    var len, result;
+
+    /*jshint expr: true*/
+    startIndex || (startIndex = 0);
+
+    if (force || YArray.test(thing)) {
+        // IE throws when trying to slice HTMLElement collections.
+        try {
+            return Native.slice.call(thing, startIndex);
+        } catch (ex) {
+            result = [];
+
+            for (len = thing.length; startIndex < len; ++startIndex) {
+                result.push(thing[startIndex]);
+            }
+
+            return result;
+        }
+    }
+
+    return [thing];
+}
+
+Y.Array = YArray;
+
+/**
+Dedupes an array of strings, returning an array that's guaranteed to contain
+only one copy of a given string.
+
+This method differs from `Array.unique()` in that it's optimized for use only
+with arrays consisting entirely of strings or entirely of numbers, whereas
+`unique` may be used with other value types (but is slower).
+
+Using `dedupe()` with values other than strings or numbers, or with arrays
+containing a mix of strings and numbers, may result in unexpected behavior.
+
+@method dedupe
+@param {String[]|Number[]} array Array of strings or numbers to dedupe.
+@return {Array} Copy of _array_ containing no duplicate values.
+@static
+@since 3.4.0
+**/
+YArray.dedupe = Lang._isNative(Object.create) ? function (array) {
+    var hash    = Object.create(null),
+        results = [],
+        i, item, len;
+
+    for (i = 0, len = array.length; i < len; ++i) {
+        item = array[i];
+
+        if (!hash[item]) {
+            hash[item] = 1;
+            results.push(item);
+        }
+    }
+
+    return results;
+} : function (array) {
+    var hash    = {},
+        results = [],
+        i, item, len;
+
+    for (i = 0, len = array.length; i < len; ++i) {
+        item = array[i];
+
+        if (!hasOwn.call(hash, item)) {
+            hash[item] = 1;
+            results.push(item);
+        }
+    }
+
+    return results;
+};
+
+/**
+Executes the supplied function on each item in the array. This method wraps
+the native ES5 `Array.forEach()` method if available.
+
+@method each
+@param {Array} array Array to iterate.
+@param {Function} fn Function to execute on each item in the array. The function
+  will receive the following arguments:
+    @param {Any} fn.item Current array item.
+    @param {Number} fn.index Current array index.
+    @param {Array} fn.array Array being iterated.
+@param {Object} [thisObj] `this` object to use when calling _fn_.
+@return {YUI} The YUI instance.
+@static
+**/
+YArray.each = YArray.forEach = Lang._isNative(Native.forEach) ? function (array, fn, thisObj) {
+    Native.forEach.call(array || [], fn, thisObj || Y);
+    return Y;
+} : function (array, fn, thisObj) {
+    for (var i = 0, len = (array && array.length) || 0; i < len; ++i) {
+        if (i in array) {
+            fn.call(thisObj || Y, array[i], i, array);
+        }
+    }
+
+    return Y;
+};
+
+/**
+Alias for `each()`.
+
+@method forEach
+@static
+**/
+
+/**
+Returns an object using the first array as keys and the second as values. If
+the second array is not provided, or if it doesn't contain the same number of
+values as the first array, then `true` will be used in place of the missing
+values.
+
+@example
+
+    Y.Array.hash(['a', 'b', 'c'], ['foo', 'bar']);
+    // => {a: 'foo', b: 'bar', c: true}
+
+@method hash
+@param {String[]} keys Array of strings to use as keys.
+@param {Array} [values] Array to use as values.
+@return {Object} Hash using the first array as keys and the second as values.
+@static
+**/
+YArray.hash = function (keys, values) {
+    var hash = {},
+        vlen = (values && values.length) || 0,
+        i, len;
+
+    for (i = 0, len = keys.length; i < len; ++i) {
+        if (i in keys) {
+            hash[keys[i]] = vlen > i && i in values ? values[i] : true;
+        }
+    }
+
+    return hash;
+};
+
+/**

[... 9466 lines stripped ...]