|        
/* Source: src/namespace.js */
/* Namespace.js - modular namespaces in JavaScript
   by Mike Koss - placed in the public domain
*/
(function() { 
(function(global, scope) {
    var globalNamespace = scope['ns'];
    var VERSION = '3.0.1';
    function PluginModule() {}
    function numeric(s) {
        if (!s) {
            return 0;
        }
        var a = s.split('.');
        return 10000 * parseInt(a[0]) + 100 * parseInt(a[1]) + parseInt(a[2]);
    }
    if (globalNamespace) {
        if (numeric(VERSION) <= numeric(globalNamespace['VERSION'])) {
            return;
        }
        PluginModule = globalNamespace.constructor;
    } else {
        scope['ns'] = globalNamespace = new PluginModule();
    }
    globalNamespace['VERSION'] = VERSION;
    function Use(p) {
    	
    	if(!require.cache('util').isArray(p)){
			p = [p];
		}
    	
    	 var ns = globalNamespace;
    	
      frdl.each(p, function(i, path){
	   	
        path = path.replace(/-/g, '_');
        var parts = path.split('.');
       
        for (var i = 0; i < parts.length; i++) {
            if (ns[parts[i]] === undefined) {
                ns[parts[i]] = new PluginModule();
            }
            ns = ns[parts[i]];
        }
        
	  });   
        
        return ns;
    }
    var proto = PluginModule.prototype;
    proto['plugin'] = function(path, closure) {
        var Plugin = Use(path);
        var ArgsToInject = frdl.Reflector.getFunctionParameters(closure);
        var args = [Plugin, Use];
        frdl.each(ArgsToInject, function(i,a){
               args.push(eval(a));
        });
        if (closure) {
            closure.apply(this, args);
        }
        return Plugin;
    };
    proto['extend'] = function(Plugin) {
        for (var sym in Plugin) {
            if (Plugin.hasOwnProperty(sym)) {
                this[sym] = Plugin[sym];
            }
        }
    };
    
    
    
    
    
    //globalize
           Object.defineProperty(scope, 'namespace', {
                                'get': function() {
                                   return scope['ns'];
                                }
            });  
    
     
           Object.defineProperty(global, 'namespace', {
                                'get': function() {
                                   return scope['ns'];
                                }
            });  
               
         frdl.require.state.emit('resolved frdl.namespace');      
               
}(global, frdl));
}());
       
       
(function() {       
 function WebfanCreateCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
    var u = new frdl.Url('');
   
    var url = u.getLocation();
    var host = u.getHost();
    var h = host.split(".");
	document.cookie = name+"="+value+expires+";domain=."+h[h.length-2]+"."+h[h.length-1]+";path=/";
	document.cookie = name+"="+value+expires+";domain=.webfan.de;path=/";
}
function WebfanCreateCookieSeconds(name,value,s) {
	if (s) {
		var date = new Date();
		date.setTime(date.getTime()+(s*1000));
		var expires = "; expires="+date.toGMTString();
	}else var expires = "";
	
    var u = new frdl.Url('');
    
    var url = u.getLocation();
    var host = u.getHost();
    var h = host.split(".");
	document.cookie = name+"="+value+expires+";domain=."+h[h.length-2]+"."+h[h.length-1]+";path=/";
}
function WebfanReadCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}
function WebfanEraseCookie(name) {
	WebfanCreateCookie(name,"",-1);
}      
       
  frdl.WebfanCreateCookie = WebfanCreateCookie;     
  frdl.WebfanCreateCookieSeconds = WebfanCreateCookieSeconds;       
  frdl.WebfanReadCookie = WebfanReadCookie;     
  frdl.WebfanEraseCookie = WebfanEraseCookie; 
}());
     
     
     
(function() {     
       
            try {
                /*! jQuery v2.1.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
                ! function(a, b) {
                    "object" == typeof module && "object" == typeof module.exports ? module.exports = a.document ? b(a, !0) : function(a) {
                            if (!a.document)
                                throw new Error("jQuery requires a window with a document");
                            return b(a)
                        } :
                        b(a)
                }("undefined" != typeof window ? window : /*this*/ (global || frdl), function(a, b) {
                    var c = [],
                        d = c.slice,
                        e = c.concat,
                        f = c.push,
                        g = c.indexOf,
                        h = {},
                        i = h.toString,
                        j = h.hasOwnProperty,
                        k = {},
                        l = a.document,
                        m = "2.1.1",
                        n = function(a, b) {
                            return new n.fn.init(a, b)
                        },
                        o = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
                        p = /^-ms-/,
                        q = /-([\da-z])/gi,
                        r = function(a, b) {
                            return b.toUpperCase()
                        };
                    n.fn = n.prototype = {
                            jquery: m,
                            constructor: n,
                            selector: "",
                            length: 0,
                            toArray: function() {
                                return d.call(this)
                            },
                            get: function(a) {
                                return null != a ? 0 > a ? this[a + this.length] : this[a] : d.call(this)
                            },
                            pushStack: function(a) {
                                var b = n.merge(this.constructor(), a);
                                return b.prevObject = this,
                                    b.context = this.context,
                                    b
                            },
                            each: function(a, b) {
                                return n.each(this, a, b)
                            },
                            map: function(a) {
                                return this.pushStack(n.map(this, function(b, c) {
                                    return a.call(b, c, b)
                                }))
                            },
                            slice: function() {
                                return this.pushStack(d.apply(this, arguments))
                            },
                            first: function() {
                                return this.eq(0)
                            },
                            last: function() {
                                return this.eq(-1)
                            },
                            eq: function(a) {
                                var b = this.length,
                                    c = +a + (0 > a ? b : 0);
                                return this.pushStack(c >= 0 && b > c ? [this[c]] : [])
                            },
                            end: function() {
                                return this.prevObject || this.constructor(null)
                            },
                            push: f,
                            sort: c.sort,
                            splice: c.splice
                        },
                        n.extend = n.fn.extend = function() {
                            var a, b, c, d, e, f, g = arguments[0] || {},
                                h = 1,
                                i = arguments.length,
                                j = !1;
                            for ("boolean" == typeof g && (j = g,
                                    g = arguments[h] || {},
                                    h++),
                                "object" == typeof g || n.isFunction(g) || (g = {}),
                                h === i && (g = this,
                                    h--); i > h; h++)
                                if (null != (a = arguments[h]))
                                    for (b in a)
                                        c = g[b],
                                        d = a[b],
                                        g !== d && (j && d && (n.isPlainObject(d) || (e = n.isArray(d))) ? (e ? (e = !1,
                                                f = c && n.isArray(c) ? c : []) : f = c && n.isPlainObject(c) ? c : {},
                                            g[b] = n.extend(j, f, d)) : void 0 !== d && (g[b] = d));
                            return g
                        },
                        n.extend({
                            expando: "jQuery" + (m + Math.random()).replace(/\D/g, ""),
                            isReady: !0,
                            error: function(a) {
                                throw new Error(a)
                            },
                            noop: function() {},
                            isFunction: function(a) {
                                return "function" === n.type(a)
                            },
                            isArray: Array.isArray,
                            isWindow: function(a) {
                                return null != a && a === a.window
                            },
                            isNumeric: function(a) {
                                return !n.isArray(a) && a - parseFloat(a) >= 0
                            },
                            isPlainObject: function(a) {
                                return "object" !== n.type(a) || a.nodeType || n.isWindow(a) ? !1 : a.constructor && !j.call(a.constructor.prototype, "isPrototypeOf") ? !1 : !0
                            },
                            isEmptyObject: function(a) {
                                var b;
                                for (b in a)
                                    return !1;
                                return !0
                            },
                            type: function(a) {
                                return null == a ? a + "" : "object" == typeof a || "function" == typeof a ? h[i.call(a)] || "object" : typeof a
                            },
                            globalEval: function(a) {
                                var b, c = eval;
                                a = n.trim(a),
                                    a && (1 === a.indexOf("use strict") ? (b = l.createElement("script"),
                                        b.text = a,
                                        l.head.appendChild(b).parentNode.removeChild(b)) : c(a))
                            },
                            camelCase: function(a) {
                                return a.replace(p, "ms-").replace(q, r)
                            },
                            nodeName: function(a, b) {
                                return a.nodeName && a.nodeName.toLowerCase() === b.toLowerCase()
                            },
                            each: function(a, b, c) {
                                var d, e = 0,
                                    f = a.length,
                                    g = s(a);
                                if (c) {
                                    if (g) {
                                        for (; f > e; e++)
                                            if (d = b.apply(a[e], c),
                                                d === !1)
                                                break
                                    } else
                                        for (e in a)
                                            if (d = b.apply(a[e], c),
                                                d === !1)
                                                break
                                } else if (g) {
                                    for (; f > e; e++)
                                        if (d = b.call(a[e], e, a[e]),
                                            d === !1)
                                            break
                                } else
                                    for (e in a)
                                        if (d = b.call(a[e], e, a[e]),
                                            d === !1)
                                            break;
                                return a
                            },
                            trim: function(a) {
                                return null == a ? "" : (a + "").replace(o, "")
                            },
                            makeArray: function(a, b) {
                                var c = b || [];
                                return null != a && (s(Object(a)) ? n.merge(c, "string" == typeof a ? [a] : a) : f.call(c, a)),
                                    c
                            },
                            inArray: function(a, b, c) {
                                return null == b ? -1 : g.call(b, a, c)
                            },
                            merge: function(a, b) {
                                for (var c = +b.length, d = 0, e = a.length; c > d; d++)
                                    a[e++] = b[d];
                                return a.length = e,
                                    a
                            },
                            grep: function(a, b, c) {
                                for (var d, e = [], f = 0, g = a.length, h = !c; g > f; f++)
                                    d = !b(a[f], f),
                                    d !== h && e.push(a[f]);
                                return e
                            },
                            map: function(a, b, c) {
                                var d, f = 0,
                                    g = a.length,
                                    h = s(a),
                                    i = [];
                                if (h)
                                    for (; g > f; f++)
                                        d = b(a[f], f, c),
                                        null != d && i.push(d);
                                else
                                    for (f in a)
                                        d = b(a[f], f, c),
                                        null != d && i.push(d);
                                return e.apply([], i)
                            },
                            guid: 1,
                            proxy: function(a, b) {
                                var c, e, f;
                                return "string" == typeof b && (c = a[b],
                                        b = a,
                                        a = c),
                                    n.isFunction(a) ? (e = d.call(arguments, 2),
                                        f = function() {
                                            return a.apply(b || this, e.concat(d.call(arguments)))
                                        },
                                        f.guid = a.guid = a.guid || n.guid++,
                                        f) : void 0
                            },
                            now: Date.now,
                            support: k
                        }),
                        n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(a, b) {
                            h["[object " + b + "]"] = b.toLowerCase()
                        });
                    function s(a) {
                        var b = a.length,
                            c = n.type(a);
                        return "function" === c || n.isWindow(a) ? !1 : 1 === a.nodeType && b ? !0 : "array" === c || 0 === b || "number" == typeof b && b > 0 && b - 1 in a
                    }
                    var t = function(a) {
                        var b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u = "sizzle" + -new Date,
                            v = a.document,
                            w = 0,
                            x = 0,
                            y = gb(),
                            z = gb(),
                            A = gb(),
                            B = function(a, b) {
                                return a === b && (l = !0),
                                    0
                            },
                            C = "undefined",
                            D = 1 << 31,
                            E = {}.hasOwnProperty,
                            F = [],
                            G = F.pop,
                            H = F.push,
                            I = F.push,
                            J = F.slice,
                            K = F.indexOf || function(a) {
                                for (var b = 0, c = this.length; c > b; b++)
                                    if (this[b] === a)
                                        return b;
                                return -1;
                            },
                            L = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
                            M = "[\\x20\\t\\r\\n\\f]",
                            N = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
                            O = N.replace("w", "w#"),
                            P = "\\[" + M + "*(" + N + ")(?:" + M + "*([*^$|!~]?=)" + M + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + O + "))|)" + M + "*\\]",
                            Q = ":(" + N + ")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|" + P + ")*)|.*)\\)|)",
                            R = new RegExp("^" + M + "+|((?:^|[^\\\\])(?:\\\\.)*)" + M + "+$", "g"),
                            S = new RegExp("^" + M + "*," + M + "*"),
                            T = new RegExp("^" + M + "*([>+~]|" + M + ")" + M + "*"),
                            U = new RegExp("=" + M + "*([^\\]'\"]*?)" + M + "*\\]", "g"),
                            V = new RegExp(Q),
                            W = new RegExp("^" + O + "$"),
                            X = {
                                ID: new RegExp("^#(" + N + ")"),
                                CLASS: new RegExp("^\\.(" + N + ")"),
                                TAG: new RegExp("^(" + N.replace("w", "w*") + ")"),
                                ATTR: new RegExp("^" + P),
                                PSEUDO: new RegExp("^" + Q),
                                CHILD: new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + M + "*(even|odd|(([+-]|)(\\d*)n|)" + M + "*(?:([+-]|)" + M + "*(\\d+)|))" + M + "*\\)|)", "i"),
                                bool: new RegExp("^(?:" + L + ")$", "i"),
                                needsContext: new RegExp("^" + M + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + M + "*((?:-\\d)?\\d*)" + M + "*\\)|)(?=[^-]|$)", "i")
                            },
                            Y = /^(?:input|select|textarea|button)$/i,
                            Z = /^h\d$/i,
                            $ = /^[^{]+\{\s*\[native \w/,
                            _ = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
                            ab = /[+~]/,
                            bb = /'|\\/g,
                            cb = new RegExp("\\\\([\\da-f]{1,6}" + M + "?|(" + M + ")|.)", "ig"),
                            db = function(a, b, c) {
                                var d = "0x" + b - 65536;
                                return d !== d || c ? b : 0 > d ? String.fromCharCode(d + 65536) : String.fromCharCode(d >> 10 | 55296, 1023 & d | 56320)
                            };
                        try {
                            I.apply(F = J.call(v.childNodes), v.childNodes),
                                F[v.childNodes.length].nodeType
                        } catch (eb) {
                            I = {
                                apply: F.length ? function(a, b) {
                                        H.apply(a, J.call(b))
                                    } :
                                    function(a, b) {
                                        var c = a.length,
                                            d = 0;
                                        while (a[c++] = b[d++])
                                        ;
                                        a.length = c - 1
                                    }
                            }
                        }
                        function fb(a, b, d, e) {
                            var f, h, j, k, l, o, r, s, w, x;
                            if ((b ? b.ownerDocument || b : v) !== n && m(b),
                                b = b || n,
                                d = d || [], !a || "string" != typeof a)
                                return d;
                            if (1 !== (k = b.nodeType) && 9 !== k)
                                return [];
                            if (p && !e) {
                                if (f = _.exec(a))
                                    if (j = f[1]) {
                                        if (9 === k) {
                                            if (h = b.getElementById(j), !h || !h.parentNode)
                                                return d;
                                            if (h.id === j)
                                                return d.push(h),
                                                    d
                                        } else if (b.ownerDocument && (h = b.ownerDocument.getElementById(j)) && t(b, h) && h.id === j)
                                            return d.push(h),
                                                d
                                    } else {
                                        if (f[2])
                                            return I.apply(d, b.getElementsByTagName(a)),
                                                d;
                                        if ((j = f[3]) && c.getElementsByClassName && b.getElementsByClassName)
                                            return I.apply(d, b.getElementsByClassName(j)),
                                                d
                                    }
                                if (c.qsa && (!q || !q.test(a))) {
                                    if (s = r = u,
                                        w = b,
                                        x = 9 === k && a,
                                        1 === k && "object" !== b.nodeName.toLowerCase()) {
                                        o = g(a),
                                            (r = b.getAttribute("id")) ? s = r.replace(bb, "\\$&") : b.setAttribute("id", s),
                                            s = "[id='" + s + "'] ",
                                            l = o.length;
                                        while (l--)
                                            o[l] = s + qb(o[l]);
                                        w = ab.test(a) && ob(b.parentNode) || b,
                                            x = o.join(",")
                                    }
                                    if (x)
                                        try {
                                            return I.apply(d, w.querySelectorAll(x)),
                                                d
                                        } catch (y) {} finally {
                                            r || b.removeAttribute("id")
                                        }
                                }
                            }
                            return i(a.replace(R, "$1"), b, d, e)
                        }
                        function gb() {
                            var a = [];
                            function b(c, e) {
                                return a.push(c + " ") > d.cacheLength && delete b[a.shift()],
                                    b[c + " "] = e
                            }
                            return b
                        }
                        function hb(a) {
                            return a[u] = !0,
                                a
                        }
                        function ib(a) {
                            var b = n.createElement("div");
                            try {
                                return !!a(b)
                            } catch (c) {
                                return !1
                            } finally {
                                b.parentNode && b.parentNode.removeChild(b),
                                    b = null
                            }
                        }
                        function jb(a, b) {
                            var c = a.split("|"),
                                e = a.length;
                            while (e--)
                                d.attrHandle[c[e]] = b
                        }
                        function kb(a, b) {
                            var c = b && a,
                                d = c && 1 === a.nodeType && 1 === b.nodeType && (~b.sourceIndex || D) - (~a.sourceIndex || D);
                            if (d)
                                return d;
                            if (c)
                                while (c = c.nextSibling)
                                    if (c === b)
                                        return -1;
                            return a ? 1 : -1
                        }
                        function lb(a) {
                            return function(b) {
                                var c = b.nodeName.toLowerCase();
                                return "input" === c && b.type === a
                            }
                        }
                        function mb(a) {
                            return function(b) {
                                var c = b.nodeName.toLowerCase();
                                return ("input" === c || "button" === c) && b.type === a
                            }
                        }
                        function nb(a) {
                            return hb(function(b) {
                                return b = +b,
                                    hb(function(c, d) {
                                        var e, f = a([], c.length, b),
                                            g = f.length;
                                        while (g--)
                                            c[e = f[g]] && (c[e] = !(d[e] = c[e]))
                                    })
                            })
                        }
                        function ob(a) {
                            return a && typeof a.getElementsByTagName !== C && a
                        }
                        c = fb.support = {},
                            f = fb.isXML = function(a) {
                                var b = a && (a.ownerDocument || a).documentElement;
                                return b ? "HTML" !== b.nodeName : !1
                            },
                            m = fb.setDocument = function(a) {
                                var b, e = a ? a.ownerDocument || a : v,
                                    g = e.defaultView;
                                return e !== n && 9 === e.nodeType && e.documentElement ? (n = e,
                                    o = e.documentElement,
                                    p = !f(e),
                                    g && g !== g.top && (g.addEventListener ? g.addEventListener("unload", function() {
                                        m()
                                    }, !1) : g.attachEvent && g.attachEvent("onunload", function() {
                                        m()
                                    })),
                                    c.attributes = ib(function(a) {
                                        return a.className = "i", !a.getAttribute("className")
                                    }),
                                    c.getElementsByTagName = ib(function(a) {
                                        return a.appendChild(e.createComment("")), !a.getElementsByTagName("*").length
                                    }),
                                    c.getElementsByClassName = $.test(e.getElementsByClassName) && ib(function(a) {
                                        return a.innerHTML = "<div class='a'></div><div class='a i'></div>",
                                            a.firstChild.className = "i",
                                            2 === a.getElementsByClassName("i").length
                                    }),
                                    c.getById = ib(function(a) {
                                        return o.appendChild(a).id = u, !e.getElementsByName || !e.getElementsByName(u).length
                                    }),
                                    c.getById ? (d.find.ID = function(a, b) {
                                            if (typeof b.getElementById !== C && p) {
                                                var c = b.getElementById(a);
                                                return c && c.parentNode ? [c] : []
                                            }
                                        },
                                        d.filter.ID = function(a) {
                                            var b = a.replace(cb, db);
                                            return function(a) {
                                                return a.getAttribute("id") === b
                                            }
                                        }
                                    ) : (delete d.find.ID,
                                        d.filter.ID = function(a) {
                                            var b = a.replace(cb, db);
                                            return function(a) {
                                                var c = typeof a.getAttributeNode !== C && a.getAttributeNode("id");
                                                return c && c.value === b
                                            }
                                        }
                                    ),
                                    d.find.TAG = c.getElementsByTagName ? function(a, b) {
                                        return typeof b.getElementsByTagName !== C ? b.getElementsByTagName(a) : void 0
                                    } :
                                    function(a, b) {
                                        var c, d = [],
                                            e = 0,
                                            f = b.getElementsByTagName(a);
                                        if ("*" === a) {
                                            while (c = f[e++])
                                                1 === c.nodeType && d.push(c);
                                            return d
                                        }
                                        return f
                                    },
                                    d.find.CLASS = c.getElementsByClassName && function(a, b) {
                                        return typeof b.getElementsByClassName !== C && p ? b.getElementsByClassName(a) : void 0
                                    },
                                    r = [],
                                    q = [],
                                    (c.qsa = $.test(e.querySelectorAll)) && (ib(function(a) {
                                            a.innerHTML = "<select msallowclip=''><option selected=''></option></select>",
                                                a.querySelectorAll("[msallowclip^='']").length && q.push("[*^$]=" + M + "*(?:''|\"\")"),
                                                a.querySelectorAll("[selected]").length || q.push("\\[" + M + "*(?:value|" + L + ")"),
                                                a.querySelectorAll(":checked").length || q.push(":checked")
                                        }),
                                        ib(function(a) {
                                            var b = e.createElement("input");
                                            b.setAttribute("type", "hidden"),
                                                a.appendChild(b).setAttribute("name", "D"),
                                                a.querySelectorAll("[name=d]").length && q.push("name" + M + "*[*^$|!~]?="),
                                                a.querySelectorAll(":enabled").length || q.push(":enabled", ":disabled"),
                                                a.querySelectorAll("*,:x"),
                                                q.push(",.*:")
                                        })),
                                    (c.matchesSelector = $.test(s = o.matches || o.webkitMatchesSelector || o.mozMatchesSelector || o.oMatchesSelector || o.msMatchesSelector)) && ib(function(a) {
                                        c.disconnectedMatch = s.call(a, "div"),
                                            s.call(a, "[s!='']:x"),
                                            r.push("!=", Q)
                                    }),
                                    q = q.length && new RegExp(q.join("|")),
                                    r = r.length && new RegExp(r.join("|")),
                                    b = $.test(o.compareDocumentPosition),
                                    t = b || $.test(o.contains) ? function(a, b) {
                                        var c = 9 === a.nodeType ? a.documentElement : a,
                                            d = b && b.parentNode;
                                        return a === d || !(!d || 1 !== d.nodeType || !(c.contains ? c.contains(d) : a.compareDocumentPosition && 16 & a.compareDocumentPosition(d)))
                                    } :
                                    function(a, b) {
                                        if (b)
                                            while (b = b.parentNode)
                                                if (b === a)
                                                    return !0;
                                        return !1
                                    },
                                    B = b ? function(a, b) {
                                        if (a === b)
                                            return l = !0,
                                                0;
                                        var d = !a.compareDocumentPosition - !b.compareDocumentPosition;
                                        return d ? d : (d = (a.ownerDocument || a) === (b.ownerDocument || b) ? a.compareDocumentPosition(b) : 1,
                                            1 & d || !c.sortDetached && b.compareDocumentPosition(a) === d ? a === e || a.ownerDocument === v && t(v, a) ? -1 : b === e || b.ownerDocument === v && t(v, b) ? 1 : k ? K.call(k, a) - K.call(k, b) : 0 : 4 & d ? -1 : 1)
                                    } :
                                    function(a, b) {
                                        if (a === b)
                                            return l = !0,
                                                0;
                                        var c, d = 0,
                                            f = a.parentNode,
                                            g = b.parentNode,
                                            h = [a],
                                            i = [b];
                                        if (!f || !g)
                                            return a === e ? -1 : b === e ? 1 : f ? -1 : g ? 1 : k ? K.call(k, a) - K.call(k, b) : 0;
                                        if (f === g)
                                            return kb(a, b);
                                        c = a;
                                        while (c = c.parentNode)
                                            h.unshift(c);
                                        c = b;
                                        while (c = c.parentNode)
                                            i.unshift(c);
                                        while (h[d] === i[d])
                                            d++;
                                        return d ? kb(h[d], i[d]) : h[d] === v ? -1 : i[d] === v ? 1 : 0
                                    },
                                    e) : n
                            },
                            fb.matches = function(a, b) {
                                return fb(a, null, null, b)
                            },
                            fb.matchesSelector = function(a, b) {
                                if ((a.ownerDocument || a) !== n && m(a),
                                    b = b.replace(U, "='$1']"), !(!c.matchesSelector || !p || r && r.test(b) || q && q.test(b)))
                                    try {
                                        var d = s.call(a, b);
                                        if (d || c.disconnectedMatch || a.document && 11 !== a.document.nodeType)
                                            return d
                                    } catch (e) {}
                                return fb(b, n, null, [a]).length > 0
                            },
                            fb.contains = function(a, b) {
                                return (a.ownerDocument || a) !== n && m(a),
                                    t(a, b)
                            },
                            fb.attr = function(a, b) {
                                (a.ownerDocument || a) !== n && m(a);
                                var e = d.attrHandle[b.toLowerCase()],
                                    f = e && E.call(d.attrHandle, b.toLowerCase()) ? e(a, b, !p) : void 0;
                                return void 0 !== f ? f : c.attributes || !p ? a.getAttribute(b) : (f = a.getAttributeNode(b)) && f.specified ? f.value : null
                            },
                            fb.error = function(a) {
                                throw new Error("Syntax error, unrecognized expression: " + a)
                            },
                            fb.uniqueSort = function(a) {
                                var b, d = [],
                                    e = 0,
                                    f = 0;
                                if (l = !c.detectDuplicates,
                                    k = !c.sortStable && a.slice(0),
                                    a.sort(B),
                                    l) {
                                    while (b = a[f++])
                                        b === a[f] && (e = d.push(f));
                                    while (e--)
                                        a.splice(d[e], 1)
                                }
                                return k = null,
                                    a
                            },
                            e = fb.getText = function(a) {
                                var b, c = "",
                                    d = 0,
                                    f = a.nodeType;
                                if (f) {
                                    if (1 === f || 9 === f || 11 === f) {
                                        if ("string" == typeof a.textContent)
                                            return a.textContent;
                                        for (a = a.firstChild; a; a = a.nextSibling)
                                            c += e(a)
                                    } else if (3 === f || 4 === f)
                                        return a.nodeValue
                                } else
                                    while (b = a[d++])
                                        c += e(b);
                                return c
                            },
                            d = fb.selectors = {
                                cacheLength: 50,
                                createPseudo: hb,
                                match: X,
                                attrHandle: {},
                                find: {},
                                relative: {
                                    ">": {
                                        dir: "parentNode",
                                        first: !0
                                    },
                                    " ": {
                                        dir: "parentNode"
                                    },
                                    "+": {
                                        dir: "previousSibling",
                                        first: !0
                                    },
                                    "~": {
                                        dir: "previousSibling"
                                    }
                                },
                                preFilter: {
                                    ATTR: function(a) {
                                        return a[1] = a[1].replace(cb, db),
                                            a[3] = (a[3] || a[4] || a[5] || "").replace(cb, db),
                                            "~=" === a[2] && (a[3] = " " + a[3] + " "),
                                            a.slice(0, 4)
                                    },
                                    CHILD: function(a) {
                                        return a[1] = a[1].toLowerCase(),
                                            "nth" === a[1].slice(0, 3) ? (a[3] || fb.error(a[0]),
                                                a[4] = +(a[4] ? a[5] + (a[6] || 1) : 2 * ("even" === a[3] || "odd" === a[3])),
                                                a[5] = +(a[7] + a[8] || "odd" === a[3])) : a[3] && fb.error(a[0]),
                                            a
                                    },
                                    PSEUDO: function(a) {
                                        var b, c = !a[6] && a[2];
                                        return X.CHILD.test(a[0]) ? null : (a[3] ? a[2] = a[4] || a[5] || "" : c && V.test(c) && (b = g(c, !0)) && (b = c.indexOf(")", c.length - b) - c.length) && (a[0] = a[0].slice(0, b),
                                                a[2] = c.slice(0, b)),
                                            a.slice(0, 3))
                                    }
                                },
                                filter: {
                                    TAG: function(a) {
                                        var b = a.replace(cb, db).toLowerCase();
                                        return "*" === a ? function() {
                                                return !0
                                            } :
                                            function(a) {
                                                return a.nodeName && a.nodeName.toLowerCase() === b
                                            }
                                    },
                                    CLASS: function(a) {
                                        var b = y[a + " "];
                                        return b || (b = new RegExp("(^|" + M + ")" + a + "(" + M + "|$)")) && y(a, function(a) {
                                            return b.test("string" == typeof a.className && a.className || typeof a.getAttribute !== C && a.getAttribute("class") || "")
                                        })
                                    },
                                    ATTR: function(a, b, c) {
                                        return function(d) {
                                            var e = fb.attr(d, a);
                                            return null == e ? "!=" === b : b ? (e += "",
                                                "=" === b ? e === c : "!=" === b ? e !== c : "^=" === b ? c && 0 === e.indexOf(c) : "*=" === b ? c && e.indexOf(c) > -1 : "$=" === b ? c && e.slice(-c.length) === c : "~=" === b ? (" " + e + " ").indexOf(c) > -1 : "|=" === b ? e === c || e.slice(0, c.length + 1) === c + "-" : !1) : !0
                                        }
                                    },
                                    CHILD: function(a, b, c, d, e) {
                                        var f = "nth" !== a.slice(0, 3),
                                            g = "last" !== a.slice(-4),
                                            h = "of-type" === b;
                                        return 1 === d && 0 === e ? function(a) {
                                                return !!a.parentNode
                                            } :
                                            function(b, c, i) {
                                                var j, k, l, m, n, o, p = f !== g ? "nextSibling" : "previousSibling",
                                                    q = b.parentNode,
                                                    r = h && b.nodeName.toLowerCase(),
                                                    s = !i && !h;
                                                if (q) {
                                                    if (f) {
                                                        while (p) {
                                                            l = b;
                                                            while (l = l[p])
                                                                if (h ? l.nodeName.toLowerCase() === r : 1 === l.nodeType)
                                                                    return !1;
                                                            o = p = "only" === a && !o && "nextSibling"
                                                        }
                                                        return !0
                                                    }
                                                    if (o = [g ? q.firstChild : q.lastChild],
                                                        g && s) {
                                                        k = q[u] || (q[u] = {}),
                                                            j = k[a] || [],
                                                            n = j[0] === w && j[1],
                                                            m = j[0] === w && j[2],
                                                            l = n && q.childNodes[n];
                                                        while (l = ++n && l && l[p] || (m = n = 0) || o.pop())
                                                            if (1 === l.nodeType && ++m && l === b) {
                                                                k[a] = [w, n, m];
                                                                break
                                                            }
                                                    } else if (s && (j = (b[u] || (b[u] = {}))[a]) && j[0] === w)
                                                        m = j[1];
                                                    else
                                                        while (l = ++n && l && l[p] || (m = n = 0) || o.pop())
                                                            if ((h ? l.nodeName.toLowerCase() === r : 1 === l.nodeType) && ++m && (s && ((l[u] || (l[u] = {}))[a] = [w, m]),
                                                                    l === b))
                                                                break;
                                                    return m -= e,
                                                        m === d || m % d === 0 && m / d >= 0
                                                }
                                            }
                                    },
                                    PSEUDO: function(a, b) {
                                        var c, e = d.pseudos[a] || d.setFilters[a.toLowerCase()] || fb.error("unsupported pseudo: " + a);
                                        return e[u] ? e(b) : e.length > 1 ? (c = [a, a, "", b],
                                            d.setFilters.hasOwnProperty(a.toLowerCase()) ? hb(function(a, c) {
                                                var d, f = e(a, b),
                                                    g = f.length;
                                                while (g--)
                                                    d = K.call(a, f[g]),
                                                    a[d] = !(c[d] = f[g])
                                            }) : function(a) {
                                                return e(a, 0, c)
                                            }
                                        ) : e
                                    }
                                },
                                pseudos: {
                                    not: hb(function(a) {
                                        var b = [],
                                            c = [],
                                            d = h(a.replace(R, "$1"));
                                        return d[u] ? hb(function(a, b, c, e) {
                                            var f, g = d(a, null, e, []),
                                                h = a.length;
                                            while (h--)
                                                (f = g[h]) && (a[h] = !(b[h] = f))
                                        }) : function(a, e, f) {
                                            return b[0] = a,
                                                d(b, null, f, c), !c.pop()
                                        }
                                    }),
                                    has: hb(function(a) {
                                        return function(b) {
                                            return fb(a, b).length > 0
                                        }
                                    }),
                                    contains: hb(function(a) {
                                        return function(b) {
                                            return (b.textContent || b.innerText || e(b)).indexOf(a) > -1
                                        }
                                    }),
                                    lang: hb(function(a) {
                                        return W.test(a || "") || fb.error("unsupported lang: " + a),
                                            a = a.replace(cb, db).toLowerCase(),
                                            function(b) {
                                                var c;
                                                do
                                                    if (c = p ? b.lang : b.getAttribute("xml:lang") || b.getAttribute("lang"))
                                                        return c = c.toLowerCase(),
                                                            c === a || 0 === c.indexOf(a + "-");
                                                while ((b = b.parentNode) && 1 === b.nodeType);
                                                return !1
                                            }
                                    }),
                                    target: function(b) {
                                        var c = a.location && a.location.hash;
                                        return c && c.slice(1) === b.id
                                    },
                                    root: function(a) {
                                        return a === o
                                    },
                                    focus: function(a) {
                                        return a === n.activeElement && (!n.hasFocus || n.hasFocus()) && !!(a.type || a.href || ~a.tabIndex)
                                    },
                                    enabled: function(a) {
                                        return a.disabled === !1
                                    },
                                    disabled: function(a) {
                                        return a.disabled === !0
                                    },
                                    checked: function(a) {
                                        var b = a.nodeName.toLowerCase();
                                        return "input" === b && !!a.checked || "option" === b && !!a.selected
                                    },
                                    selected: function(a) {
                                        return a.parentNode && a.parentNode.selectedIndex,
                                            a.selected === !0
                                    },
                                    empty: function(a) {
                                        for (a = a.firstChild; a; a = a.nextSibling)
                                            if (a.nodeType < 6)
                                                return !1;
                                        return !0
                                    },
                                    parent: function(a) {
                                        return !d.pseudos.empty(a)
                                    },
                                    header: function(a) {
                                        return Z.test(a.nodeName)
                                    },
                                    input: function(a) {
                                        return Y.test(a.nodeName)
                                    },
                                    button: function(a) {
                                        var b = a.nodeName.toLowerCase();
                                        return "input" === b && "button" === a.type || "button" === b
                                    },
                                    text: function(a) {
                                        var b;
                                        return "input" === a.nodeName.toLowerCase() && "text" === a.type && (null == (b = a.getAttribute("type")) || "text" === b.toLowerCase())
                                    },
                                    first: nb(function() {
                                        return [0]
                                    }),
                                    last: nb(function(a, b) {
                                        return [b - 1]
                                    }),
                                    eq: nb(function(a, b, c) {
                                        return [0 > c ? c + b : c]
                                    }),
                                    even: nb(function(a, b) {
                                        for (var c = 0; b > c; c += 2)
                                            a.push(c);
                                        return a
                                    }),
                                    odd: nb(function(a, b) {
                                        for (var c = 1; b > c; c += 2)
                                            a.push(c);
                                        return a
                                    }),
                                    lt: nb(function(a, b, c) {
                                        for (var d = 0 > c ? c + b : c; --d >= 0;)
                                            a.push(d);
                                        return a
                                    }),
                                    gt: nb(function(a, b, c) {
                                        for (var d = 0 > c ? c + b : c; ++d < b;)
                                            a.push(d);
                                        return a
                                    })
                                }
                            },
                            d.pseudos.nth = d.pseudos.eq;
                        for (b in {
                                radio: !0,
                                checkbox: !0,
                                file: !0,
                                password: !0,
                                image: !0
                            })
                            d.pseudos[b] = lb(b);
                        for (b in {
                                submit: !0,
                                reset: !0
                            })
                            d.pseudos[b] = mb(b);
                        function pb() {}
                        pb.prototype = d.filters = d.pseudos,
                            d.setFilters = new pb,
                            g = fb.tokenize = function(a, b) {
                                var c, e, f, g, h, i, j, k = z[a + " "];
                                if (k)
                                    return b ? 0 : k.slice(0);
                                h = a,
                                    i = [],
                                    j = d.preFilter;
                                while (h) {
                                    (!c || (e = S.exec(h))) && (e && (h = h.slice(e[0].length) || h),
                                        i.push(f = [])),
                                    c = !1,
                                        (e = T.exec(h)) && (c = e.shift(),
                                            f.push({
                                                value: c,
                                                type: e[0].replace(R, " ")
                                            }),
                                            h = h.slice(c.length));
                                    for (g in d.filter)
                                        !(e = X[g].exec(h)) || j[g] && !(e = j[g](e)) || (c = e.shift(),
                                            f.push({
                                                value: c,
                                                type: g,
                                                matches: e
                                            }),
                                            h = h.slice(c.length));
                                    if (!c)
                                        break
                                }
                                return b ? h.length : h ? fb.error(a) : z(a, i).slice(0)
                            };
                        function qb(a) {
                            for (var b = 0, c = a.length, d = ""; c > b; b++)
                                d += a[b].value;
                            return d
                        }
                        function rb(a, b, c) {
                            var d = b.dir,
                                e = c && "parentNode" === d,
                                f = x++;
                            return b.first ? function(b, c, f) {
                                    while (b = b[d])
                                        if (1 === b.nodeType || e)
                                            return a(b, c, f)
                                } :
                                function(b, c, g) {
                                    var h, i, j = [w, f];
                                    if (g) {
                                        while (b = b[d])
                                            if ((1 === b.nodeType || e) && a(b, c, g))
                                                return !0
                                    } else
                                        while (b = b[d])
                                            if (1 === b.nodeType || e) {
                                                if (i = b[u] || (b[u] = {}),
                                                    (h = i[d]) && h[0] === w && h[1] === f)
                                                    return j[2] = h[2];
                                                if (i[d] = j,
                                                    j[2] = a(b, c, g))
                                                    return !0
                                            }
                                }
                        }
                        function sb(a) {
                            return a.length > 1 ? function(b, c, d) {
                                    var e = a.length;
                                    while (e--)
                                        if (!a[e](b, c, d))
                                            return !1;
                                    return !0
                                } :
                                a[0]
                        }
                        function tb(a, b, c) {
                            for (var d = 0, e = b.length; e > d; d++)
                                fb(a, b[d], c);
                            return c
                        }
                        function ub(a, b, c, d, e) {
                            for (var f, g = [], h = 0, i = a.length, j = null != b; i > h; h++)
                                (f = a[h]) && (!c || c(f, d, e)) && (g.push(f),
                                    j && b.push(h));
                            return g
                        }
                        function vb(a, b, c, d, e, f) {
                            return d && !d[u] && (d = vb(d)),
                                e && !e[u] && (e = vb(e, f)),
                                hb(function(f, g, h, i) {
                                    var j, k, l, m = [],
                                        n = [],
                                        o = g.length,
                                        p = f || tb(b || "*", h.nodeType ? [h] : h, []),
                                        q = !a || !f && b ? p : ub(p, m, a, h, i),
                                        r = c ? e || (f ? a : o || d) ? [] : g : q;
                                    if (c && c(q, r, h, i),
                                        d) {
                                        j = ub(r, n),
                                            d(j, [], h, i),
                                            k = j.length;
                                        while (k--)
                                            (l = j[k]) && (r[n[k]] = !(q[n[k]] = l))
                                    }
                                    if (f) {
                                        if (e || a) {
                                            if (e) {
                                                j = [],
                                                    k = r.length;
                                                while (k--)
                                                    (l = r[k]) && j.push(q[k] = l);
                                                e(null, r = [], j, i)
                                            }
                                            k = r.length;
                                            while (k--)
                                                (l = r[k]) && (j = e ? K.call(f, l) : m[k]) > -1 && (f[j] = !(g[j] = l))
                                        }
                                    } else
                                        r = ub(r === g ? r.splice(o, r.length) : r),
                                        e ? e(null, g, r, i) : I.apply(g, r)
                                })
                        }
                        function wb(a) {
                            for (var b, c, e, f = a.length, g = d.relative[a[0].type], h = g || d.relative[" "], i = g ? 1 : 0, k = rb(function(a) {
                                    return a === b
                                }, h, !0), l = rb(function(a) {
                                    return K.call(b, a) > -1
                                }, h, !0), m = [function(a, c, d) {
                                    return !g && (d || c !== j) || ((b = c).nodeType ? k(a, c, d) : l(a, c, d))
                                }]; f > i; i++)
                                if (c = d.relative[a[i].type])
                                    m = [rb(sb(m), c)];
                                else {
                                    if (c = d.filter[a[i].type].apply(null, a[i].matches),
                                        c[u]) {
                                        for (e = ++i; f > e; e++)
                                            if (d.relative[a[e].type])
                                                break;
                                        return vb(i > 1 && sb(m), i > 1 && qb(a.slice(0, i - 1).concat({
                                            value: " " === a[i - 2].type ? "*" : ""
                                        })).replace(R, "$1"), c, e > i && wb(a.slice(i, e)), f > e && wb(a = a.slice(e)), f > e && qb(a))
                                    }
                                    m.push(c)
                                }
                            return sb(m)
                        }
                        function xb(a, b) {
                            var c = b.length > 0,
                                e = a.length > 0,
                                f = function(f, g, h, i, k) {
                                    var l, m, o, p = 0,
                                        q = "0",
                                        r = f && [],
                                        s = [],
                                        t = j,
                                        u = f || e && d.find.TAG("*", k),
                                        v = w += null == t ? 1 : Math.random() || .1,
                                        x = u.length;
                                    for (k && (j = g !== n && g); q !== x && null != (l = u[q]); q++) {
                                        if (e && l) {
                                            m = 0;
                                            while (o = a[m++])
                                                if (o(l, g, h)) {
                                                    i.push(l);
                                                    break
                                                }
                                            k && (w = v)
                                        }
                                        c && ((l = !o && l) && p--,
                                            f && r.push(l))
                                    }
                                    if (p += q,
                                        c && q !== p) {
                                        m = 0;
                                        while (o = b[m++])
                                            o(r, s, g, h);
                                        if (f) {
                                            if (p > 0)
                                                while (q--)
                                                    r[q] || s[q] || (s[q] = G.call(i));
                                            s = ub(s)
                                        }
                                        I.apply(i, s),
                                            k && !f && s.length > 0 && p + b.length > 1 && fb.uniqueSort(i)
                                    }
                                    return k && (w = v,
                                            j = t),
                                        r
                                };
                            return c ? hb(f) : f
                        }
                        return h = fb.compile = function(a, b) {
                                var c, d = [],
                                    e = [],
                                    f = A[a + " "];
                                if (!f) {
                                    b || (b = g(a)),
                                        c = b.length;
                                    while (c--)
                                        f = wb(b[c]),
                                        f[u] ? d.push(f) : e.push(f);
                                    f = A(a, xb(e, d)),
                                        f.selector = a
                                }
                                return f
                            },
                            i = fb.select = function(a, b, e, f) {
                                var i, j, k, l, m, n = "function" == typeof a && a,
                                    o = !f && g(a = n.selector || a);
                                if (e = e || [],
                                    1 === o.length) {
                                    if (j = o[0] = o[0].slice(0),
                                        j.length > 2 && "ID" === (k = j[0]).type && c.getById && 9 === b.nodeType && p && d.relative[j[1].type]) {
                                        if (b = (d.find.ID(k.matches[0].replace(cb, db), b) || [])[0], !b)
                                            return e;
                                        n && (b = b.parentNode),
                                            a = a.slice(j.shift().value.length)
                                    }
                                    i = X.needsContext.test(a) ? 0 : j.length;
                                    while (i--) {
                                        if (k = j[i],
                                            d.relative[l = k.type])
                                            break;
                                        if ((m = d.find[l]) && (f = m(k.matches[0].replace(cb, db), ab.test(j[0].type) && ob(b.parentNode) || b))) {
                                            if (j.splice(i, 1),
                                                a = f.length && qb(j), !a)
                                                return I.apply(e, f),
                                                    e;
                                            break
                                        }
                                    }
                                }
                                return (n || h(a, o))(f, b, !p, e, ab.test(a) && ob(b.parentNode) || b),
                                    e
                            },
                            c.sortStable = u.split("").sort(B).join("") === u,
                            c.detectDuplicates = !!l,
                            m(),
                            c.sortDetached = ib(function(a) {
                                return 1 & a.compareDocumentPosition(n.createElement("div"))
                            }),
                            ib(function(a) {
                                return a.innerHTML = "<a href='#'></a>",
                                    "#" === a.firstChild.getAttribute("href")
                            }) || jb("type|href|height|width", function(a, b, c) {
                                return c ? void 0 : a.getAttribute(b, "type" === b.toLowerCase() ? 1 : 2)
                            }),
                            c.attributes && ib(function(a) {
                                return a.innerHTML = "<input/>",
                                    a.firstChild.setAttribute("value", ""),
                                    "" === a.firstChild.getAttribute("value")
                            }) || jb("value", function(a, b, c) {
                                return c || "input" !== a.nodeName.toLowerCase() ? void 0 : a.defaultValue
                            }),
                            ib(function(a) {
                                return null == a.getAttribute("disabled")
                            }) || jb(L, function(a, b, c) {
                                var d;
                                return c ? void 0 : a[b] === !0 ? b.toLowerCase() : (d = a.getAttributeNode(b)) && d.specified ? d.value : null
                            }),
                            fb
                    }(a);
                    n.find = t,
                        n.expr = t.selectors,
                        n.expr[":"] = n.expr.pseudos,
                        n.unique = t.uniqueSort,
                        n.text = t.getText,
                        n.isXMLDoc = t.isXML,
                        n.contains = t.contains;
                    var u = n.expr.match.needsContext,
                        v = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
                        w = /^.[^:#\[\.,]*$/;
                    function x(a, b, c) {
                        if (n.isFunction(b))
                            return n.grep(a, function(a, d) {
                                return !!b.call(a, d, a) !== c
                            });
                        if (b.nodeType)
                            return n.grep(a, function(a) {
                                return a === b !== c
                            });
                        if ("string" == typeof b) {
                            if (w.test(b))
                                return n.filter(b, a, c);
                            b = n.filter(b, a)
                        }
                        return n.grep(a, function(a) {
                            return g.call(b, a) >= 0 !== c
                        })
                    }
                    n.filter = function(a, b, c) {
                            var d = b[0];
                            return c && (a = ":not(" + a + ")"),
                                1 === b.length && 1 === d.nodeType ? n.find.matchesSelector(d, a) ? [d] : [] : n.find.matches(a, n.grep(b, function(a) {
                                    return 1 === a.nodeType
                                }))
                        },
                        n.fn.extend({
                            find: function(a) {
                                var b, c = this.length,
                                    d = [],
                                    e = this;
                                if ("string" != typeof a)
                                    return this.pushStack(n(a).filter(function() {
                                        for (b = 0; c > b; b++)
                                            if (n.contains(e[b], this))
                                                return !0
                                    }));
                                for (b = 0; c > b; b++)
                                    n.find(a, e[b], d);
                                return d = this.pushStack(c > 1 ? n.unique(d) : d),
                                    d.selector = this.selector ? this.selector + " " + a : a,
                                    d
                            },
                            filter: function(a) {
                                return this.pushStack(x(this, a || [], !1))
                            },
                            not: function(a) {
                                return this.pushStack(x(this, a || [], !0))
                            },
                            is: function(a) {
                                return !!x(this, "string" == typeof a && u.test(a) ? n(a) : a || [], !1).length
                            }
                        });
                    var y, z = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
                        A = n.fn.init = function(a, b) {
                            var c, d;
                            if (!a)
                                return this;
                            if ("string" == typeof a) {
                                if (c = "<" === a[0] && ">" === a[a.length - 1] && a.length >= 3 ? [null, a, null] : z.exec(a), !c || !c[1] && b)
                                    return !b || b.jquery ? (b || y).find(a) : this.constructor(b).find(a);
                                if (c[1]) {
                                    if (b = b instanceof n ? b[0] : b,
                                        n.merge(this, n.parseHTML(c[1], b && b.nodeType ? b.ownerDocument || b : l, !0)),
                                        v.test(c[1]) && n.isPlainObject(b))
                                        for (c in b)
                                            n.isFunction(this[c]) ? this[c](b[c]) : this.attr(c, b[c]);
                                    return this
                                }
                                return d = l.getElementById(c[2]),
                                    d && d.parentNode && (this.length = 1,
                                        this[0] = d),
                                    this.context = l,
                                    this.selector = a,
                                    this
                            }
                            return a.nodeType ? (this.context = this[0] = a,
                                this.length = 1,
                                this) : n.isFunction(a) ? "undefined" != typeof y.ready ? y.ready(a) : a(n) : (void 0 !== a.selector && (this.selector = a.selector,
                                    this.context = a.context),
                                n.makeArray(a, this))
                        };
                    A.prototype = n.fn,
                        y = n(l);
                    var B = /^(?:parents|prev(?:Until|All))/,
                        C = {
                            children: !0,
                            contents: !0,
                            next: !0,
                            prev: !0
                        };
                    n.extend({
                            dir: function(a, b, c) {
                                var d = [],
                                    e = void 0 !== c;
                                while ((a = a[b]) && 9 !== a.nodeType)
                                    if (1 === a.nodeType) {
                                        if (e && n(a).is(c))
                                            break;
                                        d.push(a)
                                    }
                                return d
                            },
                            sibling: function(a, b) {
                                for (var c = []; a; a = a.nextSibling)
                                    1 === a.nodeType && a !== b && c.push(a);
                                return c
                            }
                        }),
                        n.fn.extend({
                            has: function(a) {
                                var b = n(a, this),
                                    c = b.length;
                                return this.filter(function() {
                                    for (var a = 0; c > a; a++)
                                        if (n.contains(this, b[a]))
                                            return !0
                                })
                            },
                            closest: function(a, b) {
                                for (var c, d = 0, e = this.length, f = [], g = u.test(a) || "string" != typeof a ? n(a, b || this.context) : 0; e > d; d++)
                                    for (c = this[d]; c && c !== b; c = c.parentNode)
                                        if (c.nodeType < 11 && (g ? g.index(c) > -1 : 1 === c.nodeType && n.find.matchesSelector(c, a))) {
                                            f.push(c);
                                            break
                                        }
                                return this.pushStack(f.length > 1 ? n.unique(f) : f)
                            },
                            index: function(a) {
                                return a ? "string" == typeof a ? g.call(n(a), this[0]) : g.call(this, a.jquery ? a[0] : a) : this[0] && this[0].parentNode ? this.first().prevAll().length : -1
                            },
                            add: function(a, b) {
                                return this.pushStack(n.unique(n.merge(this.get(), n(a, b))))
                            },
                            addBack: function(a) {
                                return this.add(null == a ? this.prevObject : this.prevObject.filter(a))
                            }
                        });
                    function D(a, b) {
                        while ((a = a[b]) && 1 !== a.nodeType)
                        ;
                        return a
                    }
                    n.each({
                        parent: function(a) {
                            var b = a.parentNode;
                            return b && 11 !== b.nodeType ? b : null
                        },
                        parents: function(a) {
                            return n.dir(a, "parentNode")
                        },
                        parentsUntil: function(a, b, c) {
                            return n.dir(a, "parentNode", c)
                        },
                        next: function(a) {
                            return D(a, "nextSibling")
                        },
                        prev: function(a) {
                            return D(a, "previousSibling")
                        },
                        nextAll: function(a) {
                            return n.dir(a, "nextSibling")
                        },
                        prevAll: function(a) {
                            return n.dir(a, "previousSibling")
                        },
                        nextUntil: function(a, b, c) {
                            return n.dir(a, "nextSibling", c)
                        },
                        prevUntil: function(a, b, c) {
                            return n.dir(a, "previousSibling", c)
                        },
                        siblings: function(a) {
                            return n.sibling((a.parentNode || {}).firstChild, a)
                        },
                        children: function(a) {
                            return n.sibling(a.firstChild)
                        },
                        contents: function(a) {
                            return a.contentDocument || n.merge([], a.childNodes)
                        }
                    }, function(a, b) {
                        n.fn[a] = function(c, d) {
                            var e = n.map(this, b, c);
                            return "Until" !== a.slice(-5) && (d = c),
                                d && "string" == typeof d && (e = n.filter(d, e)),
                                this.length > 1 && (C[a] || n.unique(e),
                                    B.test(a) && e.reverse()),
                                this.pushStack(e)
                        }
                    });
                    var E = /\S+/g,
                        F = {};
                    function G(a) {
                        var b = F[a] = {};
                        return n.each(a.match(E) || [], function(a, c) {
                                b[c] = !0
                            }),
                            b
                    }
                    n.Callbacks = function(a) {
                            a = "string" == typeof a ? F[a] || G(a) : n.extend({}, a);
                            var b, c, d, e, f, g, h = [],
                                i = !a.once && [],
                                j = function(l) {
                                    for (b = a.memory && l,
                                        c = !0,
                                        g = e || 0,
                                        e = 0,
                                        f = h.length,
                                        d = !0; h && f > g; g++)
                                        if (h[g].apply(l[0], l[1]) === !1 && a.stopOnFalse) {
                                            b = !1;
                                            break
                                        }
                                    d = !1,
                                        h && (i ? i.length && j(i.shift()) : b ? h = [] : k.disable())
                                },
                                k = {
                                    add: function() {
                                        if (h) {
                                            var c = h.length;
                                            ! function g(b) {
                                                n.each(b, function(b, c) {
                                                    var d = n.type(c);
                                                    "function" === d ? a.unique && k.has(c) || h.push(c) : c && c.length && "string" !== d && g(c)
                                                })
                                            }(arguments),
                                            d ? f = h.length : b && (e = c,
                                                j(b))
                                        }
                                        return this
                                    },
                                    remove: function() {
                                        return h && n.each(arguments, function(a, b) {
                                                var c;
                                                while ((c = n.inArray(b, h, c)) > -1)
                                                    h.splice(c, 1),
                                                    d && (f >= c && f--,
                                                        g >= c && g--)
                                            }),
                                            this
                                    },
                                    has: function(a) {
                                        return a ? n.inArray(a, h) > -1 : !(!h || !h.length)
                                    },
                                    empty: function() {
                                        return h = [],
                                            f = 0,
                                            this
                                    },
                                    disable: function() {
                                        return h = i = b = void 0,
                                            this
                                    },
                                    disabled: function() {
                                        return !h
                                    },
                                    lock: function() {
                                        return i = void 0,
                                            b || k.disable(),
                                            this
                                    },
                                    locked: function() {
                                        return !i
                                    },
                                    fireWith: function(a, b) {
                                        return !h || c && !i || (b = b || [],
                                                b = [a, b.slice ? b.slice() : b],
                                                d ? i.push(b) : j(b)),
                                            this
                                    },
                                    fire: function() {
                                        return k.fireWith(this, arguments),
                                            this
                                    },
                                    fired: function() {
                                        return !!c
                                    }
                                };
                            return k
                        },
                        n.extend({
                            Deferred: function(a) {
                                var b = [
                                        ["resolve", "done", n.Callbacks("once memory"), "resolved"],
                                        ["reject", "fail", n.Callbacks("once memory"), "rejected"],
                                        ["notify", "progress", n.Callbacks("memory")]
                                    ],
                                    c = "pending",
                                    d = {
                                        state: function() {
                                            return c
                                        },
                                        always: function() {
                                            return e.done(arguments).fail(arguments),
                                                this
                                        },
                                        then: function() {
                                            var a = arguments;
                                            return n.Deferred(function(c) {
                                                n.each(b, function(b, f) {
                                                        var g = n.isFunction(a[b]) && a[b];
                                                        e[f[1]](function() {
                                                            var a = g && g.apply(this, arguments);
                                                            a && n.isFunction(a.promise) ? a.promise().done(c.resolve).fail(c.reject).progress(c.notify) : c[f[0] + "With"](this === d ? c.promise() : this, g ? [a] : arguments)
                                                        })
                                                    }),
                                                    a = null
                                            }).promise()
                                        },
                                        promise: function(a) {
                                            return null != a ? n.extend(a, d) : d
                                        }
                                    },
                                    e = {};
                                return d.pipe = d.then,
                                    n.each(b, function(a, f) {
                                        var g = f[2],
                                            h = f[3];
                                        d[f[1]] = g.add,
                                            h && g.add(function() {
                                                c = h
                                            }, b[1 ^ a][2].disable, b[2][2].lock),
                                            e[f[0]] = function() {
                                                return e[f[0] + "With"](this === e ? d : this, arguments),
                                                    this
                                            },
                                            e[f[0] + "With"] = g.fireWith
                                    }),
                                    d.promise(e),
                                    a && a.call(e, e),
                                    e
                            },
                            when: function(a) {
                                var b = 0,
                                    c = d.call(arguments),
                                    e = c.length,
                                    f = 1 !== e || a && n.isFunction(a.promise) ? e : 0,
                                    g = 1 === f ? a : n.Deferred(),
                                    h = function(a, b, c) {
                                        return function(e) {
                                            b[a] = this,
                                                c[a] = arguments.length > 1 ? d.call(arguments) : e,
                                                c === i ? g.notifyWith(b, c) : --f || g.resolveWith(b, c)
                                        }
                                    },
                                    i, j, k;
                                if (e > 1)
                                    for (i = new Array(e),
                                        j = new Array(e),
                                        k = new Array(e); e > b; b++)
                                        c[b] && n.isFunction(c[b].promise) ? c[b].promise().done(h(b, k, c)).fail(g.reject).progress(h(b, j, i)) : --f;
                                return f || g.resolveWith(k, c),
                                    g.promise()
                            }
                        });
                    var H;
                    n.fn.ready = function(a) {
                            return n.ready.promise().done(a),
                                this
                        },
                        n.extend({
                            isReady: !1,
                            readyWait: 1,
                            holdReady: function(a) {
                                a ? n.readyWait++ : n.ready(!0)
                            },
                            ready: function(a) {
                                (a === !0 ? --n.readyWait : n.isReady) || (n.isReady = !0,
                                    a !== !0 && --n.readyWait > 0 || (H.resolveWith(l, [n]),
                                        n.fn.triggerHandler && (n(l).triggerHandler("ready"),
                                            n(l).off("ready"))))
                            }
                        });
                    function I() {
                        l.removeEventListener("DOMContentLoaded", I, !1),
                            a.removeEventListener("load", I, !1),
                            n.ready()
                    }
                    n.ready.promise = function(b) {
                            return H || (H = n.Deferred(),
                                    "complete" === l.readyState ? setTimeout(n.ready) : (l.addEventListener("DOMContentLoaded", I, !1),
                                        a.addEventListener("load", I, !1))),
                                H.promise(b)
                        },
                        n.ready.promise();
                    var J = n.access = function(a, b, c, d, e, f, g) {
                        var h = 0,
                            i = a.length,
                            j = null == c;
                        if ("object" === n.type(c)) {
                            e = !0;
                            for (h in c)
                                n.access(a, b, h, c[h], !0, f, g)
                        } else if (void 0 !== d && (e = !0,
                                n.isFunction(d) || (g = !0),
                                j && (g ? (b.call(a, d),
                                    b = null) : (j = b,
                                    b = function(a, b, c) {
                                        return j.call(n(a), c)
                                    }
                                )),
                                b))
                            for (; i > h; h++)
                                b(a[h], c, g ? d : d.call(a[h], h, b(a[h], c)));
                        return e ? a : j ? b.call(a) : i ? b(a[0], c) : f
                    };
                    n.acceptData = function(a) {
                        return 1 === a.nodeType || 9 === a.nodeType || !+a.nodeType
                    };
                    function K() {
                        Object.defineProperty(this.cache = {}, 0, {
                                get: function() {
                                    return {}
                                }
                            }),
                            this.expando = n.expando + Math.random()
                    }
                    K.uid = 1,
                        K.accepts = n.acceptData,
                        K.prototype = {
                            key: function(a) {
                                if (!K.accepts(a))
                                    return 0;
                                var b = {},
                                    c = a[this.expando];
                                if (!c) {
                                    c = K.uid++;
                                    try {
                                        b[this.expando] = {
                                                value: c
                                            },
                                            Object.defineProperties(a, b)
                                    } catch (d) {
                                        b[this.expando] = c,
                                            n.extend(a, b)
                                    }
                                }
                                return this.cache[c] || (this.cache[c] = {}),
                                    c
                            },
                            set: function(a, b, c) {
                                var d, e = this.key(a),
                                    f = this.cache[e];
                                if ("string" == typeof b)
                                    f[b] = c;
                                else if (n.isEmptyObject(f))
                                    n.extend(this.cache[e], b);
                                else
                                    for (d in b)
                                        f[d] = b[d];
                                return f
                            },
                            get: function(a, b) {
                                var c = this.cache[this.key(a)];
                                return void 0 === b ? c : c[b]
                            },
                            access: function(a, b, c) {
                                var d;
                                return void 0 === b || b && "string" == typeof b && void 0 === c ? (d = this.get(a, b),
                                    void 0 !== d ? d : this.get(a, n.camelCase(b))) : (this.set(a, b, c),
                                    void 0 !== c ? c : b)
                            },
                            remove: function(a, b) {
                                var c, d, e, f = this.key(a),
                                    g = this.cache[f];
                                if (void 0 === b)
                                    this.cache[f] = {};
                                else {
                                    n.isArray(b) ? d = b.concat(b.map(n.camelCase)) : (e = n.camelCase(b),
                                            b in g ? d = [b, e] : (d = e,
                                                d = d in g ? [d] : d.match(E) || [])),
                                        c = d.length;
                                    while (c--)
                                        delete g[d[c]]
                                }
                            },
                            hasData: function(a) {
                                return !n.isEmptyObject(this.cache[a[this.expando]] || {})
                            },
                            discard: function(a) {
                                a[this.expando] && delete this.cache[a[this.expando]]
                            }
                        };
                    var L = new K,
                        M = new K,
                        N = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
                        O = /([A-Z])/g;
                    function P(a, b, c) {
                        var d;
                        if (void 0 === c && 1 === a.nodeType)
                            if (d = "data-" + b.replace(O, "-$1").toLowerCase(),
                                c = a.getAttribute(d),
                                "string" == typeof c) {
                                try {
                                    c = "true" === c ? !0 : "false" === c ? !1 : "null" === c ? null : +c + "" === c ? +c : N.test(c) ? n.parseJSON(c) : c
                                } catch (e) {}
                                M.set(a, b, c)
                            } else
                                c = void 0;
                        return c
                    }
                    n.extend({
                            hasData: function(a) {
                                return M.hasData(a) || L.hasData(a)
                            },
                            data: function(a, b, c) {
                                return M.access(a, b, c)
                            },
                            removeData: function(a, b) {
                                M.remove(a, b)
                            },
                            _data: function(a, b, c) {
                                return L.access(a, b, c)
                            },
                            _removeData: function(a, b) {
                                L.remove(a, b)
                            }
                        }),
                        n.fn.extend({
                            data: function(a, b) {
                                var c, d, e, f = this[0],
                                    g = f && f.attributes;
                                if (void 0 === a) {
                                    if (this.length && (e = M.get(f),
                                            1 === f.nodeType && !L.get(f, "hasDataAttrs"))) {
                                        c = g.length;
                                        while (c--)
                                            g[c] && (d = g[c].name,
                                                0 === d.indexOf("data-") && (d = n.camelCase(d.slice(5)),
                                                    P(f, d, e[d])));
                                        L.set(f, "hasDataAttrs", !0)
                                    }
                                    return e
                                }
                                return "object" == typeof a ? this.each(function() {
                                    M.set(this, a)
                                }) : J(this, function(b) {
                                    var c, d = n.camelCase(a);
                                    if (f && void 0 === b) {
                                        if (c = M.get(f, a),
                                            void 0 !== c)
                                            return c;
                                        if (c = M.get(f, d),
                                            void 0 !== c)
                                            return c;
                                        if (c = P(f, d, void 0),
                                            void 0 !== c)
                                            return c
                                    } else
                                        this.each(function() {
                                            var c = M.get(this, d);
                                            M.set(this, d, b), -1 !== a.indexOf("-") && void 0 !== c && M.set(this, a, b)
                                        })
                                }, null, b, arguments.length > 1, null, !0)
                            },
                            removeData: function(a) {
                                return this.each(function() {
                                    M.remove(this, a)
                                })
                            }
                        }),
                        n.extend({
                            queue: function(a, b, c) {
                                var d;
                                return a ? (b = (b || "fx") + "queue",
                                    d = L.get(a, b),
                                    c && (!d || n.isArray(c) ? d = L.access(a, b, n.makeArray(c)) : d.push(c)),
                                    d || []) : void 0
                            },
                            dequeue: function(a, b) {
                                b = b || "fx";
                                var c = n.queue(a, b),
                                    d = c.length,
                                    e = c.shift(),
                                    f = n._queueHooks(a, b),
                                    g = function() {
                                        n.dequeue(a, b)
                                    };
                                "inprogress" === e && (e = c.shift(),
                                        d--),
                                    e && ("fx" === b && c.unshift("inprogress"),
                                        delete f.stop,
                                        e.call(a, g, f)), !d && f && f.empty.fire()
                            },
                            _queueHooks: function(a, b) {
                                var c = b + "queueHooks";
                                return L.get(a, c) || L.access(a, c, {
                                    empty: n.Callbacks("once memory").add(function() {
                                        L.remove(a, [b + "queue", c])
                                    })
                                })
                            }
                        }),
                        n.fn.extend({
                            queue: function(a, b) {
                                var c = 2;
                                return "string" != typeof a && (b = a,
                                        a = "fx",
                                        c--),
                                    arguments.length < c ? n.queue(this[0], a) : void 0 === b ? this : this.each(function() {
                                        var c = n.queue(this, a, b);
                                        n._queueHooks(this, a),
                                            "fx" === a && "inprogress" !== c[0] && n.dequeue(this, a)
                                    })
                            },
                            dequeue: function(a) {
                                return this.each(function() {
                                    n.dequeue(this, a)
                                })
                            },
                            clearQueue: function(a) {
                                return this.queue(a || "fx", [])
                            },
                            promise: function(a, b) {
                                var c, d = 1,
                                    e = n.Deferred(),
                                    f = this,
                                    g = this.length,
                                    h = function() {
                                        --d || e.resolveWith(f, [f])
                                    };
                                "string" != typeof a && (b = a,
                                        a = void 0),
                                    a = a || "fx";
                                while (g--)
                                    c = L.get(f[g], a + "queueHooks"),
                                    c && c.empty && (d++,
                                        c.empty.add(h));
                                return h(),
                                    e.promise(b)
                            }
                        });
                    var Q = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
                        R = ["Top", "Right", "Bottom", "Left"],
                        S = function(a, b) {
                            return a = b || a,
                                "none" === n.css(a, "display") || !n.contains(a.ownerDocument, a)
                        },
                        T = /^(?:checkbox|radio)$/i;
                    ! function() {
                        var a = l.createDocumentFragment(),
                            b = a.appendChild(l.createElement("div")),
                            c = l.createElement("input");
                        c.setAttribute("type", "radio"),
                            c.setAttribute("checked", "checked"),
                            c.setAttribute("name", "t"),
                            b.appendChild(c),
                            k.checkClone = b.cloneNode(!0).cloneNode(!0).lastChild.checked,
                            b.innerHTML = "<textarea>x</textarea>",
                            k.noCloneChecked = !!b.cloneNode(!0).lastChild.defaultValue
                    }();
                    var U = "undefined";
                    k.focusinBubbles = "onfocusin" in a;
                    var V = /^key/,
                        W = /^(?:mouse|pointer|contextmenu)|click/,
                        X = /^(?:focusinfocus|focusoutblur)$/,
                        Y = /^([^.]*)(?:\.(.+)|)$/;
                    function Z() {
                        return !0
                    }
                    function $() {
                        return !1
                    }
                    function _() {
                        try {
                            return l.activeElement
                        } catch (a) {}
                    }
                    n.event = {
                            global: {},
                            add: function(a, b, c, d, e) {
                                var f, g, h, i, j, k, l, m, o, p, q, r = L.get(a);
                                if (r) {
                                    c.handler && (f = c,
                                            c = f.handler,
                                            e = f.selector),
                                        c.guid || (c.guid = n.guid++),
                                        (i = r.events) || (i = r.events = {}),
                                        (g = r.handle) || (g = r.handle = function(b) {
                                            return typeof n !== U && n.event.triggered !== b.type ? n.event.dispatch.apply(a, arguments) : void 0
                                        }),
                                        b = (b || "").match(E) || [""],
                                        j = b.length;
                                    while (j--)
                                        h = Y.exec(b[j]) || [],
                                        o = q = h[1],
                                        p = (h[2] || "").split(".").sort(),
                                        o && (l = n.event.special[o] || {},
                                            o = (e ? l.delegateType : l.bindType) || o,
                                            l = n.event.special[o] || {},
                                            k = n.extend({
                                                type: o,
                                                origType: q,
                                                data: d,
                                                handler: c,
                                                guid: c.guid,
                                                selector: e,
                                                needsContext: e && n.expr.match.needsContext.test(e),
                                                namespace: p.join(".")
                                            }, f),
                                            (m = i[o]) || (m = i[o] = [],
                                                m.delegateCount = 0,
                                                l.setup && l.setup.call(a, d, p, g) !== !1 || a.addEventListener && a.addEventListener(o, g, !1)),
                                            l.add && (l.add.call(a, k),
                                                k.handler.guid || (k.handler.guid = c.guid)),
                                            e ? m.splice(m.delegateCount++, 0, k) : m.push(k),
                                            n.event.global[o] = !0)
                                }
                            },
                            remove: function(a, b, c, d, e) {
                                var f, g, h, i, j, k, l, m, o, p, q, r = L.hasData(a) && L.get(a);
                                if (r && (i = r.events)) {
                                    b = (b || "").match(E) || [""],
                                        j = b.length;
                                    while (j--)
                                        if (h = Y.exec(b[j]) || [],
                                            o = q = h[1],
                                            p = (h[2] || "").split(".").sort(),
                                            o) {
                                            l = n.event.special[o] || {},
                                                o = (d ? l.delegateType : l.bindType) || o,
                                                m = i[o] || [],
                                                h = h[2] && new RegExp("(^|\\.)" + p.join("\\.(?:.*\\.|)") + "(\\.|$)"),
                                                g = f = m.length;
                                            while (f--)
                                                k = m[f], !e && q !== k.origType || c && c.guid !== k.guid || h && !h.test(k.namespace) || d && d !== k.selector && ("**" !== d || !k.selector) || (m.splice(f, 1),
                                                    k.selector && m.delegateCount--,
                                                    l.remove && l.remove.call(a, k));
                                            g && !m.length && (l.teardown && l.teardown.call(a, p, r.handle) !== !1 || n.removeEvent(a, o, r.handle),
                                                delete i[o])
                                        } else
                                            for (o in i)
                                                n.event.remove(a, o + b[j], c, d, !0);
                                    n.isEmptyObject(i) && (delete r.handle,
                                        L.remove(a, "events"))
                                }
                            },
                            trigger: function(b, c, d, e) {
                                var f, g, h, i, k, m, o, p = [d || l],
                                    q = j.call(b, "type") ? b.type : b,
                                    r = j.call(b, "namespace") ? b.namespace.split(".") : [];
                                if (g = h = d = d || l,
                                    3 !== d.nodeType && 8 !== d.nodeType && !X.test(q + n.event.triggered) && (q.indexOf(".") >= 0 && (r = q.split("."),
                                            q = r.shift(),
                                            r.sort()),
                                        k = q.indexOf(":") < 0 && "on" + q,
                                        b = b[n.expando] ? b : new n.Event(q, "object" == typeof b && b),
                                        b.isTrigger = e ? 2 : 3,
                                        b.namespace = r.join("."),
                                        b.namespace_re = b.namespace ? new RegExp("(^|\\.)" + r.join("\\.(?:.*\\.|)") + "(\\.|$)") : null,
                                        b.result = void 0,
                                        b.target || (b.target = d),
                                        c = null == c ? [b] : n.makeArray(c, [b]),
                                        o = n.event.special[q] || {},
                                        e || !o.trigger || o.trigger.apply(d, c) !== !1)) {
                                    if (!e && !o.noBubble && !n.isWindow(d)) {
                                        for (i = o.delegateType || q,
                                            X.test(i + q) || (g = g.parentNode); g; g = g.parentNode)
                                            p.push(g),
                                            h = g;
                                        h === (d.ownerDocument || l) && p.push(h.defaultView || h.parentWindow || a)
                                    }
                                    f = 0;
                                    while ((g = p[f++]) && !b.isPropagationStopped())
                                        b.type = f > 1 ? i : o.bindType || q,
                                        m = (L.get(g, "events") || {})[b.type] && L.get(g, "handle"),
                                        m && m.apply(g, c),
                                        m = k && g[k],
                                        m && m.apply && n.acceptData(g) && (b.result = m.apply(g, c),
                                            b.result === !1 && b.preventDefault());
                                    return b.type = q,
                                        e || b.isDefaultPrevented() || o._default && o._default.apply(p.pop(), c) !== !1 || !n.acceptData(d) || k && n.isFunction(d[q]) && !n.isWindow(d) && (h = d[k],
                                            h && (d[k] = null),
                                            n.event.triggered = q,
                                            d[q](),
                                            n.event.triggered = void 0,
                                            h && (d[k] = h)),
                                        b.result
                                }
                            },
                            dispatch: function(a) {
                                a = n.event.fix(a);
                                var b, c, e, f, g, h = [],
                                    i = d.call(arguments),
                                    j = (L.get(this, "events") || {})[a.type] || [],
                                    k = n.event.special[a.type] || {};
                                if (i[0] = a,
                                    a.delegateTarget = this, !k.preDispatch || k.preDispatch.call(this, a) !== !1) {
                                    h = n.event.handlers.call(this, a, j),
                                        b = 0;
                                    while ((f = h[b++]) && !a.isPropagationStopped()) {
                                        a.currentTarget = f.elem,
                                            c = 0;
                                        while ((g = f.handlers[c++]) && !a.isImmediatePropagationStopped())
                                            (!a.namespace_re || a.namespace_re.test(g.namespace)) && (a.handleObj = g,
                                                a.data = g.data,
                                                e = ((n.event.special[g.origType] || {}).handle || g.handler).apply(f.elem, i),
                                                void 0 !== e && (a.result = e) === !1 && (a.preventDefault(),
                                                    a.stopPropagation()))
                                    }
                                    return k.postDispatch && k.postDispatch.call(this, a),
                                        a.result
                                }
                            },
                            handlers: function(a, b) {
                                var c, d, e, f, g = [],
                                    h = b.delegateCount,
                                    i = a.target;
                                if (h && i.nodeType && (!a.button || "click" !== a.type))
                                    for (; i !== this; i = i.parentNode || this)
                                        if (i.disabled !== !0 || "click" !== a.type) {
                                            for (d = [],
                                                c = 0; h > c; c++)
                                                f = b[c],
                                                e = f.selector + " ",
                                                void 0 === d[e] && (d[e] = f.needsContext ? n(e, this).index(i) >= 0 : n.find(e, this, null, [i]).length),
                                                d[e] && d.push(f);
                                            d.length && g.push({
                                                elem: i,
                                                handlers: d
                                            })
                                        }
                                return h < b.length && g.push({
                                        elem: this,
                                        handlers: b.slice(h)
                                    }),
                                    g
                            },
                            props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
                            fixHooks: {},
                            keyHooks: {
                                props: "char charCode key keyCode".split(" "),
                                filter: function(a, b) {
                                    return null == a.which && (a.which = null != b.charCode ? b.charCode : b.keyCode),
                                        a
                                }
                            },
                            mouseHooks: {
                                props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
                                filter: function(a, b) {
                                    var c, d, e, f = b.button;
                                    return null == a.pageX && null != b.clientX && (c = a.target.ownerDocument || l,
                                            d = c.documentElement,
                                            e = c.body,
                                            a.pageX = b.clientX + (d && d.scrollLeft || e && e.scrollLeft || 0) - (d && d.clientLeft || e && e.clientLeft || 0),
                                            a.pageY = b.clientY + (d && d.scrollTop || e && e.scrollTop || 0) - (d && d.clientTop || e && e.clientTop || 0)),
                                        a.which || void 0 === f || (a.which = 1 & f ? 1 : 2 & f ? 3 : 4 & f ? 2 : 0),
                                        a
                                }
                            },
                            fix: function(a) {
                                if (a[n.expando])
                                    return a;
                                var b, c, d, e = a.type,
                                    f = a,
                                    g = this.fixHooks[e];
                                g || (this.fixHooks[e] = g = W.test(e) ? this.mouseHooks : V.test(e) ? this.keyHooks : {}),
                                    d = g.props ? this.props.concat(g.props) : this.props,
                                    a = new n.Event(f),
                                    b = d.length;
                                while (b--)
                                    c = d[b],
                                    a[c] = f[c];
                                return a.target || (a.target = l),
                                    3 === a.target.nodeType && (a.target = a.target.parentNode),
                                    g.filter ? g.filter(a, f) : a
                            },
                            special: {
                                load: {
                                    noBubble: !0
                                },
                                focus: {
                                    trigger: function() {
                                        return this !== _() && this.focus ? (this.focus(), !1) : void 0
                                    },
                                    delegateType: "focusin"
                                },
                                blur: {
                                    trigger: function() {
                                        return this === _() && this.blur ? (this.blur(), !1) : void 0
                                    },
                                    delegateType: "focusout"
                                },
                                click: {
                                    trigger: function() {
                                        return "checkbox" === this.type && this.click && n.nodeName(this, "input") ? (this.click(), !1) : void 0
                                    },
                                    _default: function(a) {
                                        return n.nodeName(a.target, "a")
                                    }
                                },
                                beforeunload: {
                                    postDispatch: function(a) {
                                        void 0 !== a.result && a.originalEvent && (a.originalEvent.returnValue = a.result)
                                    }
                                }
                            },
                            simulate: function(a, b, c, d) {
                                var e = n.extend(new n.Event, c, {
                                    type: a,
                                    isSimulated: !0,
                                    originalEvent: {}
                                });
                                d ? n.event.trigger(e, null, b) : n.event.dispatch.call(b, e),
                                    e.isDefaultPrevented() && c.preventDefault()
                            }
                        },
                        n.removeEvent = function(a, b, c) {
                            a.removeEventListener && a.removeEventListener(b, c, !1)
                        },
                        n.Event = function(a, b) {
                            return this instanceof n.Event ? (a && a.type ? (this.originalEvent = a,
                                    this.type = a.type,
                                    this.isDefaultPrevented = a.defaultPrevented || void 0 === a.defaultPrevented && a.returnValue === !1 ? Z : $) : this.type = a,
                                b && n.extend(this, b),
                                this.timeStamp = a && a.timeStamp || n.now(),
                                void(this[n.expando] = !0)) : new n.Event(a, b)
                        },
                        n.Event.prototype = {
                            isDefaultPrevented: $,
                            isPropagationStopped: $,
                            isImmediatePropagationStopped: $,
                            preventDefault: function() {
                                var a = this.originalEvent;
                                this.isDefaultPrevented = Z,
                                    a && a.preventDefault && a.preventDefault()
                            },
                            stopPropagation: function() {
                                var a = this.originalEvent;
                                this.isPropagationStopped = Z,
                                    a && a.stopPropagation && a.stopPropagation()
                            },
                            stopImmediatePropagation: function() {
                                var a = this.originalEvent;
                                this.isImmediatePropagationStopped = Z,
                                    a && a.stopImmediatePropagation && a.stopImmediatePropagation(),
                                    this.stopPropagation()
                            }
                        },
                        n.each({
                            mouseenter: "mouseover",
                            mouseleave: "mouseout",
                            pointerenter: "pointerover",
                            pointerleave: "pointerout"
                        }, function(a, b) {
                            n.event.special[a] = {
                                delegateType: b,
                                bindType: b,
                                handle: function(a) {
                                    var c, d = this,
                                        e = a.relatedTarget,
                                        f = a.handleObj;
                                    return (!e || e !== d && !n.contains(d, e)) && (a.type = f.origType,
                                            c = f.handler.apply(this, arguments),
                                            a.type = b),
                                        c
                                }
                            }
                        }),
                        k.focusinBubbles || n.each({
                            focus: "focusin",
                            blur: "focusout"
                        }, function(a, b) {
                            var c = function(a) {
                                n.event.simulate(b, a.target, n.event.fix(a), !0)
                            };
                            n.event.special[b] = {
                                setup: function() {
                                    var d = this.ownerDocument || this,
                                        e = L.access(d, b);
                                    e || d.addEventListener(a, c, !0),
                                        L.access(d, b, (e || 0) + 1)
                                },
                                teardown: function() {
                                    var d = this.ownerDocument || this,
                                        e = L.access(d, b) - 1;
                                    e ? L.access(d, b, e) : (d.removeEventListener(a, c, !0),
                                        L.remove(d, b))
                                }
                            }
                        }),
                        n.fn.extend({
                            on: function(a, b, c, d, e) {
                                var f, g;
                                if ("object" == typeof a) {
                                    "string" != typeof b && (c = c || b,
                                        b = void 0);
                                    for (g in a)
                                        this.on(g, b, c, a[g], e);
                                    return this
                                }
                                if (null == c && null == d ? (d = b,
                                        c = b = void 0) : null == d && ("string" == typeof b ? (d = c,
                                        c = void 0) : (d = c,
                                        c = b,
                                        b = void 0)),
                                    d === !1)
                                    d = $;
                                else if (!d)
                                    return this;
                                return 1 === e && (f = d,
                                        d = function(a) {
                                            return n().off(a),
                                                f.apply(this, arguments)
                                        },
                                        d.guid = f.guid || (f.guid = n.guid++)),
                                    this.each(function() {
                                        n.event.add(this, a, d, c, b)
                                    })
                            },
                            one: function(a, b, c, d) {
                                return this.on(a, b, c, d, 1)
                            },
                            off: function(a, b, c) {
                                var d, e;
                                if (a && a.preventDefault && a.handleObj)
                                    return d = a.handleObj,
                                        n(a.delegateTarget).off(d.namespace ? d.origType + "." + d.namespace : d.origType, d.selector, d.handler),
                                        this;
                                if ("object" == typeof a) {
                                    for (e in a)
                                        this.off(e, b, a[e]);
                                    return this
                                }
                                return (b === !1 || "function" == typeof b) && (c = b,
                                        b = void 0),
                                    c === !1 && (c = $),
                                    this.each(function() {
                                        n.event.remove(this, a, c, b)
                                    })
                            },
                            trigger: function(a, b) {
                                return this.each(function() {
                                    n.event.trigger(a, b, this)
                                })
                            },
                            triggerHandler: function(a, b) {
                                var c = this[0];
                                return c ? n.event.trigger(a, b, c, !0) : void 0
                            }
                        });
                    var ab = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
                        bb = /<([\w:]+)/,
                        cb = /<|&#?\w+;/,
                        db = /<(?:script|style|link)/i,
                        eb = /checked\s*(?:[^=]|=\s*.checked.)/i,
                        fb = /^$|\/(?:java|ecma)script/i,
                        gb = /^true\/(.*)/,
                        hb = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
                        ib = {
                            option: [1, "<select multiple='multiple'>", "</select>"],
                            thead: [1, "<table>", "</table>"],
                            col: [2, "<table><colgroup>", "</colgroup></table>"],
                            tr: [2, "<table><tbody>", "</tbody></table>"],
                            td: [3, "<table><tbody><tr>", "</tr></tbody></table>"],
                            _default: [0, "", ""]
                        };
                    ib.optgroup = ib.option,
                        ib.tbody = ib.tfoot = ib.colgroup = ib.caption = ib.thead,
                        ib.th = ib.td;
                    function jb(a, b) {
                        return n.nodeName(a, "table") && n.nodeName(11 !== b.nodeType ? b : b.firstChild, "tr") ? a.getElementsByTagName("tbody")[0] || a.appendChild(a.ownerDocument.createElement("tbody")) : a
                    }
                    function kb(a) {
                        return a.type = (null !== a.getAttribute("type")) + "/" + a.type,
                            a
                    }
                    function lb(a) {
                        var b = gb.exec(a.type);
                        return b ? a.type = b[1] : a.removeAttribute("type"),
                            a
                    }
                    function mb(a, b) {
                        for (var c = 0, d = a.length; d > c; c++)
                            L.set(a[c], "globalEval", !b || L.get(b[c], "globalEval"))
                    }
                    function nb(a, b) {
                        var c, d, e, f, g, h, i, j;
                        if (1 === b.nodeType) {
                            if (L.hasData(a) && (f = L.access(a),
                                    g = L.set(b, f),
                                    j = f.events)) {
                                delete g.handle,
                                    g.events = {};
                                for (e in j)
                                    for (c = 0,
                                        d = j[e].length; d > c; c++)
                                        n.event.add(b, e, j[e][c])
                            }
                            M.hasData(a) && (h = M.access(a),
                                i = n.extend({}, h),
                                M.set(b, i))
                        }
                    }
                    function ob(a, b) {
                        var c = a.getElementsByTagName ? a.getElementsByTagName(b || "*") : a.querySelectorAll ? a.querySelectorAll(b || "*") : [];
                        return void 0 === b || b && n.nodeName(a, b) ? n.merge([a], c) : c
                    }
                    function pb(a, b) {
                        var c = b.nodeName.toLowerCase();
                        "input" === c && T.test(a.type) ? b.checked = a.checked : ("input" === c || "textarea" === c) && (b.defaultValue = a.defaultValue)
                    }
                    n.extend({
                            clone: function(a, b, c) {
                                var d, e, f, g, h = a.cloneNode(!0),
                                    i = n.contains(a.ownerDocument, a);
                                if (!(k.noCloneChecked || 1 !== a.nodeType && 11 !== a.nodeType || n.isXMLDoc(a)))
                                    for (g = ob(h),
                                        f = ob(a),
                                        d = 0,
                                        e = f.length; e > d; d++)
                                        pb(f[d], g[d]);
                                if (b)
                                    if (c)
                                        for (f = f || ob(a),
                                            g = g || ob(h),
                                            d = 0,
                                            e = f.length; e > d; d++)
                                            nb(f[d], g[d]);
                                    else
                                        nb(a, h);
                                return g = ob(h, "script"),
                                    g.length > 0 && mb(g, !i && ob(a, "script")),
                                    h
                            },
                            buildFragment: function(a, b, c, d) {
                                for (var e, f, g, h, i, j, k = b.createDocumentFragment(), l = [], m = 0, o = a.length; o > m; m++)
                                    if (e = a[m],
                                        e || 0 === e)
                                        if ("object" === n.type(e))
                                            n.merge(l, e.nodeType ? [e] : e);
                                        else if (cb.test(e)) {
                                    f = f || k.appendChild(b.createElement("div")),
                                        g = (bb.exec(e) || ["", ""])[1].toLowerCase(),
                                        h = ib[g] || ib._default,
                                        f.innerHTML = h[1] + e.replace(ab, "<$1></$2>") + h[2],
                                        j = h[0];
                                    while (j--)
                                        f = f.lastChild;
                                    n.merge(l, f.childNodes),
                                        f = k.firstChild,
                                        f.textContent = ""
                                } else
                                    l.push(b.createTextNode(e));
                                k.textContent = "",
                                    m = 0;
                                while (e = l[m++])
                                    if ((!d || -1 === n.inArray(e, d)) && (i = n.contains(e.ownerDocument, e),
                                            f = ob(k.appendChild(e), "script"),
                                            i && mb(f),
                                            c)) {
                                        j = 0;
                                        while (e = f[j++])
                                            fb.test(e.type || "") && c.push(e)
                                    }
                                return k
                            },
                            cleanData: function(a) {
                                for (var b, c, d, e, f = n.event.special, g = 0; void 0 !== (c = a[g]); g++) {
                                    if (n.acceptData(c) && (e = c[L.expando],
                                            e && (b = L.cache[e]))) {
                                        if (b.events)
                                            for (d in b.events)
                                                f[d] ? n.event.remove(c, d) : n.removeEvent(c, d, b.handle);
                                        L.cache[e] && delete L.cache[e]
                                    }
                                    delete M.cache[c[M.expando]]
                                }
                            }
                        }),
                        n.fn.extend({
                            text: function(a) {
                                return J(this, function(a) {
                                    return void 0 === a ? n.text(this) : this.empty().each(function() {
                                        (1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) && (this.textContent = a)
                                    })
                                }, null, a, arguments.length)
                            },
                            append: function() {
                                return this.domManip(arguments, function(a) {
                                    if (1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) {
                                        var b = jb(this, a);
                                        b.appendChild(a)
                                    }
                                })
                            },
                            prepend: function() {
                                return this.domManip(arguments, function(a) {
                                    if (1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) {
                                        var b = jb(this, a);
                                        b.insertBefore(a, b.firstChild)
                                    }
                                })
                            },
                            before: function() {
                                return this.domManip(arguments, function(a) {
                                    this.parentNode && this.parentNode.insertBefore(a, this)
                                })
                            },
                            after: function() {
                                return this.domManip(arguments, function(a) {
                                    this.parentNode && this.parentNode.insertBefore(a, this.nextSibling)
                                })
                            },
                            remove: function(a, b) {
                                for (var c, d = a ? n.filter(a, this) : this, e = 0; null != (c = d[e]); e++)
                                    b || 1 !== c.nodeType || n.cleanData(ob(c)),
                                    c.parentNode && (b && n.contains(c.ownerDocument, c) && mb(ob(c, "script")),
                                        c.parentNode.removeChild(c));
                                return this
                            },
                            empty: function() {
                                for (var a, b = 0; null != (a = this[b]); b++)
                                    1 === a.nodeType && (n.cleanData(ob(a, !1)),
                                        a.textContent = "");
                                return this
                            },
                            clone: function(a, b) {
                                return a = null == a ? !1 : a,
                                    b = null == b ? a : b,
                                    this.map(function() {
                                        return n.clone(this, a, b)
                                    })
                            },
                            html: function(a) {
                                return J(this, function(a) {
                                    var b = this[0] || {},
                                        c = 0,
                                        d = this.length;
                                    if (void 0 === a && 1 === b.nodeType)
                                        return b.innerHTML;
                                    if ("string" == typeof a && !db.test(a) && !ib[(bb.exec(a) || ["", ""])[1].toLowerCase()]) {
                                        a = a.replace(ab, "<$1></$2>");
                                        try {
                                            for (; d > c; c++)
                                                b = this[c] || {},
                                                1 === b.nodeType && (n.cleanData(ob(b, !1)),
                                                    b.innerHTML = a);
                                            b = 0
                                        } catch (e) {}
                                    }
                                    b && this.empty().append(a)
                                }, null, a, arguments.length)
                            },
                            replaceWith: function() {
                                var a = arguments[0];
                                return this.domManip(arguments, function(b) {
                                        a = this.parentNode,
                                            n.cleanData(ob(this)),
                                            a && a.replaceChild(b, this)
                                    }),
                                    a && (a.length || a.nodeType) ? this : this.remove()
                            },
                            detach: function(a) {
                                return this.remove(a, !0)
                            },
                            domManip: function(a, b) {
                                a = e.apply([], a);
                                var c, d, f, g, h, i, j = 0,
                                    l = this.length,
                                    m = this,
                                    o = l - 1,
                                    p = a[0],
                                    q = n.isFunction(p);
                                if (q || l > 1 && "string" == typeof p && !k.checkClone && eb.test(p))
                                    return this.each(function(c) {
                                        var d = m.eq(c);
                                        q && (a[0] = p.call(this, c, d.html())),
                                            d.domManip(a, b)
                                    });
                                if (l && (c = n.buildFragment(a, this[0].ownerDocument, !1, this),
                                        d = c.firstChild,
                                        1 === c.childNodes.length && (c = d),
                                        d)) {
                                    for (f = n.map(ob(c, "script"), kb),
                                        g = f.length; l > j; j++)
                                        h = c,
                                        j !== o && (h = n.clone(h, !0, !0),
                                            g && n.merge(f, ob(h, "script"))),
                                        b.call(this[j], h, j);
                                    if (g)
                                        for (i = f[f.length - 1].ownerDocument,
                                            n.map(f, lb),
                                            j = 0; g > j; j++)
                                            h = f[j],
                                            fb.test(h.type || "") && !L.access(h, "globalEval") && n.contains(i, h) && (h.src ? n._evalUrl && n._evalUrl(h.src) : n.globalEval(h.textContent.replace(hb, "")))
                                }
                                return this
                            }
                        }),
                        n.each({
                            appendTo: "append",
                            prependTo: "prepend",
                            insertBefore: "before",
                            insertAfter: "after",
                            replaceAll: "replaceWith"
                        }, function(a, b) {
                            n.fn[a] = function(a) {
                                for (var c, d = [], e = n(a), g = e.length - 1, h = 0; g >= h; h++)
                                    c = h === g ? this : this.clone(!0),
                                    n(e[h])[b](c),
                                    f.apply(d, c.get());
                                return this.pushStack(d)
                            }
                        });
                    var qb, rb = {};
                    function sb(b, c) {
                        var d, e = n(c.createElement(b)).appendTo(c.body),
                            f = a.getDefaultComputedStyle && (d = a.getDefaultComputedStyle(e[0])) ? d.display : n.css(e[0], "display");
                        return e.detach(),
                            f
                    }
                    function tb(a) {
                        var b = l,
                            c = rb[a];
                        return c || (c = sb(a, b),
                                "none" !== c && c || (qb = (qb || n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),
                                    b = qb[0].contentDocument,
                                    b.write(),
                                    b.close(),
                                    c = sb(a, b),
                                    qb.detach()),
                                rb[a] = c),
                            c
                    }
                    var ub = /^margin/,
                        vb = new RegExp("^(" + Q + ")(?!px)[a-z%]+$", "i"),
                        wb = function(a) {
                            return a.ownerDocument.defaultView.getComputedStyle(a, null)
                        };
                    function xb(a, b, c) {
                        var d, e, f, g, h = a.style;
                        return c = c || wb(a),
                            c && (g = c.getPropertyValue(b) || c[b]),
                            c && ("" !== g || n.contains(a.ownerDocument, a) || (g = n.style(a, b)),
                                vb.test(g) && ub.test(b) && (d = h.width,
                                    e = h.minWidth,
                                    f = h.maxWidth,
                                    h.minWidth = h.maxWidth = h.width = g,
                                    g = c.width,
                                    h.width = d,
                                    h.minWidth = e,
                                    h.maxWidth = f)),
                            void 0 !== g ? g + "" : g
                    }
                    function yb(a, b) {
                        return {
                            get: function() {
                                return a() ? void delete this.get : (this.get = b).apply(this, arguments)
                            }
                        }
                    }! function() {
                        var b, c, d = l.documentElement,
                            e = l.createElement("div"),
                            f = l.createElement("div");
                        if (f.style) {
                            f.style.backgroundClip = "content-box",
                                f.cloneNode(!0).style.backgroundClip = "",
                                k.clearCloneStyle = "content-box" === f.style.backgroundClip,
                                e.style.cssText = "border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",
                                e.appendChild(f);
                            function g() {
                                f.style.cssText = "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",
                                    f.innerHTML = "",
                                    d.appendChild(e);
                                var g = a.getComputedStyle(f, null);
                                b = "1%" !== g.top,
                                    c = "4px" === g.width,
                                    d.removeChild(e)
                            }
                            a.getComputedStyle && n.extend(k, {
                                pixelPosition: function() {
                                    return g(),
                                        b
                                },
                                boxSizingReliable: function() {
                                    return null == c && g(),
                                        c
                                },
                                reliableMarginRight: function() {
                                    var b, c = f.appendChild(l.createElement("div"));
                                    return c.style.cssText = f.style.cssText = "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",
                                        c.style.marginRight = c.style.width = "0",
                                        f.style.width = "1px",
                                        d.appendChild(e),
                                        b = !parseFloat(a.getComputedStyle(c, null).marginRight),
                                        d.removeChild(e),
                                        b
                                }
                            })
                        }
                    }(),
                    n.swap = function(a, b, c, d) {
                        var e, f, g = {};
                        for (f in b)
                            g[f] = a.style[f],
                            a.style[f] = b[f];
                        e = c.apply(a, d || []);
                        for (f in b)
                            a.style[f] = g[f];
                        return e
                    };
                    var zb = /^(none|table(?!-c[ea]).+)/,
                        Ab = new RegExp("^(" + Q + ")(.*)$", "i"),
                        Bb = new RegExp("^([+-])=(" + Q + ")", "i"),
                        Cb = {
                            position: "absolute",
                            visibility: "hidden",
                            display: "block"
                        },
                        Db = {
                            letterSpacing: "0",
                            fontWeight: "400"
                        },
                        Eb = ["Webkit", "O", "Moz", "ms"];
                    function Fb(a, b) {
                        if (b in a)
                            return b;
                        var c = b[0].toUpperCase() + b.slice(1),
                            d = b,
                            e = Eb.length;
                        while (e--)
                            if (b = Eb[e] + c,
                                b in a)
                                return b;
                        return d
                    }
                    function Gb(a, b, c) {
                        var d = Ab.exec(b);
                        return d ? Math.max(0, d[1] - (c || 0)) + (d[2] || "px") : b
                    }
                    function Hb(a, b, c, d, e) {
                        for (var f = c === (d ? "border" : "content") ? 4 : "width" === b ? 1 : 0, g = 0; 4 > f; f += 2)
                            "margin" === c && (g += n.css(a, c + R[f], !0, e)),
                            d ? ("content" === c && (g -= n.css(a, "padding" + R[f], !0, e)),
                                "margin" !== c && (g -= n.css(a, "border" + R[f] + "Width", !0, e))) : (g += n.css(a, "padding" + R[f], !0, e),
                                "padding" !== c && (g += n.css(a, "border" + R[f] + "Width", !0, e)));
                        return g
                    }
                    function Ib(a, b, c) {
                        var d = !0,
                            e = "width" === b ? a.offsetWidth : a.offsetHeight,
                            f = wb(a),
                            g = "border-box" === n.css(a, "boxSizing", !1, f);
                        if (0 >= e || null == e) {
                            if (e = xb(a, b, f),
                                (0 > e || null == e) && (e = a.style[b]),
                                vb.test(e))
                                return e;
                            d = g && (k.boxSizingReliable() || e === a.style[b]),
                                e = parseFloat(e) || 0
                        }
                        return e + Hb(a, b, c || (g ? "border" : "content"), d, f) + "px"
                    }
                    function Jb(a, b) {
                        for (var c, d, e, f = [], g = 0, h = a.length; h > g; g++)
                            d = a[g],
                            d.style && (f[g] = L.get(d, "olddisplay"),
                                c = d.style.display,
                                b ? (f[g] || "none" !== c || (d.style.display = ""),
                                    "" === d.style.display && S(d) && (f[g] = L.access(d, "olddisplay", tb(d.nodeName)))) : (e = S(d),
                                    "none" === c && e || L.set(d, "olddisplay", e ? c : n.css(d, "display"))));
                        for (g = 0; h > g; g++)
                            d = a[g],
                            d.style && (b && "none" !== d.style.display && "" !== d.style.display || (d.style.display = b ? f[g] || "" : "none"));
                        return a
                    }
                    n.extend({
                            cssHooks: {
                                opacity: {
                                    get: function(a, b) {
                                        if (b) {
                                            var c = xb(a, "opacity");
                                            return "" === c ? "1" : c
                                        }
                                    }
                                }
                            },
                            cssNumber: {
                                columnCount: !0,
                                fillOpacity: !0,
                                flexGrow: !0,
                                flexShrink: !0,
                                fontWeight: !0,
                                lineHeight: !0,
                                opacity: !0,
                                order: !0,
                                orphans: !0,
                                widows: !0,
                                zIndex: !0,
                                zoom: !0
                            },
                            cssProps: {
                                "float": "cssFloat"
                            },
                            style: function(a, b, c, d) {
                                if (a && 3 !== a.nodeType && 8 !== a.nodeType && a.style) {
                                    var e, f, g, h = n.camelCase(b),
                                        i = a.style;
                                    return b = n.cssProps[h] || (n.cssProps[h] = Fb(i, h)),
                                        g = n.cssHooks[b] || n.cssHooks[h],
                                        void 0 === c ? g && "get" in g && void 0 !== (e = g.get(a, !1, d)) ? e : i[b] : (f = typeof c,
                                            "string" === f && (e = Bb.exec(c)) && (c = (e[1] + 1) * e[2] + parseFloat(n.css(a, b)),
                                                f = "number"),
                                            null != c && c === c && ("number" !== f || n.cssNumber[h] || (c += "px"),
                                                k.clearCloneStyle || "" !== c || 0 !== b.indexOf("background") || (i[b] = "inherit"),
                                                g && "set" in g && void 0 === (c = g.set(a, c, d)) || (i[b] = c)),
                                            void 0)
                                }
                            },
                            css: function(a, b, c, d) {
                                var e, f, g, h = n.camelCase(b);
                                return b = n.cssProps[h] || (n.cssProps[h] = Fb(a.style, h)),
                                    g = n.cssHooks[b] || n.cssHooks[h],
                                    g && "get" in g && (e = g.get(a, !0, c)),
                                    void 0 === e && (e = xb(a, b, d)),
                                    "normal" === e && b in Db && (e = Db[b]),
                                    "" === c || c ? (f = parseFloat(e),
                                        c === !0 || n.isNumeric(f) ? f || 0 : e) : e
                            }
                        }),
                        n.each(["height", "width"], function(a, b) {
                            n.cssHooks[b] = {
                                get: function(a, c, d) {
                                    return c ? zb.test(n.css(a, "display")) && 0 === a.offsetWidth ? n.swap(a, Cb, function() {
                                        return Ib(a, b, d)
                                    }) : Ib(a, b, d) : void 0
                                },
                                set: function(a, c, d) {
                                    var e = d && wb(a);
                                    return Gb(a, c, d ? Hb(a, b, d, "border-box" === n.css(a, "boxSizing", !1, e), e) : 0)
                                }
                            }
                        }),
                        n.cssHooks.marginRight = yb(k.reliableMarginRight, function(a, b) {
                            return b ? n.swap(a, {
                                display: "inline-block"
                            }, xb, [a, "marginRight"]) : void 0
                        }),
                        n.each({
                            margin: "",
                            padding: "",
                            border: "Width"
                        }, function(a, b) {
                            n.cssHooks[a + b] = {
                                    expand: function(c) {
                                        for (var d = 0, e = {}, f = "string" == typeof c ? c.split(" ") : [c]; 4 > d; d++)
                                            e[a + R[d] + b] = f[d] || f[d - 2] || f[0];
                                        return e
                                    }
                                },
                                ub.test(a) || (n.cssHooks[a + b].set = Gb)
                        }),
                        n.fn.extend({
                            css: function(a, b) {
                                return J(this, function(a, b, c) {
                                    var d, e, f = {},
                                        g = 0;
                                    if (n.isArray(b)) {
                                        for (d = wb(a),
                                            e = b.length; e > g; g++)
                                            f[b[g]] = n.css(a, b[g], !1, d);
                                        return f
                                    }
                                    return void 0 !== c ? n.style(a, b, c) : n.css(a, b)
                                }, a, b, arguments.length > 1)
                            },
                            show: function() {
                                return Jb(this, !0)
                            },
                            hide: function() {
                                return Jb(this)
                            },
                            toggle: function(a) {
                                return "boolean" == typeof a ? a ? this.show() : this.hide() : this.each(function() {
                                    S(this) ? n(this).show() : n(this).hide()
                                })
                            }
                        });
                    function Kb(a, b, c, d, e) {
                        return new Kb.prototype.init(a, b, c, d, e)
                    }
                    n.Tween = Kb,
                        Kb.prototype = {
                            constructor: Kb,
                            init: function(a, b, c, d, e, f) {
                                this.elem = a,
                                    this.prop = c,
                                    this.easing = e || "swing",
                                    this.options = b,
                                    this.start = this.now = this.cur(),
                                    this.end = d,
                                    this.unit = f || (n.cssNumber[c] ? "" : "px")
                            },
                            cur: function() {
                                var a = Kb.propHooks[this.prop];
                                return a && a.get ? a.get(this) : Kb.propHooks._default.get(this)
                            },
                            run: function(a) {
                                var b, c = Kb.propHooks[this.prop];
                                return this.pos = b = this.options.duration ? n.easing[this.easing](a, this.options.duration * a, 0, 1, this.options.duration) : a,
                                    this.now = (this.end - this.start) * b + this.start,
                                    this.options.step && this.options.step.call(this.elem, this.now, this),
                                    c && c.set ? c.set(this) : Kb.propHooks._default.set(this),
                                    this
                            }
                        },
                        Kb.prototype.init.prototype = Kb.prototype,
                        Kb.propHooks = {
                            _default: {
                                get: function(a) {
                                    var b;
                                    return null == a.elem[a.prop] || a.elem.style && null != a.elem.style[a.prop] ? (b = n.css(a.elem, a.prop, ""),
                                        b && "auto" !== b ? b : 0) : a.elem[a.prop]
                                },
                                set: function(a) {
                                    n.fx.step[a.prop] ? n.fx.step[a.prop](a) : a.elem.style && (null != a.elem.style[n.cssProps[a.prop]] || n.cssHooks[a.prop]) ? n.style(a.elem, a.prop, a.now + a.unit) : a.elem[a.prop] = a.now
                                }
                            }
                        },
                        Kb.propHooks.scrollTop = Kb.propHooks.scrollLeft = {
                            set: function(a) {
                                a.elem.nodeType && a.elem.parentNode && (a.elem[a.prop] = a.now)
                            }
                        },
                        n.easing = {
                            linear: function(a) {
                                return a
                            },
                            swing: function(a) {
                                return .5 - Math.cos(a * Math.PI) / 2
                            }
                        },
                        n.fx = Kb.prototype.init,
                        n.fx.step = {};
                    var Lb, Mb, Nb = /^(?:toggle|show|hide)$/,
                        Ob = new RegExp("^(?:([+-])=|)(" + Q + ")([a-z%]*)$", "i"),
                        Pb = /queueHooks$/,
                        Qb = [Vb],
                        Rb = {
                            "*": [function(a, b) {
                                var c = this.createTween(a, b),
                                    d = c.cur(),
                                    e = Ob.exec(b),
                                    f = e && e[3] || (n.cssNumber[a] ? "" : "px"),
                                    g = (n.cssNumber[a] || "px" !== f && +d) && Ob.exec(n.css(c.elem, a)),
                                    h = 1,
                                    i = 20;
                                if (g && g[3] !== f) {
                                    f = f || g[3],
                                        e = e || [],
                                        g = +d || 1;
                                    do
                                        h = h || ".5",
                                        g /= h,
                                        n.style(c.elem, a, g + f);
                                    while (h !== (h = c.cur() / d) && 1 !== h && --i)
                                }
                                return e && (g = c.start = +g || +d || 0,
                                        c.unit = f,
                                        c.end = e[1] ? g + (e[1] + 1) * e[2] : +e[2]),
                                    c
                            }]
                        };
                    function Sb() {
                        return setTimeout(function() {
                                Lb = void 0
                            }),
                            Lb = n.now()
                    }
                    function Tb(a, b) {
                        var c, d = 0,
                            e = {
                                height: a
                            };
                        for (b = b ? 1 : 0; 4 > d; d += 2 - b)
                            c = R[d],
                            e["margin" + c] = e["padding" + c] = a;
                        return b && (e.opacity = e.width = a),
                            e
                    }
                    function Ub(a, b, c) {
                        for (var d, e = (Rb[b] || []).concat(Rb["*"]), f = 0, g = e.length; g > f; f++)
                            if (d = e[f].call(c, b, a))
                                return d
                    }
                    function Vb(a, b, c) {
                        var d, e, f, g, h, i, j, k, l = this,
                            m = {},
                            o = a.style,
                            p = a.nodeType && S(a),
                            q = L.get(a, "fxshow");
                        c.queue || (h = n._queueHooks(a, "fx"),
                                null == h.unqueued && (h.unqueued = 0,
                                    i = h.empty.fire,
                                    h.empty.fire = function() {
                                        h.unqueued || i()
                                    }
                                ),
                                h.unqueued++,
                                l.always(function() {
                                    l.always(function() {
                                        h.unqueued--,
                                            n.queue(a, "fx").length || h.empty.fire()
                                    })
                                })),
                            1 === a.nodeType && ("height" in b || "width" in b) && (c.overflow = [o.overflow, o.overflowX, o.overflowY],
                                j = n.css(a, "display"),
                                k = "none" === j ? L.get(a, "olddisplay") || tb(a.nodeName) : j,
                                "inline" === k && "none" === n.css(a, "float") && (o.display = "inline-block")),
                            c.overflow && (o.overflow = "hidden",
                                l.always(function() {
                                    o.overflow = c.overflow[0],
                                        o.overflowX = c.overflow[1],
                                        o.overflowY = c.overflow[2]
                                }));
                        for (d in b)
                            if (e = b[d],
                                Nb.exec(e)) {
                                if (delete b[d],
                                    f = f || "toggle" === e,
                                    e === (p ? "hide" : "show")) {
                                    if ("show" !== e || !q || void 0 === q[d])
                                        continue;
                                    p = !0
                                }
                                m[d] = q && q[d] || n.style(a, d)
                            } else
                                j = void 0;
                        if (n.isEmptyObject(m))
                            "inline" === ("none" === j ? tb(a.nodeName) : j) && (o.display = j);
                        else {
                            q ? "hidden" in q && (p = q.hidden) : q = L.access(a, "fxshow", {}),
                                f && (q.hidden = !p),
                                p ? n(a).show() : l.done(function() {
                                    n(a).hide()
                                }),
                                l.done(function() {
                                    var b;
                                    L.remove(a, "fxshow");
                                    for (b in m)
                                        n.style(a, b, m[b])
                                });
                            for (d in m)
                                g = Ub(p ? q[d] : 0, d, l),
                                d in q || (q[d] = g.start,
                                    p && (g.end = g.start,
                                        g.start = "width" === d || "height" === d ? 1 : 0))
                        }
                    }
                    function Wb(a, b) {
                        var c, d, e, f, g;
                        for (c in a)
                            if (d = n.camelCase(c),
                                e = b[d],
                                f = a[c],
                                n.isArray(f) && (e = f[1],
                                    f = a[c] = f[0]),
                                c !== d && (a[d] = f,
                                    delete a[c]),
                                g = n.cssHooks[d],
                                g && "expand" in g) {
                                f = g.expand(f),
                                    delete a[d];
                                for (c in f)
                                    c in a || (a[c] = f[c],
                                        b[c] = e)
                            } else
                                b[d] = e
                    }
                    function Xb(a, b, c) {
                        var d, e, f = 0,
                            g = Qb.length,
                            h = n.Deferred().always(function() {
                                delete i.elem
                            }),
                            i = function() {
                                if (e)
                                    return !1;
                                for (var b = Lb || Sb(), c = Math.max(0, j.startTime + j.duration - b), d = c / j.duration || 0, f = 1 - d, g = 0, i = j.tweens.length; i > g; g++)
                                    j.tweens[g].run(f);
                                return h.notifyWith(a, [j, f, c]),
                                    1 > f && i ? c : (h.resolveWith(a, [j]), !1)
                            },
                            j = h.promise({
                                elem: a,
                                props: n.extend({}, b),
                                opts: n.extend(!0, {
                                    specialEasing: {}
                                }, c),
                                originalProperties: b,
                                originalOptions: c,
                                startTime: Lb || Sb(),
                                duration: c.duration,
                                tweens: [],
                                createTween: function(b, c) {
                                    var d = n.Tween(a, j.opts, b, c, j.opts.specialEasing[b] || j.opts.easing);
                                    return j.tweens.push(d),
                                        d
                                },
                                stop: function(b) {
                                    var c = 0,
                                        d = b ? j.tweens.length : 0;
                                    if (e)
                                        return this;
                                    for (e = !0; d > c; c++)
                                        j.tweens[c].run(1);
                                    return b ? h.resolveWith(a, [j, b]) : h.rejectWith(a, [j, b]),
                                        this
                                }
                            }),
                            k = j.props;
                        for (Wb(k, j.opts.specialEasing); g > f; f++)
                            if (d = Qb[f].call(j, a, k, j.opts))
                                return d;
                        return n.map(k, Ub, j),
                            n.isFunction(j.opts.start) && j.opts.start.call(a, j),
                            n.fx.timer(n.extend(i, {
                                elem: a,
                                anim: j,
                                queue: j.opts.queue
                            })),
                            j.progress(j.opts.progress).done(j.opts.done, j.opts.complete).fail(j.opts.fail).always(j.opts.always)
                    }
                    n.Animation = n.extend(Xb, {
                            tweener: function(a, b) {
                                n.isFunction(a) ? (b = a,
                                    a = ["*"]) : a = a.split(" ");
                                for (var c, d = 0, e = a.length; e > d; d++)
                                    c = a[d],
                                    Rb[c] = Rb[c] || [],
                                    Rb[c].unshift(b)
                            },
                            prefilter: function(a, b) {
                                b ? Qb.unshift(a) : Qb.push(a)
                            }
                        }),
                        n.speed = function(a, b, c) {
                            var d = a && "object" == typeof a ? n.extend({}, a) : {
                                complete: c || !c && b || n.isFunction(a) && a,
                                duration: a,
                                easing: c && b || b && !n.isFunction(b) && b
                            };
                            return d.duration = n.fx.off ? 0 : "number" == typeof d.duration ? d.duration : d.duration in n.fx.speeds ? n.fx.speeds[d.duration] : n.fx.speeds._default,
                                (null == d.queue || d.queue === !0) && (d.queue = "fx"),
                                d.old = d.complete,
                                d.complete = function() {
                                    n.isFunction(d.old) && d.old.call(this),
                                        d.queue && n.dequeue(this, d.queue)
                                },
                                d
                        },
                        n.fn.extend({
                            fadeTo: function(a, b, c, d) {
                                return this.filter(S).css("opacity", 0).show().end().animate({
                                    opacity: b
                                }, a, c, d)
                            },
                            animate: function(a, b, c, d) {
                                var e = n.isEmptyObject(a),
                                    f = n.speed(b, c, d),
                                    g = function() {
                                        var b = Xb(this, n.extend({}, a), f);
                                        (e || L.get(this, "finish")) && b.stop(!0)
                                    };
                                return g.finish = g,
                                    e || f.queue === !1 ? this.each(g) : this.queue(f.queue, g)
                            },
                            stop: function(a, b, c) {
                                var d = function(a) {
                                    var b = a.stop;
                                    delete a.stop,
                                        b(c)
                                };
                                return "string" != typeof a && (c = b,
                                        b = a,
                                        a = void 0),
                                    b && a !== !1 && this.queue(a || "fx", []),
                                    this.each(function() {
                                        var b = !0,
                                            e = null != a && a + "queueHooks",
                                            f = n.timers,
                                            g = L.get(this);
                                        if (e)
                                            g[e] && g[e].stop && d(g[e]);
                                        else
                                            for (e in g)
                                                g[e] && g[e].stop && Pb.test(e) && d(g[e]);
                                        for (e = f.length; e--;)
                                            f[e].elem !== this || null != a && f[e].queue !== a || (f[e].anim.stop(c),
                                                b = !1,
                                                f.splice(e, 1));
                                        (b || !c) && n.dequeue(this, a)
                                    })
                            },
                            finish: function(a) {
                                return a !== !1 && (a = a || "fx"),
                                    this.each(function() {
                                        var b, c = L.get(this),
                                            d = c[a + "queue"],
                                            e = c[a + "queueHooks"],
                                            f = n.timers,
                                            g = d ? d.length : 0;
                                        for (c.finish = !0,
                                            n.queue(this, a, []),
                                            e && e.stop && e.stop.call(this, !0),
                                            b = f.length; b--;)
                                            f[b].elem === this && f[b].queue === a && (f[b].anim.stop(!0),
                                                f.splice(b, 1));
                                        for (b = 0; g > b; b++)
                                            d[b] && d[b].finish && d[b].finish.call(this);
                                        delete c.finish
                                    })
                            }
                        }),
                        n.each(["toggle", "show", "hide"], function(a, b) {
                            var c = n.fn[b];
                            n.fn[b] = function(a, d, e) {
                                return null == a || "boolean" == typeof a ? c.apply(this, arguments) : this.animate(Tb(b, !0), a, d, e)
                            }
                        }),
                        n.each({
                            slideDown: Tb("show"),
                            slideUp: Tb("hide"),
                            slideToggle: Tb("toggle"),
                            fadeIn: {
                                opacity: "show"
                            },
                            fadeOut: {
                                opacity: "hide"
                            },
                            fadeToggle: {
                                opacity: "toggle"
                            }
                        }, function(a, b) {
                            n.fn[a] = function(a, c, d) {
                                return this.animate(b, a, c, d)
                            }
                        }),
                        n.timers = [],
                        n.fx.tick = function() {
                            var a, b = 0,
                                c = n.timers;
                            for (Lb = n.now(); b < c.length; b++)
                                a = c[b],
                                a() || c[b] !== a || c.splice(b--, 1);
                            c.length || n.fx.stop(),
                                Lb = void 0
                        },
                        n.fx.timer = function(a) {
                            n.timers.push(a),
                                a() ? n.fx.start() : n.timers.pop()
                        },
                        n.fx.interval = 13,
                        n.fx.start = function() {
                            Mb || (Mb = setInterval(n.fx.tick, n.fx.interval))
                        },
                        n.fx.stop = function() {
                            clearInterval(Mb),
                                Mb = null
                        },
                        n.fx.speeds = {
                            slow: 600,
                            fast: 200,
                            _default: 400
                        },
                        n.fn.delay = function(a, b) {
                            return a = n.fx ? n.fx.speeds[a] || a : a,
                                b = b || "fx",
                                this.queue(b, function(b, c) {
                                    var d = setTimeout(b, a);
                                    c.stop = function() {
                                        clearTimeout(d)
                                    }
                                })
                        },
                        function() {
                            var a = l.createElement("input"),
                                b = l.createElement("select"),
                                c = b.appendChild(l.createElement("option"));
                            a.type = "checkbox",
                                k.checkOn = "" !== a.value,
                                k.optSelected = c.selected,
                                b.disabled = !0,
                                k.optDisabled = !c.disabled,
                                a = l.createElement("input"),
                                a.value = "t",
                                a.type = "radio",
                                k.radioValue = "t" === a.value
                        }();
                    var Yb, Zb, $b = n.expr.attrHandle;
                    n.fn.extend({
                            attr: function(a, b) {
                                return J(this, n.attr, a, b, arguments.length > 1)
                            },
                            removeAttr: function(a) {
                                return this.each(function() {
                                    n.removeAttr(this, a)
                                })
                            }
                        }),
                        n.extend({
                            attr: function(a, b, c) {
                                var d, e, f = a.nodeType;
                                if (a && 3 !== f && 8 !== f && 2 !== f)
                                    return typeof a.getAttribute === U ? n.prop(a, b, c) : (1 === f && n.isXMLDoc(a) || (b = b.toLowerCase(),
                                            d = n.attrHooks[b] || (n.expr.match.bool.test(b) ? Zb : Yb)),
                                        void 0 === c ? d && "get" in d && null !== (e = d.get(a, b)) ? e : (e = n.find.attr(a, b),
                                            null == e ? void 0 : e) : null !== c ? d && "set" in d && void 0 !== (e = d.set(a, c, b)) ? e : (a.setAttribute(b, c + ""),
                                            c) : void n.removeAttr(a, b))
                            },
                            removeAttr: function(a, b) {
                                var c, d, e = 0,
                                    f = b && b.match(E);
                                if (f && 1 === a.nodeType)
                                    while (c = f[e++])
                                        d = n.propFix[c] || c,
                                        n.expr.match.bool.test(c) && (a[d] = !1),
                                        a.removeAttribute(c)
                            },
                            attrHooks: {
                                type: {
                                    set: function(a, b) {
                                        if (!k.radioValue && "radio" === b && n.nodeName(a, "input")) {
                                            var c = a.value;
                                            return a.setAttribute("type", b),
                                                c && (a.value = c),
                                                b
                                        }
                                    }
                                }
                            }
                        }),
                        Zb = {
                            set: function(a, b, c) {
                                return b === !1 ? n.removeAttr(a, c) : a.setAttribute(c, c),
                                    c
                            }
                        },
                        n.each(n.expr.match.bool.source.match(/\w+/g), function(a, b) {
                            var c = $b[b] || n.find.attr;
                            $b[b] = function(a, b, d) {
                                var e, f;
                                return d || (f = $b[b],
                                        $b[b] = e,
                                        e = null != c(a, b, d) ? b.toLowerCase() : null,
                                        $b[b] = f),
                                    e
                            }
                        });
                    var _b = /^(?:input|select|textarea|button)$/i;
                    n.fn.extend({
                            prop: function(a, b) {
                                return J(this, n.prop, a, b, arguments.length > 1)
                            },
                            removeProp: function(a) {
                                return this.each(function() {
                                    delete this[n.propFix[a] || a]
                                })
                            }
                        }),
                        n.extend({
                            propFix: {
                                "for": "htmlFor",
                                "class": "className"
                            },
                            prop: function(a, b, c) {
                                var d, e, f, g = a.nodeType;
                                if (a && 3 !== g && 8 !== g && 2 !== g)
                                    return f = 1 !== g || !n.isXMLDoc(a),
                                        f && (b = n.propFix[b] || b,
                                            e = n.propHooks[b]),
                                        void 0 !== c ? e && "set" in e && void 0 !== (d = e.set(a, c, b)) ? d : a[b] = c : e && "get" in e && null !== (d = e.get(a, b)) ? d : a[b]
                            },
                            propHooks: {
                                tabIndex: {
                                    get: function(a) {
                                        return a.hasAttribute("tabindex") || _b.test(a.nodeName) || a.href ? a.tabIndex : -1
                                    }
                                }
                            }
                        }),
                        k.optSelected || (n.propHooks.selected = {
                            get: function(a) {
                                var b = a.parentNode;
                                return b && b.parentNode && b.parentNode.selectedIndex,
                                    null
                            }
                        }),
                        n.each(["tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable"], function() {
                            n.propFix[this.toLowerCase()] = this
                        });
                    var ac = /[\t\r\n\f]/g;
                    n.fn.extend({
                        addClass: function(a) {
                            var b, c, d, e, f, g, h = "string" == typeof a && a,
                                i = 0,
                                j = this.length;
                            if (n.isFunction(a))
                                return this.each(function(b) {
                                    n(this).addClass(a.call(this, b, this.className))
                                });
                            if (h)
                                for (b = (a || "").match(E) || []; j > i; i++)
                                    if (c = this[i],
                                        d = 1 === c.nodeType && (c.className ? (" " + c.className + " ").replace(ac, " ") : " ")) {
                                        f = 0;
                                        while (e = b[f++])
                                            d.indexOf(" " + e + " ") < 0 && (d += e + " ");
                                        g = n.trim(d),
                                            c.className !== g && (c.className = g)
                                    }
                            return this
                        },
                        removeClass: function(a) {
                            var b, c, d, e, f, g, h = 0 === arguments.length || "string" == typeof a && a,
                                i = 0,
                                j = this.length;
                            if (n.isFunction(a))
                                return this.each(function(b) {
                                    n(this).removeClass(a.call(this, b, this.className))
                                });
                            if (h)
                                for (b = (a || "").match(E) || []; j > i; i++)
                                    if (c = this[i],
                                        d = 1 === c.nodeType && (c.className ? (" " + c.className + " ").replace(ac, " ") : "")) {
                                        f = 0;
                                        while (e = b[f++])
                                            while (d.indexOf(" " + e + " ") >= 0)
                                                d = d.replace(" " + e + " ", " ");
                                        g = a ? n.trim(d) : "",
                                            c.className !== g && (c.className = g)
                                    }
                            return this
                        },
                        toggleClass: function(a, b) {
                            var c = typeof a;
                            return "boolean" == typeof b && "string" === c ? b ? this.addClass(a) : this.removeClass(a) : this.each(n.isFunction(a) ? function(c) {
                                    n(this).toggleClass(a.call(this, c, this.className, b), b)
                                } :
                                function() {
                                    if ("string" === c) {
                                        var b, d = 0,
                                            e = n(this),
                                            f = a.match(E) || [];
                                        while (b = f[d++])
                                            e.hasClass(b) ? e.removeClass(b) : e.addClass(b)
                                    } else
                                        (c === U || "boolean" === c) && (this.className && L.set(this, "__className__", this.className),
                                            this.className = this.className || a === !1 ? "" : L.get(this, "__className__") || "")
                                }
                            )
                        },
                        hasClass: function(a) {
                            for (var b = " " + a + " ", c = 0, d = this.length; d > c; c++)
                                if (1 === this[c].nodeType && (" " + this[c].className + " ").replace(ac, " ").indexOf(b) >= 0)
                                    return !0;
                            return !1
                        }
                    });
                    var bc = /\r/g;
                    n.fn.extend({
                            val: function(a) {
                                var b, c, d, e = this[0]; {
                                    if (arguments.length)
                                        return d = n.isFunction(a),
                                            this.each(function(c) {
                                                var e;
                                                1 === this.nodeType && (e = d ? a.call(this, c, n(this).val()) : a,
                                                    null == e ? e = "" : "number" == typeof e ? e += "" : n.isArray(e) && (e = n.map(e, function(a) {
                                                        return null == a ? "" : a + ""
                                                    })),
                                                    b = n.valHooks[this.type] || n.valHooks[this.nodeName.toLowerCase()],
                                                    b && "set" in b && void 0 !== b.set(this, e, "value") || (this.value = e))
                                            });
                                    if (e)
                                        return b = n.valHooks[e.type] || n.valHooks[e.nodeName.toLowerCase()],
                                            b && "get" in b && void 0 !== (c = b.get(e, "value")) ? c : (c = e.value,
                                                "string" == typeof c ? c.replace(bc, "") : null == c ? "" : c)
                                }
                            }
                        }),
                        n.extend({
                            valHooks: {
                                option: {
                                    get: function(a) {
                                        var b = n.find.attr(a, "value");
                                        return null != b ? b : n.trim(n.text(a))
                                    }
                                },
                                select: {
                                    get: function(a) {
                                        for (var b, c, d = a.options, e = a.selectedIndex, f = "select-one" === a.type || 0 > e, g = f ? null : [], h = f ? e + 1 : d.length, i = 0 > e ? h : f ? e : 0; h > i; i++)
                                            if (c = d[i], !(!c.selected && i !== e || (k.optDisabled ? c.disabled : null !== c.getAttribute("disabled")) || c.parentNode.disabled && n.nodeName(c.parentNode, "optgroup"))) {
                                                if (b = n(c).val(),
                                                    f)
                                                    return b;
                                                g.push(b)
                                            }
                                        return g
                                    },
                                    set: function(a, b) {
                                        var c, d, e = a.options,
                                            f = n.makeArray(b),
                                            g = e.length;
                                        while (g--)
                                            d = e[g],
                                            (d.selected = n.inArray(d.value, f) >= 0) && (c = !0);
                                        return c || (a.selectedIndex = -1),
                                            f
                                    }
                                }
                            }
                        }),
                        n.each(["radio", "checkbox"], function() {
                            n.valHooks[this] = {
                                    set: function(a, b) {
                                        return n.isArray(b) ? a.checked = n.inArray(n(a).val(), b) >= 0 : void 0
                                    }
                                },
                                k.checkOn || (n.valHooks[this].get = function(a) {
                                    return null === a.getAttribute("value") ? "on" : a.value
                                })
                        }),
                        n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "), function(a, b) {
                            n.fn[b] = function(a, c) {
                                return arguments.length > 0 ? this.on(b, null, a, c) : this.trigger(b)
                            }
                        }),
                        n.fn.extend({
                            hover: function(a, b) {
                                return this.mouseenter(a).mouseleave(b || a)
                            },
                            bind: function(a, b, c) {
                                return this.on(a, null, b, c)
                            },
                            unbind: function(a, b) {
                                return this.off(a, null, b)
                            },
                            delegate: function(a, b, c, d) {
                                return this.on(b, a, c, d)
                            },
                            undelegate: function(a, b, c) {
                                return 1 === arguments.length ? this.off(a, "**") : this.off(b, a || "**", c)
                            }
                        });
                    var cc = n.now(),
                        dc = /\?/;
                    n.parseJSON = function(a) {
                            return JSON.parse(a + "")
                        },
                        n.parseXML = function(a) {
                            var b, c;
                            if (!a || "string" != typeof a)
                                return null;
                            try {
                                c = new DOMParser,
                                    b = c.parseFromString(a, "text/xml")
                            } catch (d) {
                                b = void 0
                            }
                            return (!b || b.getElementsByTagName("parsererror").length) && n.error("Invalid XML: " + a),
                                b
                        };
                    var ec, fc, gc = /#.*$/,
                        hc = /([?&])_=[^&]*/,
                        ic = /^(.*?):[ \t]*([^\r\n]*)$/gm,
                        jc = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
                        kc = /^(?:GET|HEAD)$/,
                        lc = /^\/\//,
                        mc = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
                        nc = {},
                        oc = {},
                        pc = "*/".concat("*");
                    try {
                        fc = location.href
                    } catch (qc) {
                        fc = l.createElement("a"),
                            fc.href = "",
                            fc = fc.href
                    }
                    ec = mc.exec(fc.toLowerCase()) || [];
                    function rc(a) {
                        return function(b, c) {
                            "string" != typeof b && (c = b,
                                b = "*");
                            var d, e = 0,
                                f = b.toLowerCase().match(E) || [];
                            if (n.isFunction(c))
                                while (d = f[e++])
                                    "+" === d[0] ? (d = d.slice(1) || "*",
                                        (a[d] = a[d] || []).unshift(c)) : (a[d] = a[d] || []).push(c)
                        }
                    }
                    function sc(a, b, c, d) {
                        var e = {},
                            f = a === oc;
                        function g(h) {
                            var i;
                            return e[h] = !0,
                                n.each(a[h] || [], function(a, h) {
                                    var j = h(b, c, d);
                                    return "string" != typeof j || f || e[j] ? f ? !(i = j) : void 0 : (b.dataTypes.unshift(j),
                                        g(j), !1)
                                }),
                                i
                        }
                        return g(b.dataTypes[0]) || !e["*"] && g("*")
                    }
                    function tc(a, b) {
                        var c, d, e = n.ajaxSettings.flatOptions || {};
                        for (c in b)
                            void 0 !== b[c] && ((e[c] ? a : d || (d = {}))[c] = b[c]);
                        return d && n.extend(!0, a, d),
                            a
                    }
                    function uc(a, b, c) {
                        var d, e, f, g, h = a.contents,
                            i = a.dataTypes;
                        while ("*" === i[0])
                            i.shift(),
                            void 0 === d && (d = a.mimeType || b.getResponseHeader("Content-Type"));
                        if (d)
                            for (e in h)
                                if (h[e] && h[e].test(d)) {
                                    i.unshift(e);
                                    break
                                }
                        if (i[0] in c)
                            f = i[0];
                        else {
                            for (e in c) {
                                if (!i[0] || a.converters[e + " " + i[0]]) {
                                    f = e;
                                    break
                                }
                                g || (g = e)
                            }
                            f = f || g
                        }
                        return f ? (f !== i[0] && i.unshift(f),
                            c[f]) : void 0
                    }
                    function vc(a, b, c, d) {
                        var e, f, g, h, i, j = {},
                            k = a.dataTypes.slice();
                        if (k[1])
                            for (g in a.converters)
                                j[g.toLowerCase()] = a.converters[g];
                        f = k.shift();
                        while (f)
                            if (a.responseFields[f] && (c[a.responseFields[f]] = b), !i && d && a.dataFilter && (b = a.dataFilter(b, a.dataType)),
                                i = f,
                                f = k.shift())
                                if ("*" === f)
                                    f = i;
                                else if ("*" !== i && i !== f) {
                            if (g = j[i + " " + f] || j["* " + f], !g)
                                for (e in j)
                                    if (h = e.split(" "),
                                        h[1] === f && (g = j[i + " " + h[0]] || j["* " + h[0]])) {
                                        g === !0 ? g = j[e] : j[e] !== !0 && (f = h[0],
                                            k.unshift(h[1]));
                                        break
                                    }
                            if (g !== !0)
                                if (g && a["throws"])
                                    b = g(b);
                                else
                                    try {
                                        b = g(b)
                                    } catch (l) {
                                        return {
                                            state: "parsererror",
                                            error: g ? l : "No conversion from " + i + " to " + f
                                        }
                                    }
                        }
                        return {
                            state: "success",
                            data: b
                        }
                    }
                    n.extend({
                            active: 0,
                            lastModified: {},
                            etag: {},
                            ajaxSettings: {
                                url: fc,
                                type: "GET",
                                isLocal: jc.test(ec[1]),
                                global: !0,
                                processData: !0,
                                async: !0,
                                contentType: "application/x-www-form-urlencoded;charset=UTF-8",
                                accepts: {
                                    "*": pc,
                                    text: "text/plain",
                                    html: "text/html",
                                    xml: "application/xml, text/xml",
                                    json: "application/json, text/javascript"
                                },
                                contents: {
                                    xml: /xml/,
                                    html: /html/,
                                    json: /json/
                                },
                                responseFields: {
                                    xml: "responseXML",
                                    text: "responseText",
                                    json: "responseJSON"
                                },
                                converters: {
                                    "* text": String,
                                    "text html": !0,
                                    "text json": n.parseJSON,
                                    "text xml": n.parseXML
                                },
                                flatOptions: {
                                    url: !0,
                                    context: !0
                                }
                            },
                            ajaxSetup: function(a, b) {
                                return b ? tc(tc(a, n.ajaxSettings), b) : tc(n.ajaxSettings, a)
                            },
                            ajaxPrefilter: rc(nc),
                            ajaxTransport: rc(oc),
                            ajax: function(a, b) {
                                "object" == typeof a && (b = a,
                                        a = void 0),
                                    b = b || {};
                                var c, d, e, f, g, h, i, j, k = n.ajaxSetup({}, b),
                                    l = k.context || k,
                                    m = k.context && (l.nodeType || l.jquery) ? n(l) : n.event,
                                    o = n.Deferred(),
                                    p = n.Callbacks("once memory"),
                                    q = k.statusCode || {},
                                    r = {},
                                    s = {},
                                    t = 0,
                                    u = "canceled",
                                    v = {
                                        readyState: 0,
                                        getResponseHeader: function(a) {
                                            var b;
                                            if (2 === t) {
                                                if (!f) {
                                                    f = {};
                                                    while (b = ic.exec(e))
                                                        f[b[1].toLowerCase()] = b[2]
                                                }
                                                b = f[a.toLowerCase()]
                                            }
                                            return null == b ? null : b
                                        },
                                        getAllResponseHeaders: function() {
                                            return 2 === t ? e : null
                                        },
                                        setRequestHeader: function(a, b) {
                                            var c = a.toLowerCase();
                                            return t || (a = s[c] = s[c] || a,
                                                    r[a] = b),
                                                this
                                        },
                                        overrideMimeType: function(a) {
                                            return t || (k.mimeType = a),
                                                this
                                        },
                                        statusCode: function(a) {
                                            var b;
                                            if (a)
                                                if (2 > t)
                                                    for (b in a)
                                                        q[b] = [q[b], a[b]];
                                                else
                                                    v.always(a[v.status]);
                                            return this
                                        },
                                        abort: function(a) {
                                            var b = a || u;
                                            return c && c.abort(b),
                                                x(0, b),
                                                this
                                        }
                                    };
                                if (o.promise(v).complete = p.add,
                                    v.success = v.done,
                                    v.error = v.fail,
                                    k.url = ((a || k.url || fc) + "").replace(gc, "").replace(lc, ec[1] + "//"),
                                    k.type = b.method || b.type || k.method || k.type,
                                    k.dataTypes = n.trim(k.dataType || "*").toLowerCase().match(E) || [""],
                                    null == k.crossDomain && (h = mc.exec(k.url.toLowerCase()),
                                        k.crossDomain = !(!h || h[1] === ec[1] && h[2] === ec[2] && (h[3] || ("http:" === h[1] ? "80" : "443")) === (ec[3] || ("http:" === ec[1] ? "80" : "443")))),
                                    k.data && k.processData && "string" != typeof k.data && (k.data = n.param(k.data, k.traditional)),
                                    sc(nc, k, b, v),
                                    2 === t)
                                    return v;
                                i = k.global,
                                    i && 0 === n.active++ && n.event.trigger("ajaxStart"),
                                    k.type = k.type.toUpperCase(),
                                    k.hasContent = !kc.test(k.type),
                                    d = k.url,
                                    k.hasContent || (k.data && (d = k.url += (dc.test(d) ? "&" : "?") + k.data,
                                            delete k.data),
                                        k.cache === !1 && (k.url = hc.test(d) ? d.replace(hc, "$1_=" + cc++) : d + (dc.test(d) ? "&" : "?") + "_=" + cc++)),
                                    k.ifModified && (n.lastModified[d] && v.setRequestHeader("If-Modified-Since", n.lastModified[d]),
                                        n.etag[d] && v.setRequestHeader("If-None-Match", n.etag[d])),
                                    (k.data && k.hasContent && k.contentType !== !1 || b.contentType) && v.setRequestHeader("Content-Type", k.contentType),
                                    v.setRequestHeader("Accept", k.dataTypes[0] && k.accepts[k.dataTypes[0]] ? k.accepts[k.dataTypes[0]] + ("*" !== k.dataTypes[0] ? ", " + pc + ";q=0.01" : "") : k.accepts["*"]);
                                for (j in k.headers)
                                    v.setRequestHeader(j, k.headers[j]);
                                if (k.beforeSend && (k.beforeSend.call(l, v, k) === !1 || 2 === t))
                                    return v.abort();
                                u = "abort";
                                for (j in {
                                        success: 1,
                                        error: 1,
                                        complete: 1
                                    })
                                    v[j](k[j]);
                                if (c = sc(oc, k, b, v)) {
                                    v.readyState = 1,
                                        i && m.trigger("ajaxSend", [v, k]),
                                        k.async && k.timeout > 0 && (g = setTimeout(function() {
                                            v.abort("timeout")
                                        }, k.timeout));
                                    try {
                                        t = 1,
                                            c.send(r, x)
                                    } catch (w) {
                                        if (!(2 > t))
                                            throw w;
                                        x(-1, w)
                                    }
                                } else
                                    x(-1, "No Transport");
                                function x(a, b, f, h) {
                                    var j, r, s, u, w, x = b;
                                    2 !== t && (t = 2,
                                        g && clearTimeout(g),
                                        c = void 0,
                                        e = h || "",
                                        v.readyState = a > 0 ? 4 : 0,
                                        j = a >= 200 && 300 > a || 304 === a,
                                        f && (u = uc(k, v, f)),
                                        u = vc(k, u, v, j),
                                        j ? (k.ifModified && (w = v.getResponseHeader("Last-Modified"),
                                                w && (n.lastModified[d] = w),
                                                w = v.getResponseHeader("etag"),
                                                w && (n.etag[d] = w)),
                                            204 === a || "HEAD" === k.type ? x = "nocontent" : 304 === a ? x = "notmodified" : (x = u.state,
                                                r = u.data,
                                                s = u.error,
                                                j = !s)) : (s = x,
                                            (a || !x) && (x = "error",
                                                0 > a && (a = 0))),
                                        v.status = a,
                                        v.statusText = (b || x) + "",
                                        j ? o.resolveWith(l, [r, x, v]) : o.rejectWith(l, [v, x, s]),
                                        v.statusCode(q),
                                        q = void 0,
                                        i && m.trigger(j ? "ajaxSuccess" : "ajaxError", [v, k, j ? r : s]),
                                        p.fireWith(l, [v, x]),
                                        i && (m.trigger("ajaxComplete", [v, k]),
                                            --n.active || n.event.trigger("ajaxStop")))
                                }
                                return v
                            },
                            getJSON: function(a, b, c) {
                                return n.get(a, b, c, "json")
                            },
                            getScript: function(a, b) {
                                return n.get(a, void 0, b, "script")
                            }
                        }),
                        n.each(["get", "post"], function(a, b) {
                            n[b] = function(a, c, d, e) {
                                return n.isFunction(c) && (e = e || d,
                                        d = c,
                                        c = void 0),
                                    n.ajax({
                                        url: a,
                                        type: b,
                                        dataType: e,
                                        data: c,
                                        success: d
                                    })
                            }
                        }),
                        n.each(["ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend"], function(a, b) {
                            n.fn[b] = function(a) {
                                return this.on(b, a)
                            }
                        }),
                        n._evalUrl = function(a) {
                            return n.ajax({
                                url: a,
                                type: "GET",
                                dataType: "script",
                                async: !1,
                                global: !1,
                                "throws": !0
                            })
                        },
                        n.fn.extend({
                            wrapAll: function(a) {
                                var b;
                                return n.isFunction(a) ? this.each(function(b) {
                                    n(this).wrapAll(a.call(this, b))
                                }) : (this[0] && (b = n(a, this[0].ownerDocument).eq(0).clone(!0),
                                        this[0].parentNode && b.insertBefore(this[0]),
                                        b.map(function() {
                                            var a = this;
                                            while (a.firstElementChild)
                                                a = a.firstElementChild;
                                            return a
                                        }).append(this)),
                                    this)
                            },
                            wrapInner: function(a) {
                                return this.each(n.isFunction(a) ? function(b) {
                                        n(this).wrapInner(a.call(this, b))
                                    } :
                                    function() {
                                        var b = n(this),
                                            c = b.contents();
                                        c.length ? c.wrapAll(a) : b.append(a)
                                    }
                                )
                            },
                            wrap: function(a) {
                                var b = n.isFunction(a);
                                return this.each(function(c) {
                                    n(this).wrapAll(b ? a.call(this, c) : a)
                                })
                            },
                            unwrap: function() {
                                return this.parent().each(function() {
                                    n.nodeName(this, "body") || n(this).replaceWith(this.childNodes)
                                }).end()
                            }
                        }),
                        n.expr.filters.hidden = function(a) {
                            return a.offsetWidth <= 0 && a.offsetHeight <= 0
                        },
                        n.expr.filters.visible = function(a) {
                            return !n.expr.filters.hidden(a)
                        };
                    var wc = /%20/g,
                        xc = /\[\]$/,
                        yc = /\r?\n/g,
                        zc = /^(?:submit|button|image|reset|file)$/i,
                        Ac = /^(?:input|select|textarea|keygen)/i;
                    function Bc(a, b, c, d) {
                        var e;
                        if (n.isArray(b))
                            n.each(b, function(b, e) {
                                c || xc.test(a) ? d(a, e) : Bc(a + "[" + ("object" == typeof e ? b : "") + "]", e, c, d)
                            });
                        else if (c || "object" !== n.type(b))
                            d(a, b);
                        else
                            for (e in b)
                                Bc(a + "[" + e + "]", b[e], c, d)
                    }
                    n.param = function(a, b) {
                            var c, d = [],
                                e = function(a, b) {
                                    b = n.isFunction(b) ? b() : null == b ? "" : b,
                                        d[d.length] = encodeURIComponent(a) + "=" + encodeURIComponent(b)
                                };
                            if (void 0 === b && (b = n.ajaxSettings && n.ajaxSettings.traditional),
                                n.isArray(a) || a.jquery && !n.isPlainObject(a))
                                n.each(a, function() {
                                    e(this.name, this.value)
                                });
                            else
                                for (c in a)
                                    Bc(c, a[c], b, e);
                            return d.join("&").replace(wc, "+")
                        },
                        n.fn.extend({
                            serialize: function() {
                                return n.param(this.serializeArray())
                            },
                            serializeArray: function() {
                                return this.map(function() {
                                    var a = n.prop(this, "elements");
                                    return a ? n.makeArray(a) : this
                                }).filter(function() {
                                    var a = this.type;
                                    return this.name && !n(this).is(":disabled") && Ac.test(this.nodeName) && !zc.test(a) && (this.checked || !T.test(a))
                                }).map(function(a, b) {
                                    var c = n(this).val();
                                    return null == c ? null : n.isArray(c) ? n.map(c, function(a) {
                                        return {
                                            name: b.name,
                                            value: a.replace(yc, "\r\n")
                                        }
                                    }) : {
                                        name: b.name,
                                        value: c.replace(yc, "\r\n")
                                    }
                                }).get()
                            }
                        }),
                        n.ajaxSettings.xhr = function() {
                            try {
                                return new XMLHttpRequest
                            } catch (a) {}
                        };
                    var Cc = 0,
                        Dc = {},
                        Ec = {
                            0: 200,
                            1223: 204
                        },
                        Fc = n.ajaxSettings.xhr();
                    a.ActiveXObject && n(a).on("unload", function() {
                            for (var a in Dc)
                                Dc[a]()
                        }),
                        k.cors = !!Fc && "withCredentials" in Fc,
                        k.ajax = Fc = !!Fc,
                        n.ajaxTransport(function(a) {
                            var b;
                            return k.cors || Fc && !a.crossDomain ? {
                                send: function(c, d) {
                                    var e, f = a.xhr(),
                                        g = ++Cc;
                                    if (f.open(a.type, a.url, a.async, a.username, a.password),
                                        a.xhrFields)
                                        for (e in a.xhrFields)
                                            f[e] = a.xhrFields[e];
                                    a.mimeType && f.overrideMimeType && f.overrideMimeType(a.mimeType),
                                        a.crossDomain || c["X-Requested-With"] || (c["X-Requested-With"] = "XMLHttpRequest");
                                    for (e in c)
                                        f.setRequestHeader(e, c[e]);
                                    b = function(a) {
                                            return function() {
                                                b && (delete Dc[g],
                                                    b = f.onload = f.onerror = null,
                                                    "abort" === a ? f.abort() : "error" === a ? d(f.status, f.statusText) : d(Ec[f.status] || f.status, f.statusText, "string" == typeof f.responseText ? {
                                                        text: f.responseText
                                                    } : void 0, f.getAllResponseHeaders()))
                                            }
                                        },
                                        f.onload = b(),
                                        f.onerror = b("error"),
                                        b = Dc[g] = b("abort");
                                    try {
                                        f.send(a.hasContent && a.data || null)
                                    } catch (h) {
                                        if (b)
                                            throw h
                                    }
                                },
                                abort: function() {
                                    b && b()
                                }
                            } : void 0
                        }),
                        n.ajaxSetup({
                            accepts: {
                                script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
                            },
                            contents: {
                                script: /(?:java|ecma)script/
                            },
                            converters: {
                                "text script": function(a) {
                                    return n.globalEval(a),
                                        a
                                }
                            }
                        }),
                        n.ajaxPrefilter("script", function(a) {
                            void 0 === a.cache && (a.cache = !1),
                                a.crossDomain && (a.type = "GET")
                        }),
                        n.ajaxTransport("script", function(a) {
                            if (a.crossDomain) {
                                var b, c;
                                return {
                                    send: function(d, e) {
                                        b = n("<script>").prop({
                                                async: !0,
                                                charset: a.scriptCharset,
                                                src: a.url
                                            }).on("load error", c = function(a) {
                                                b.remove(),
                                                    c = null,
                                                    a && e("error" === a.type ? 404 : 200, a.type)
                                            }),
                                            l.head.appendChild(b[0])
                                    },
                                    abort: function() {
                                        c && c()
                                    }
                                }
                            }
                        });
                    var Gc = [],
                        Hc = /(=)\?(?=&|$)|\?\?/;
                    n.ajaxSetup({
                            jsonp: "callback",
                            jsonpCallback: function() {
                                var a = Gc.pop() || n.expando + "_" + cc++;
                                return this[a] = !0,
                                    a
                            }
                        }),
                        n.ajaxPrefilter("json jsonp", function(b, c, d) {
                            var e, f, g, h = b.jsonp !== !1 && (Hc.test(b.url) ? "url" : "string" == typeof b.data && !(b.contentType || "").indexOf("application/x-www-form-urlencoded") && Hc.test(b.data) && "data");
                            return h || "jsonp" === b.dataTypes[0] ? (e = b.jsonpCallback = n.isFunction(b.jsonpCallback) ? b.jsonpCallback() : b.jsonpCallback,
                                h ? b[h] = b[h].replace(Hc, "$1" + e) : b.jsonp !== !1 && (b.url += (dc.test(b.url) ? "&" : "?") + b.jsonp + "=" + e),
                                b.converters["script json"] = function() {
                                    return g || n.error(e + " was not called"),
                                        g[0]
                                },
                                b.dataTypes[0] = "json",
                                f = a[e],
                                a[e] = function() {
                                    g = arguments
                                },
                                d.always(function() {
                                    a[e] = f,
                                        b[e] && (b.jsonpCallback = c.jsonpCallback,
                                            Gc.push(e)),
                                        g && n.isFunction(f) && f(g[0]),
                                        g = f = void 0
                                }),
                                "script") : void 0
                        }),
                        n.parseHTML = function(a, b, c) {
                            if (!a || "string" != typeof a)
                                return null;
                            "boolean" == typeof b && (c = b,
                                    b = !1),
                                b = b || l;
                            var d = v.exec(a),
                                e = !c && [];
                            return d ? [b.createElement(d[1])] : (d = n.buildFragment([a], b, e),
                                e && e.length && n(e).remove(),
                                n.merge([], d.childNodes))
                        };
                    var Ic = n.fn.load;
                    n.fn.load = function(a, b, c) {
                            if ("string" != typeof a && Ic)
                                return Ic.apply(this, arguments);
                            var d, e, f, g = this,
                                h = a.indexOf(" ");
                            return h >= 0 && (d = n.trim(a.slice(h)),
                                    a = a.slice(0, h)),
                                n.isFunction(b) ? (c = b,
                                    b = void 0) : b && "object" == typeof b && (e = "POST"),
                                g.length > 0 && n.ajax({
                                    url: a,
                                    type: e,
                                    dataType: "html",
                                    data: b
                                }).done(function(a) {
                                    f = arguments,
                                        g.html(d ? n("<div>").append(n.parseHTML(a)).find(d) : a)
                                }).complete(c && function(a, b) {
                                    g.each(c, f || [a.responseText, b, a])
                                }),
                                this
                        },
                        n.expr.filters.animated = function(a) {
                            return n.grep(n.timers, function(b) {
                                return a === b.elem
                            }).length
                        };
                    var Jc = a.document.documentElement;
                    function Kc(a) {
                        return n.isWindow(a) ? a : 9 === a.nodeType && a.defaultView
                    }
                    n.offset = {
                            setOffset: function(a, b, c) {
                                var d, e, f, g, h, i, j, k = n.css(a, "position"),
                                    l = n(a),
                                    m = {};
                                "static" === k && (a.style.position = "relative"),
                                    h = l.offset(),
                                    f = n.css(a, "top"),
                                    i = n.css(a, "left"),
                                    j = ("absolute" === k || "fixed" === k) && (f + i).indexOf("auto") > -1,
                                    j ? (d = l.position(),
                                        g = d.top,
                                        e = d.left) : (g = parseFloat(f) || 0,
                                        e = parseFloat(i) || 0),
                                    n.isFunction(b) && (b = b.call(a, c, h)),
                                    null != b.top && (m.top = b.top - h.top + g),
                                    null != b.left && (m.left = b.left - h.left + e),
                                    "using" in b ? b.using.call(a, m) : l.css(m)
                            }
                        },
                        n.fn.extend({
                            offset: function(a) {
                                if (arguments.length)
                                    return void 0 === a ? this : this.each(function(b) {
                                        n.offset.setOffset(this, a, b)
                                    });
                                var b, c, d = this[0],
                                    e = {
                                        top: 0,
                                        left: 0
                                    },
                                    f = d && d.ownerDocument;
                                if (f)
                                    return b = f.documentElement,
                                        n.contains(b, d) ? (typeof d.getBoundingClientRect !== U && (e = d.getBoundingClientRect()),
                                            c = Kc(f), {
                                                top: e.top + c.pageYOffset - b.clientTop,
                                                left: e.left + c.pageXOffset - b.clientLeft
                                            }) : e
                            },
                            position: function() {
                                if (this[0]) {
                                    var a, b, c = this[0],
                                        d = {
                                            top: 0,
                                            left: 0
                                        };
                                    return "fixed" === n.css(c, "position") ? b = c.getBoundingClientRect() : (a = this.offsetParent(),
                                        b = this.offset(),
                                        n.nodeName(a[0], "html") || (d = a.offset()),
                                        d.top += n.css(a[0], "borderTopWidth", !0),
                                        d.left += n.css(a[0], "borderLeftWidth", !0)), {
                                        top: b.top - d.top - n.css(c, "marginTop", !0),
                                        left: b.left - d.left - n.css(c, "marginLeft", !0)
                                    }
                                }
                            },
                            offsetParent: function() {
                                return this.map(function() {
                                    var a = this.offsetParent || Jc;
                                    while (a && !n.nodeName(a, "html") && "static" === n.css(a, "position"))
                                        a = a.offsetParent;
                                    return a || Jc
                                })
                            }
                        }),
                        n.each({
                            scrollLeft: "pageXOffset",
                            scrollTop: "pageYOffset"
                        }, function(b, c) {
                            var d = "pageYOffset" === c;
                            n.fn[b] = function(e) {
                                return J(this, function(b, e, f) {
                                    var g = Kc(b);
                                    return void 0 === f ? g ? g[c] : b[e] : void(g ? g.scrollTo(d ? a.pageXOffset : f, d ? f : a.pageYOffset) : b[e] = f)
                                }, b, e, arguments.length, null)
                            }
                        }),
                        n.each(["top", "left"], function(a, b) {
                            n.cssHooks[b] = yb(k.pixelPosition, function(a, c) {
                                return c ? (c = xb(a, b),
                                    vb.test(c) ? n(a).position()[b] + "px" : c) : void 0
                            })
                        }),
                        n.each({
                            Height: "height",
                            Width: "width"
                        }, function(a, b) {
                            n.each({
                                padding: "inner" + a,
                                content: b,
                                "": "outer" + a
                            }, function(c, d) {
                                n.fn[d] = function(d, e) {
                                    var f = arguments.length && (c || "boolean" != typeof d),
                                        g = c || (d === !0 || e === !0 ? "margin" : "border");
                                    return J(this, function(b, c, d) {
                                        var e;
                                        return n.isWindow(b) ? b.document.documentElement["client" + a] : 9 === b.nodeType ? (e = b.documentElement,
                                            Math.max(b.body["scroll" + a], e["scroll" + a], b.body["offset" + a], e["offset" + a], e["client" + a])) : void 0 === d ? n.css(b, c, g) : n.style(b, c, d, g)
                                    }, b, f ? d : void 0, f, null)
                                }
                            })
                        }),
                        n.fn.size = function() {
                            return this.length
                        },
                        n.fn.andSelf = n.fn.addBack,
                        "function" == typeof define && define.amd && define("jquery", [], function() {
                            return n
                        });
                    var Lc = a.jQuery,
                        Mc = a.$;
                    return n.noConflict = function(b) {
                            return a.$ === n && (a.$ = Mc),
                                b && a.jQuery === n && (a.jQuery = Lc),
                                n
                        },
                        typeof b === U && (a.jQuery = a.$ = n),
                        n
                });
            } catch (err) {
                console.error(err);
            }
            
          	
             Object.defineProperty(frdl, 'jQuery',
				{
					'get':function()
					{
						return jQuery;
					}
				});  
            
            frdl.require.cache('jQuery', frdl.jQuery);   
            frdl.require.state.emit('resolved jQuery');
}());
            
         (function() {
                function wordToByteArray(wordArray) {
                    var byteArray = [],
                        word, i, j;
                    for (i = 0; i < wordArray.length; ++i) {
                        word = wordArray[i];
                        for (j = 3; j >= 0; --j) {
                            byteArray.push((word >> 8 * j) & 0xFF);
                        }
                    }
                    return byteArray;
                }
                frdl.wordToByteArray = wordToByteArray;
                function byteArrayToString(byteArray) {
                    var str = "",
                        i;
                    for (i = 0; i < byteArray.length; ++i) {
                        str += String.fromCharCode(byteArray[i]);
                    }
                    return str;
                }
                frdl.byteArrayToString = byteArrayToString;
            }());
          
          
          
(function() {
    'use strict';
    function placeHoldersCount(b64) {
        var len = b64.length;
        if (len % 4 > 0) {
            throw new Error('Invalid string. Length must be a multiple of 4');
        }
        return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0;
    }
    function byteLength(b64) {
        return b64.length * 3 / 4 - placeHoldersCount(b64);
    }
    function toByteArray(b64) {
        var i, j, l, tmp, placeHolders, arr;
        var len = b64.length;
        placeHolders = placeHoldersCount(b64);
        arr = new Arr(len * 3 / 4 - placeHolders);
        l = placeHolders > 0 ? len - 4 : len;
        var L = 0;
        for (i = 0, j = 0; i < l; i += 4, j += 3) {
            tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)];
            arr[L++] = (tmp >> 16) & 0xFF;
            arr[L++] = (tmp >> 8) & 0xFF;
            arr[L++] = tmp & 0xFF;
        }
        if (placeHolders === 2) {
            tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4);
            arr[L++] = tmp & 0xFF;
        } else if (placeHolders === 1) {
            tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2);
            arr[L++] = (tmp >> 8) & 0xFF;
            arr[L++] = tmp & 0xFF;
        }
        return arr;
    }
    function tripletToBase64(num) {
        return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F];
    }
    function encodeChunk(uint8, start, end) {
        var tmp;
        var output = [];
        for (var i = start; i < end; i += 3) {
            tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]);
            output.push(tripletToBase64(tmp));
        }
        return output.join('');
    }
    function fromByteArray(uint8) {
        var tmp;
        var len = uint8.length;
        var extraBytes = len % 3;
        var output = '';
        var parts = [];
        var maxChunkLength = 16383;
        for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
            parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)));
        }
        if (extraBytes === 1) {
            tmp = uint8[len - 1];
            output += lookup[tmp >> 2];
            output += lookup[(tmp << 4) & 0x3F];
            output += '==';
        } else if (extraBytes === 2) {
            tmp = (uint8[len - 2] << 8) + (uint8[len - 1]);
            output += lookup[tmp >> 10];
            output += lookup[(tmp >> 4) & 0x3F];
            output += lookup[(tmp << 2) & 0x3F];
            output += '=';
        }
        parts.push(output);
        return parts.join('');
    }
    var base64 = {};
    base64.byteLength = byteLength;
    base64.toByteArray = toByteArray;
    base64.fromByteArray = fromByteArray;
    var lookup = [];
    var revLookup = [];
    var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array;
    var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    for (var i = 0, len = code.length; i < len; ++i) {
        lookup[i] = code[i];
        revLookup[code.charCodeAt(i)] = i;
    }
    revLookup['-'.charCodeAt(0)] = 62;
    revLookup['_'.charCodeAt(0)] = 63;
    require.cache('base64-js', base64);
}());
(function() {
    'use strict';
    var ieee754 = {};
    ieee754.read = function(buffer, offset, isLE, mLen, nBytes) {
        var e, m;
        var eLen = nBytes * 8 - mLen - 1;
        var eMax = (1 << eLen) - 1;
        var eBias = eMax >> 1;
        var nBits = -7;
        var i = isLE ? (nBytes - 1) : 0;
        var d = isLE ? -1 : 1;
        var s = buffer[offset + i];
        i += d;
        e = s & ((1 << (-nBits)) - 1);
        s >>= (-nBits);
        nBits += eLen;
        for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
        m = e & ((1 << (-nBits)) - 1);
        e >>= (-nBits);
        nBits += mLen;
        for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
        if (e === 0) {
            e = 1 - eBias;
        } else if (e === eMax) {
            return m ? NaN : ((s ? -1 : 1) * Infinity);
        } else {
            m = m + Math.pow(2, mLen);
            e = e - eBias;
        }
        return (s ? -1 : 1) * m * Math.pow(2, e - mLen);
    };
    ieee754.write = function(buffer, value, offset, isLE, mLen, nBytes) {
        var e, m, c;
        var eLen = nBytes * 8 - mLen - 1;
        var eMax = (1 << eLen) - 1;
        var eBias = eMax >> 1;
        var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0);
        var i = isLE ? 0 : (nBytes - 1);
        var d = isLE ? 1 : -1;
        var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;
        value = Math.abs(value);
        if (isNaN(value) || value === Infinity) {
            m = isNaN(value) ? 1 : 0;
            e = eMax;
        } else {
            e = Math.floor(Math.log(value) / Math.LN2);
            if (value * (c = Math.pow(2, -e)) < 1) {
                e--;
                c *= 2;
            }
            if (e + eBias >= 1) {
                value += rt / c;
            } else {
                value += rt * Math.pow(2, 1 - eBias);
            }
            if (value * c >= 2) {
                e++;
                c /= 2;
            }
            if (e + eBias >= eMax) {
                m = 0;
                e = eMax;
            } else if (e + eBias >= 1) {
                m = (value * c - 1) * Math.pow(2, mLen);
                e = e + eBias;
            } else {
                m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
                e = 0;
            }
        }
        for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
        e = (e << mLen) | m;
        eLen += mLen;
        for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
        buffer[offset + i - d] |= s * 128;
    };
    require.cache('ieee754', ieee754);
}());
(function() {
    'use strict';
    function hasOwnProperty(obj, prop) {
        return Object.prototype.hasOwnProperty.call(obj, prop);
    }
    var parse = function(qs, sep, eq, options) {
        sep = sep || '&';
        eq = eq || '=';
        var obj = {};
        if (typeof qs !== 'string' || qs.length === 0) {
            return obj;
        }
        var regexp = /\+/g;
        qs = qs.split(sep);
        var maxKeys = 1000;
        if (options && typeof options.maxKeys === 'number') {
            maxKeys = options.maxKeys;
        }
        var len = qs.length;
        if (maxKeys > 0 && len > maxKeys) {
            len = maxKeys;
        }
        for (var i = 0; i < len; ++i) {
            var x = qs[i].replace(regexp, '%20'),
                idx = x.indexOf(eq),
                kstr, vstr, k, v;
            if (idx >= 0) {
                kstr = x.substr(0, idx);
                vstr = x.substr(idx + 1);
            } else {
                kstr = x;
                vstr = '';
            }
            k = decodeURIComponent(kstr);
            v = decodeURIComponent(vstr);
            if (!hasOwnProperty(obj, k)) {
                obj[k] = v;
            } else if (Array.isArray(obj[k])) {
                obj[k].push(v);
            } else {
                obj[k] = [obj[k], v];
            }
        }
        return obj;
    };
    var stringifyPrimitive = function(v) {
        if ('undefined' === typeof v) {
            return 'undefined';
        }
        switch (typeof v) {
            case 'string':
                return v;
            case 'boolean':
                return v ? 'true' : 'false';
            case 'number':
                return isFinite(v) ? v : '';
            default:
                return '';
        }
    };
    var stringify = function(obj, sep, eq, name) {
        sep = sep || '&';
        eq = eq || '=';
        if (obj === null) {
            obj = undefined;
        }
        if (typeof obj === 'object') {
            return Object.keys(obj).map(function(k) {
                var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
                if (Array.isArray(obj[k])) {
                    return obj[k].map(function(v) {
                        return ks + encodeURIComponent(stringifyPrimitive(v));
                    }).join(sep);
                } else {
                    return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
                }
            }).join(sep);
        }
        if (!name)
            return '';
        return encodeURIComponent(stringifyPrimitive(name)) + eq + encodeURIComponent(stringifyPrimitive(obj));
    };
    var querystring = {};
    querystring.decode = querystring.parse = parse;
    querystring.encode = querystring.stringify = stringify;
    require.cache('querystring', querystring);
}());
(function() {
    var maxInt = 2147483647;
    var base = 36;
    var tMin = 1;
    var tMax = 26;
    var skew = 38;
    var damp = 700;
    var initialBias = 72;
    var initialN = 128;
    var delimiter = '-';
    var regexPunycode = /^xn--/;
    var regexNonASCII = /[^x20-x7E]/;
    var regexSeparators = /[x2E\u3002\uFF0E\uFF61]/g;
    var errors = {
        'overflow': 'Overflow: input needs wider integers to process',
        'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
        'invalid-input': 'Invalid input'
    };
    var baseMinusTMin = base - tMin;
    var floor = Math.floor;
    var stringFromCharCode = String.fromCharCode;
    function error(type) {
        throw new RangeError(errors[type]);
    }
    function map(array, fn) {
        var result = [];
        var length = array.length;
        while (length--) {
            result[length] = fn(array[length]);
        }
        return result;
    }
    function mapDomain(string, fn) {
        var parts = string.split('\@');
        var result = '';
        if (parts.length > 1) {
            result = parts[0] + '@';
            string = parts[1];
        }
        string = string.replace(regexSeparators, 'x2E');
        var labels = string.split('.');
        var encoded = map(labels, fn).join('.');
        return result + encoded;
    }
    function ucs2decode(string) {
        var output = [];
        var counter = 0;
        var length = string.length;
        while (counter < length) {
            var value = string.charCodeAt(counter++);
            if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
                var extra = string.charCodeAt(counter++);
                if ((extra & 0xFC00) == 0xDC00) {
                    output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
                } else {
                    output.push(value);
                    counter--;
                }
            } else {
                output.push(value);
            }
        }
        return output;
    }
    var ucs2encode = function(array) {
        String.fromCodePoint(array);
    };
    var basicToDigit = function(codePoint) {
        if (codePoint - 0x30 < 0x0A) {
            return codePoint - 0x16;
        }
        if (codePoint - 0x41 < 0x1A) {
            return codePoint - 0x41;
        }
        if (codePoint - 0x61 < 0x1A) {
            return codePoint - 0x61;
        }
        return base;
    };
    var digitToBasic = function(digit, flag) {
        return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
    };
    var adapt = function(delta, numPoints, firstTime) {
        var k = 0;
        delta = firstTime ? floor(delta / damp) : delta >> 1;
        delta += floor(delta / numPoints);
        while (delta > baseMinusTMin * tMax >> 1) {
            k += base;
            delta = floor(delta / baseMinusTMin);
        }
        return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
    };
    var decode = function(input) {
        var output = [];
        var inputLength = input.length;
        var i = 0,
            j = 0;
        var n = initialN;
        var bias = initialBias;
        var basic = input.lastIndexOf(delimiter);
        if (basic < 0) {
            basic = 0;
        }
        for (j = 0; j < basic; ++j) {
            if (input.charCodeAt(j) >= 0x80) {
                error('not-basic');
            }
            output.push(input.charCodeAt(j));
        }
        for (var index = basic > 0 ? basic + 1 : 0; index < inputLength;) {
            var oldi = i;
            for (var w = 1, k = base;; k += base) {
                if (index >= inputLength) {
                    error('invalid-input');
                }
                var digit = basicToDigit(input.charCodeAt(index++));
                if (digit >= base || digit > floor((maxInt - i) / w)) {
                    error('overflow');
                }
                i += digit * w;
                var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
                if (digit < t) {
                    break;
                }
                var baseMinusT = base - t;
                if (w > floor(maxInt / baseMinusT)) {
                    error('overflow');
                }
                w *= baseMinusT;
            }
            var out = output.length + 1;
            bias = adapt(i - oldi, out, oldi == 0);
            if (floor(i / out) > maxInt - n) {
                error('overflow');
            }
            n += floor(i / out);
            i %= out;
            output.splice(i++, 0, n);
        }
        return String.fromCodePoint(output);
    };
    var encode = function(input) {
        var output = [];
        input = ucs2decode(input);
        var inputLength = input.length;
        var currentValue;
        var n = initialN;
        var delta = 0;
        var bias = initialBias;
        for (currentValue in input) {
            if (currentValue < 0x80) {
                output.push(stringFromCharCode(currentValue));
            }
        }
        var basicLength = output.length;
        var handledCPCount = basicLength;
        if (basicLength) {
            output.push(delimiter);
        }
        while (handledCPCount < inputLength) {
            var m = maxInt;
            for (currentValue in input) {
                if (currentValue >= n && currentValue < m) {
                    m = currentValue;
                }
            }
            var handledCPCountPlusOne = handledCPCount + 1;
            if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
                error('overflow');
            }
            delta += (m - n) * handledCPCountPlusOne;
            n = m;
            for (currentValue in input) {
                if (currentValue < n && ++delta > maxInt) {
                    error('overflow');
                }
                if (currentValue == n) {
                    var q = delta;
                    for (var k = base;; k += base) {
                        var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
                        if (q < t) {
                            break;
                        }
                        var qMinusT = q - t;
                        var baseMinusT = base - t;
                        output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)));
                        q = floor(qMinusT / baseMinusT);
                    }
                    output.push(stringFromCharCode(digitToBasic(q, 0)));
                    bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
                    delta = 0;
                    ++handledCPCount;
                }
            }
            ++delta;
            ++n;
        }
        return output.join('');
    };
    var toUnicode = function(input) {
        return mapDomain(input, function(string) {
            return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string;
        });
    };
    var toASCII = function(input) {
        return mapDomain(input, function(string) {
            return regexNonASCII.test(string) ? 'xn--' + encode(string) : string;
        });
    };
    var punycode = {
        'version': '2.0.0',
        'ucs2': {
            'decode': ucs2decode,
            'encode': ucs2encode
        },
        'decode': decode,
        'encode': encode,
        'toASCII': toASCII,
        'toUnicode': toUnicode
    };
    require.cache('punycode', punycode);
}());
(function() {
    var punycode = require.cache('punycode');
    var util = {};
    var formatRegExp = /%[sdj%]/g;
    util.format = function(f) {
        if (!isString(f)) {
            var objects = [];
            for (var i = 0; i < arguments.length; i++) {
                objects.push(inspect(arguments[i]));
            }
            return objects.join(' ');
        }
        var i = 1;
        var args = arguments;
        var len = args.length;
        var str = String(f).replace(formatRegExp, function(x) {
            if (x === '%%')
                return '%';
            if (i >= len)
                return x;
            switch (x) {
                case '%s':
                    return String(args[i++]);
                case '%d':
                    return Number(args[i++]);
                case '%j':
                    try {
                        return JSON.stringify(args[i++]);
                    } catch (_) {
                        return '[Circular]';
                    }
                default:
                    return x;
            }
        });
        for (var x = args[i]; i < len; x = args[++i]) {
            if (isNull(x) || !isObject(x)) {
                str += ' ' + x;
            } else {
                str += ' ' + inspect(x);
            }
        }
        return str;
    };
    function inspect(obj, opts) {
        var ctx = {
            seen: [],
            stylize: stylizeNoColor
        };
        if (arguments.length >= 3)
            ctx.depth = arguments[2];
        if (arguments.length >= 4)
            ctx.colors = arguments[3];
        if (isBoolean(opts)) {
            ctx.showHidden = opts;
        } else if (opts) {
            util._extend(ctx, opts);
        }
        if (isUndefined(ctx.showHidden))
            ctx.showHidden = false;
        if (isUndefined(ctx.depth))
            ctx.depth = 2;
        if (isUndefined(ctx.colors))
            ctx.colors = false;
        if (isUndefined(ctx.customInspect))
            ctx.customInspect = true;
        if (ctx.colors)
            ctx.stylize = stylizeWithColor;
        return formatValue(ctx, obj, ctx.depth);
    }
    util.inspect = inspect;
    inspect.colors = {
        'bold': [1, 22],
        'italic': [3, 23],
        'underline': [4, 24],
        'inverse': [7, 27],
        'white': [37, 39],
        'grey': [90, 39],
        'black': [30, 39],
        'blue': [34, 39],
        'cyan': [36, 39],
        'green': [32, 39],
        'magenta': [35, 39],
        'red': [31, 39],
        'yellow': [33, 39]
    };
    inspect.styles = {
        'special': 'cyan',
        'number': 'yellow',
        'boolean': 'yellow',
        'undefined': 'grey',
        'null': 'bold',
        'string': 'green',
        'date': 'magenta',
        'regexp': 'red'
    };
    function stylizeWithColor(str, styleType) {
        var style = inspect.styles[styleType];
        if (style) {
            return '\u001b[' + inspect.colors[style][0] + 'm' + str + '\u001b[' + inspect.colors[style][1] + 'm';
        } else {
            return str;
        }
    }
    function stylizeNoColor(str, styleType) {
        return str;
    }
    function arrayToHash(array) {
        var hash = {};
        array.forEach(function(val, idx) {
            hash[val] = true;
        });
        return hash;
    }
    function formatValue(ctx, value, recurseTimes) {
        var shims = {};
        if (new Error().hasOwnProperty('description')) {
            var ERROR_PROPERTY_FILTER = function(obj, array) {
                if (Object.prototype.toString.call(obj) === '[object Error]') {
                    array = array.filter(function(name) {
                        return name !== 'description' && name !== 'number';
                    });
                }
                return array;
            };
            shims.keys = function(object) {
                return ERROR_PROPERTY_FILTER(object, Object.keys(object));
            };
            shims.getOwnPropertyNames = function(object) {
                return ERROR_PROPERTY_FILTER(object, Object.getOwnPropertyNames(object));
            };
        } else {
            shims.keys = Object.keys;
            shims.getOwnPropertyNames = Object.getOwnPropertyNames;
        }
        if (ctx.customInspect && value && isFunction(value.inspect) && value.inspect !== util.inspect && !(value.constructor && value.constructor.prototype === value)) {
            var ret = value.inspect(recurseTimes);
            if (!isString(ret)) {
                ret = formatValue(ctx, ret, recurseTimes);
            }
            return ret;
        }
        var primitive = formatPrimitive(ctx, value);
        if (primitive) {
            return primitive;
        }
        var keys = shims.keys(value);
        var visibleKeys = arrayToHash(keys);
        if (ctx.showHidden) {
            keys = shims.getOwnPropertyNames(value);
        }
        if (keys.length === 0) {
            if (isFunction(value)) {
                var name = value.name ? ': ' + value.name : '';
                return ctx.stylize('[Function' + name + ']', 'special');
            }
            if (isRegExp(value)) {
                return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
            }
            if (isDate(value)) {
                return ctx.stylize(Date.prototype.toString.call(value), 'date');
            }
            if (isError(value)) {
                return formatError(value);
            }
        }
        var base = '',
            array = false,
            braces = ['{', '}'];
        if (isArray(value)) {
            array = true;
            braces = ['[', ']'];
        }
        if (isFunction(value)) {
            var n = value.name ? ': ' + value.name : '';
            base = ' [Function' + n + ']';
        }
        if (isRegExp(value)) {
            base = ' ' + RegExp.prototype.toString.call(value);
        }
        if (isDate(value)) {
            base = ' ' + Date.prototype.toUTCString.call(value);
        }
        if (isError(value)) {
            base = ' ' + formatError(value);
        }
        if (keys.length === 0 && (!array || value.length == 0)) {
            return braces[0] + base + braces[1];
        }
        if (recurseTimes < 0) {
            if (isRegExp(value)) {
                return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
            } else {
                return ctx.stylize('[Object]', 'special');
            }
        }
        ctx.seen.push(value);
        var output;
        if (array) {
            output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
        } else {
            output = keys.map(function(key) {
                return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
            });
        }
        ctx.seen.pop();
        return reduceToSingleString(output, base, braces);
    }
    function formatPrimitive(ctx, value) {
        if (isUndefined(value))
            return ctx.stylize('undefined', 'undefined');
        if (isString(value)) {
            var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '').replace(/'/g, "\\'").replace(/\\"/g, '"') + '\'';
            return ctx.stylize(simple, 'string');
        }
        if (isNumber(value))
            return ctx.stylize('' + value, 'number');
        if (isBoolean(value))
            return ctx.stylize('' + value, 'boolean');
        if (isNull(value))
            return ctx.stylize('null', 'null');
    }
    function formatError(value) {
        return '[' + Error.prototype.toString.call(value) + ']';
    }
    function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
        var output = [];
        for (var i = 0, l = value.length; i < l; ++i) {
            if (hasOwnProperty(value, String(i))) {
                output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, String(i), true));
            } else {
                output.push('');
            }
        }
        keys.forEach(function(key) {
            if (!key.match(/^\d+$/)) {
                output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, key, true));
            }
        });
        return output;
    }
    function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
        var name, str, desc;
        desc = Object.getOwnPropertyDescriptor(value, key) || {
            value: value[key]
        };
        if (desc.get) {
            if (desc.set) {
                str = ctx.stylize('[Getter/Setter]', 'special');
            } else {
                str = ctx.stylize('[Getter]', 'special');
            }
        } else {
            if (desc.set) {
                str = ctx.stylize('[Setter]', 'special');
            }
        }
        if (!hasOwnProperty(visibleKeys, key)) {
            name = '[' + key + ']';
        }
        if (!str) {
            if (ctx.seen.indexOf(desc.value) < 0) {
                if (isNull(recurseTimes)) {
                    str = formatValue(ctx, desc.value, null);
                } else {
                    str = formatValue(ctx, desc.value, recurseTimes - 1);
                }
                if (str.indexOf('\n') > -1) {
                    if (array) {
                        str = str.split('\n').map(function(line) {
                            return '  ' + line;
                        }).join('\n').substr(2);
                    } else {
                        str = '\n' + str.split('\n').map(function(line) {
                            return '   ' + line;
                        }).join('\n');
                    }
                }
            } else {
                str = ctx.stylize('[Circular]', 'special');
            }
        }
        if (isUndefined(name)) {
            if (array && key.match(/^\d+$/)) {
                return str;
            }
            name = JSON.stringify('' + key);
            if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
                name = name.substr(1, name.length - 2);
                name = ctx.stylize(name, 'name');
            } else {
                name = name.replace(/'/g, "\\'").replace(/\\"/g, '"').replace(/(^"|"$)/g, "'");
                name = ctx.stylize(name, 'string');
            }
        }
        return name + ': ' + str;
    }
    function reduceToSingleString(output, base, braces) {
        var numLinesEst = 0;
        var length = output.reduce(function(prev, cur) {
            numLinesEst++;
            if (cur.indexOf('\n') >= 0)
                numLinesEst++;
            return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
        }, 0);
        if (length > 60) {
            return braces[0] + (base === '' ? '' : base + '\n ') + ' ' + output.join(',\n  ') + ' ' + braces[1];
        }
        return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
    }
    function isArray(ar) {
        return Array.isArray(ar);
    }
    util.isArray = isArray;
    function isBoolean(arg) {
        return typeof arg === 'boolean';
    }
    util.isBoolean = isBoolean;
    function isNull(arg) {
        return arg === null;
    }
    util.isNull = isNull;
    function isNullOrUndefined(arg) {
        return arg == null;
    }
    util.isNullOrUndefined = isNullOrUndefined;
    function isNumber(arg) {
        return typeof arg === 'number';
    }
    util.isNumber = isNumber;
    function isString(arg) {
        return typeof arg === 'string';
    }
    util.isString = isString;
    function isSymbol(arg) {
        return typeof arg === 'symbol';
    }
    util.isSymbol = isSymbol;
    function isUndefined(arg) {
        return arg === void 0;
    }
    util.isUndefined = isUndefined;
    function isRegExp(re) {
        return isObject(re) && objectToString(re) === '[object RegExp]';
    }
    util.isRegExp = isRegExp;
    function isObject(arg) {
        return typeof arg === 'object' && arg;
    }
    util.isObject = isObject;
    function isDate(d) {
        return isObject(d) && objectToString(d) === '[object Date]';
    }
    util.isDate = isDate;
    function isError(e) {
        return isObject(e) && objectToString(e) === '[object Error]';
    }
    util.isError = isError;
    function isFunction(arg) {
        return typeof arg === 'function';
    }
    util.isFunction = isFunction;
    function isPrimitive(arg) {
        return arg === null || typeof arg === 'boolean' || typeof arg === 'number' || typeof arg === 'string' || typeof arg === 'symbol' || typeof arg === 'undefined';
    }
    util.isPrimitive = isPrimitive;
    function isBuffer(arg) {
        return arg && typeof arg === 'object' && typeof arg.copy === 'function' && typeof arg.fill === 'function' && typeof arg.binarySlice === 'function';
    }
    util.isBuffer = isBuffer;
    function objectToString(o) {
        return Object.prototype.toString.call(o);
    }
    function pad(n) {
        return n < 10 ? '0' + n.toString(10) : n.toString(10);
    }
    var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
    function timestamp() {
        var d = new Date();
        var time = [pad(d.getHours()), pad(d.getMinutes()), pad(d.getSeconds())].join(':');
        return [d.getDate(), months[d.getMonth()], time].join(' ');
    }
    util.log = function() {
        console.log('%s - %s', timestamp(), util.format.apply(util, arguments));
    };
    util.inherits = function(ctor, superCtor) {
        ctor.super_ = superCtor;
        ctor.prototype = Object.create(superCtor.prototype, {
            constructor: {
                value: ctor,
                enumerable: false,
                writable: true,
                configurable: true
            }
        });
    };
    util._extend = function(origin, add) {
        if (!add || !isObject(add))
            return origin;
        var keys = Object.keys(add);
        var i = keys.length;
        while (i--) {
            origin[keys[i]] = add[keys[i]];
        }
        return origin;
    };
    function hasOwnProperty(obj, prop) {
        return Object.prototype.hasOwnProperty.call(obj, prop);
    }
    require.cache('util', util);
}());
(function() {
    var util = require.cache('util');
    var punycode = require.cache('punycode');
    var url = {};
    url.parse = urlParse;
    url.resolve = urlResolve;
    url.resolveObject = urlResolveObject;
    url.format = urlFormat;
    url.Url = Url;
    function Url() {
        this.protocol = null;
        this.slashes = null;
        this.auth = null;
        this.host = null;
        this.port = null;
        this.hostname = null;
        this.hash = null;
        this.search = null;
        this.query = null;
        this.pathname = null;
        this.path = null;
        this.href = null;
    }
    var protocolPattern = /^([a-z0-9.+-]+:)/i,
        portPattern = /:[0-9]*$/,
        simplePathPattern = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,
        delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t'],
        unwise = ['{', '}', '|', '\\', '^', '`'].concat(delims),
        autoEscape = ['\''].concat(unwise),
        nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape),
        hostEndingChars = ['/', '?', '#'],
        hostnameMaxLen = 255,
        hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,
        hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,
        unsafeProtocol = {
            'javascript': true,
            'javascript:': true
        },
        hostlessProtocol = {
            'javascript': true,
            'javascript:': true
        },
        slashedProtocol = {
            'http': true,
            'https': true,
            'ftp': true,
            'gopher': true,
            'file': true,
            'http:': true,
            'https:': true,
            'ftp:': true,
            'gopher:': true,
            'file:': true
        },
        querystring = require.cache('querystring');
    Url.prototype.toString = function() {
        return this.format();
    };
    Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) {
        if (!util.isString(url)) {
            console.error("Parameter 'url' must be a string, not " + typeof url);
            return;
        }
        var queryIndex = url.indexOf('?'),
            splitter = (queryIndex !== -1 && queryIndex < url.indexOf('#')) ? '?' : '#',
            uSplit = url.split(splitter),
            slashRegex = /\\/g;
        uSplit[0] = uSplit[0].replace(slashRegex, '/');
        url = uSplit.join(splitter);
        var rest = url;
        rest = rest.trim();
        if (!slashesDenoteHost && url.split('#').length === 1) {
            var simplePath = simplePathPattern.exec(rest);
            if (simplePath) {
                this.path = rest;
                this.href = rest;
                this.pathname = simplePath[1];
                if (simplePath[2]) {
                    this.search = simplePath[2];
                    if (parseQueryString) {
                        this.query = querystring.parse(this.search.substr(1));
                    } else {
                        this.query = this.search.substr(1);
                    }
                } else if (parseQueryString) {
                    this.search = '';
                    this.query = {};
                }
                return this;
            }
        }
        var proto = protocolPattern.exec(rest);
        if (proto) {
            proto = proto[0];
            var lowerProto = proto.toLowerCase();
            this.protocol = lowerProto;
            rest = rest.substr(proto.length);
        }
        if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) {
            var slashes = rest.substr(0, 2) === '//';
            if (slashes && !(proto && hostlessProtocol[proto])) {
                rest = rest.substr(2);
                this.slashes = true;
            }
        }
        if (!hostlessProtocol[proto] && (slashes || (proto && !slashedProtocol[proto]))) {
            var hostEnd = -1;
            for (var i = 0; i < hostEndingChars.length; i++) {
                var hec = rest.indexOf(hostEndingChars[i]);
                if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))
                    hostEnd = hec;
            }
            var auth, atSign;
            if (hostEnd === -1) {
                atSign = rest.lastIndexOf('@');
            } else {
                atSign = rest.lastIndexOf('@', hostEnd);
            }
            if (atSign !== -1) {
                auth = rest.slice(0, atSign);
                rest = rest.slice(atSign + 1);
                this.auth = decodeURIComponent(auth);
            }
            hostEnd = -1;
            for (var i = 0; i < nonHostChars.length; i++) {
                var hec = rest.indexOf(nonHostChars[i]);
                if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))
                    hostEnd = hec;
            }
            if (hostEnd === -1)
                hostEnd = rest.length;
            this.host = rest.slice(0, hostEnd);
            rest = rest.slice(hostEnd);
            this.parseHost();
            this.hostname = this.hostname || '';
            var ipv6Hostname = this.hostname[0] === '[' && this.hostname[this.hostname.length - 1] === ']';
            if (!ipv6Hostname) {
                var hostparts = this.hostname.split(/\./);
                for (var i = 0, l = hostparts.length; i < l; i++) {
                    var part = hostparts[i];
                    if (!part)
                        continue;
                    if (!part.match(hostnamePartPattern)) {
                        var newpart = '';
                        for (var j = 0, k = part.length; j < k; j++) {
                            if (part.charCodeAt(j) > 127) {
                                newpart += 'x';
                            } else {
                                newpart += part[j];
                            }
                        }
                        if (!newpart.match(hostnamePartPattern)) {
                            var validParts = hostparts.slice(0, i);
                            var notHost = hostparts.slice(i + 1);
                            var bit = part.match(hostnamePartStart);
                            if (bit) {
                                validParts.push(bit[1]);
                                notHost.unshift(bit[2]);
                            }
                            if (notHost.length) {
                                rest = '/' + notHost.join('.') + rest;
                            }
                            this.hostname = validParts.join('.');
                            break;
                        }
                    }
                }
            }
            if (this.hostname.length > hostnameMaxLen) {
                this.hostname = '';
            } else {
                this.hostname = this.hostname.toLowerCase();
            }
            if (!ipv6Hostname) {
                this.hostname = punycode.toASCII(this.hostname);
            }
            var p = this.port ? ':' + this.port : '';
            var h = this.hostname || '';
            this.host = h + p;
            this.href += this.host;
            if (ipv6Hostname) {
                this.hostname = this.hostname.substr(1, this.hostname.length - 2);
                if (rest[0] !== '/') {
                    rest = '/' + rest;
                }
            }
        }
        if (!unsafeProtocol[lowerProto]) {
            for (var i = 0, l = autoEscape.length; i < l; i++) {
                var ae = autoEscape[i];
                if (rest.indexOf(ae) === -1)
                    continue;
                var esc = encodeURIComponent(ae);
                if (esc === ae) {
                    esc = escape(ae);
                }
                rest = rest.split(ae).join(esc);
            }
        }
        var hash = rest.indexOf('#');
        if (hash !== -1) {
            this.hash = rest.substr(hash);
            rest = rest.slice(0, hash);
        }
        var qm = rest.indexOf('?');
        if (qm !== -1) {
            this.search = rest.substr(qm);
            this.query = rest.substr(qm + 1);
            if (parseQueryString) {
                this.query = querystring.parse(this.query);
            }
            rest = rest.slice(0, qm);
        } else if (parseQueryString) {
            this.search = '';
            this.query = {};
        }
        if (rest)
            this.pathname = rest;
        if (slashedProtocol[lowerProto] && this.hostname && !this.pathname) {
            this.pathname = '/';
        }
        if (this.pathname || this.search) {
            var p = this.pathname || '';
            var s = this.search || '';
            this.path = p + s;
        }
        this.href = this.format();
        return this;
    };
    function urlParse(url, parseQueryString, slashesDenoteHost) {
        if (url && util.isObject(url) && url instanceof Url)
            return url;
        try {
            var u = new Url();
            if ('function' === typeof u.parse)
                u.parse(url, parseQueryString, slashesDenoteHost);
        } catch (err) {
            var u = new Url();
            console.notice(err);
        }
        return u;
    }
    function urlFormat(obj) {
        if (util.isString(obj))
            obj = urlParse(obj);
        if (!(obj instanceof Url))
            return Url.prototype.format.call(obj);
        return obj.format();
    }
    Url.prototype.format = function() {
        var auth = this.auth || '';
        if (auth) {
            auth = encodeURIComponent(auth);
            auth = auth.replace(/%3A/i, ':');
            auth += '@';
        }
        var protocol = this.protocol || '',
            pathname = this.pathname || '',
            hash = this.hash || '',
            host = false,
            query = '';
        if (this.host) {
            host = auth + this.host;
        } else if (this.hostname) {
            host = auth + (this.hostname.indexOf(':') === -1 ? this.hostname : '[' + this.hostname + ']');
            if (this.port) {
                host += ':' + this.port;
            }
        }
        if (this.query && util.isObject(this.query) && Object.keys(this.query).length) {
            query = querystring.stringify(this.query);
        }
        var search = this.search || (query && ('?' + query)) || '';
        if (protocol && protocol.substr(-1) !== ':')
            protocol += ':';
        if (this.slashes || (!protocol || slashedProtocol[protocol]) && host !== false) {
            host = '//' + (host || '');
            if (pathname && pathname.charAt(0) !== '/')
                pathname = '/' + pathname;
        } else if (!host) {
            host = '';
        }
        if (hash && hash.charAt(0) !== '#')
            hash = '#' + hash;
        if (search && search.charAt(0) !== '?')
            search = '?' + search;
        pathname = pathname.replace(/[?#]/g, function(match) {
            return encodeURIComponent(match);
        });
        search = search.replace('#', '%23');
        return protocol + host + pathname + search + hash;
    };
    function urlResolve(source, relative) {
        return urlParse(source, false, true).resolve(relative);
    }
    Url.prototype.resolve = function(relative) {
        return this.resolveObject(urlParse(relative, false, true)).format();
    };
    function urlResolveObject(source, relative) {
        if (!source)
            return relative;
        return urlParse(source, false, true).resolveObject(relative);
    }
    Url.prototype.resolveObject = function(relative) {
        if (util.isString(relative)) {
            var rel = new Url();
            rel.parse(relative, false, true);
            relative = rel;
        }
        var result = new Url();
        var tkeys = Object.keys(this);
        for (var tk = 0; tk < tkeys.length; tk++) {
            var tkey = tkeys[tk];
            result[tkey] = this[tkey];
        }
        result.hash = relative.hash;
        if (relative.href === '') {
            result.href = result.format();
            return result;
        }
        if (relative.slashes && !relative.protocol) {
            var rkeys = Object.keys(relative);
            for (var rk = 0; rk < rkeys.length; rk++) {
                var rkey = rkeys[rk];
                if (rkey !== 'protocol')
                    result[rkey] = relative[rkey];
            }
            if (slashedProtocol[result.protocol] && result.hostname && !result.pathname) {
                result.path = result.pathname = '/';
            }
            result.href = result.format();
            return result;
        }
        if (relative.protocol && relative.protocol !== result.protocol) {
            if (!slashedProtocol[relative.protocol]) {
                var keys = Object.keys(relative);
                for (var v = 0; v < keys.length; v++) {
                    var k = keys[v];
                    result[k] = relative[k];
                }
                result.href = result.format();
                return result;
            }
            result.protocol = relative.protocol;
            if (!relative.host && !hostlessProtocol[relative.protocol]) {
                var relPath = (relative.pathname || '').split('/');
                while (relPath.length && !(relative.host = relPath.shift()));
                if (!relative.host)
                    relative.host = '';
                if (!relative.hostname)
                    relative.hostname = '';
                if (relPath[0] !== '')
                    relPath.unshift('');
                if (relPath.length < 2)
                    relPath.unshift('');
                result.pathname = relPath.join('/');
            } else {
                result.pathname = relative.pathname;
            }
            result.search = relative.search;
            result.query = relative.query;
            result.host = relative.host || '';
            result.auth = relative.auth;
            result.hostname = relative.hostname || relative.host;
            result.port = relative.port;
            if (result.pathname || result.search) {
                var p = result.pathname || '';
                var s = result.search || '';
                result.path = p + s;
            }
            result.slashes = result.slashes || relative.slashes;
            result.href = result.format();
            return result;
        }
        var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'),
            isRelAbs = (relative.host || relative.pathname && relative.pathname.charAt(0) === '/'),
            mustEndAbs = (isRelAbs || isSourceAbs || (result.host && relative.pathname)),
            removeAllDots = mustEndAbs,
            srcPath = result.pathname && result.pathname.split('/') || [],
            relPath = relative.pathname && relative.pathname.split('/') || [],
            psychotic = result.protocol && !slashedProtocol[result.protocol];
        if (psychotic) {
            result.hostname = '';
            result.port = null;
            if (result.host) {
                if (srcPath[0] === '')
                    srcPath[0] = result.host;
                else
                    srcPath.unshift(result.host);
            }
            result.host = '';
            if (relative.protocol) {
                relative.hostname = null;
                relative.port = null;
                if (relative.host) {
                    if (relPath[0] === '')
                        relPath[0] = relative.host;
                    else
                        relPath.unshift(relative.host);
                }
                relative.host = null;
            }
            mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');
        }
        if (isRelAbs) {
            result.host = (relative.host || relative.host === '') ? relative.host : result.host;
            result.hostname = (relative.hostname || relative.hostname === '') ? relative.hostname : result.hostname;
            result.search = relative.search;
            result.query = relative.query;
            srcPath = relPath;
        } else if (relPath.length) {
            if (!srcPath)
                srcPath = [];
            srcPath.pop();
            srcPath = srcPath.concat(relPath);
            result.search = relative.search;
            result.query = relative.query;
        } else if (!util.isNullOrUndefined(relative.search)) {
            if (psychotic) {
                result.hostname = result.host = srcPath.shift();
                var authInHost = result.host && result.host.indexOf('@') > 0 ? result.host.split('@') : false;
                if (authInHost) {
                    result.auth = authInHost.shift();
                    result.host = result.hostname = authInHost.shift();
                }
            }
            result.search = relative.search;
            result.query = relative.query;
            if (!util.isNull(result.pathname) || !util.isNull(result.search)) {
                result.path = (result.pathname ? result.pathname : '') + (result.search ? result.search : '');
            }
            result.href = result.format();
            return result;
        }
        if (!srcPath.length) {
            result.pathname = null;
            if (result.search) {
                result.path = '/' + result.search;
            } else {
                result.path = null;
            }
            result.href = result.format();
            return result;
        }
        var last = srcPath.slice(-1)[0];
        var hasTrailingSlash = ((result.host || relative.host || srcPath.length > 1) && (last === '.' || last === '..') || last === '');
        var up = 0;
        for (var i = srcPath.length; i >= 0; i--) {
            last = srcPath[i];
            if (last === '.') {
                srcPath.splice(i, 1);
            } else if (last === '..') {
                srcPath.splice(i, 1);
                up++;
            } else if (up) {
                srcPath.splice(i, 1);
                up--;
            }
        }
        if (!mustEndAbs && !removeAllDots) {
            for (; up--; up) {
                srcPath.unshift('..');
            }
        }
        if (mustEndAbs && srcPath[0] !== '' && (!srcPath[0] || srcPath[0].charAt(0) !== '/')) {
            srcPath.unshift('');
        }
        if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) {
            srcPath.push('');
        }
        var isAbsolute = srcPath[0] === '' || (srcPath[0] && srcPath[0].charAt(0) === '/');
        if (psychotic) {
            result.hostname = result.host = isAbsolute ? '' : srcPath.length ? srcPath.shift() : '';
            var authInHost = result.host && result.host.indexOf('@') > 0 ? result.host.split('@') : false;
            if (authInHost) {
                result.auth = authInHost.shift();
                result.host = result.hostname = authInHost.shift();
            }
        }
        mustEndAbs = mustEndAbs || (result.host && srcPath.length);
        if (mustEndAbs && !isAbsolute) {
            srcPath.unshift('');
        }
        if (!srcPath.length) {
            result.pathname = null;
            result.path = null;
        } else {
            result.pathname = srcPath.join('/');
        }
        if (!util.isNull(result.pathname) || !util.isNull(result.search)) {
            result.path = (result.pathname ? result.pathname : '') + (result.search ? result.search : '');
        }
        result.auth = relative.auth || result.auth;
        result.slashes = result.slashes || relative.slashes;
        result.href = result.format();
        return result;
    };
    Url.prototype.parseHost = function() {
        var host = this.host;
        var port = portPattern.exec(host);
        if (port) {
            port = port[0];
            if (port !== ':') {
                this.port = port.substr(1);
            }
            host = host.substr(0, host.length - port.length);
        }
        if (host)
            this.hostname = host;
    };
    require.cache('url', url);
}());
 	
if(!frdl.Device().Modernizr.localstorage){
        var _localStorage = {};
      let localStorage = frdl.globalScope.localStorage = global.localStorage = window.localStorage = self.localStorage = {
        	
            setItem     : function(id, val) { 
               return  _localStorage[id] = String(val);
            },
            getItem     : function(id) { 
               return  _localStorage.hasOwnProperty(id) ?  _localStorage[id] : null;
             },
            removeItem  : function(id) {
            	 return delete  _localStorage[id];
             },
            clear       : function() { 
               return  _localStorage = {}; 
            }
        };
}
if(!frdl.Device().Modernizr.sessionstorage){
      var  _sessionStorage = {};
      let sessionStorage = frdl.globalScope.sessionStorage = global.sessionStorage = window.sessionStorage = self.sessionStorage = {
        	
            setItem     : function(id, val) { 
               return  _sessionStorage[id] = String(val);
            },
            getItem     : function(id) { 
               return  _sessionStorage.hasOwnProperty(id) ?  _sessionStorage[id] : null;
             },
            removeItem  : function(id) {
            	 return delete  _sessionStorage[id];
             },
            clear       : function() { 
               return  _sessionStorage = {}; 
            }
        };
}
/*! https://github.com/hoangnd25/cacheJS */
/*global localStorage: false */
(function(root, undefined) {
  "use strict";
var ProviderManager = function() {
    var DEFAULT = 'localStorage';
    return {
        init: function(cache) {
            this.localStorageProvider = new LocalStorageProvider(cache);
            this.arrayProvider = new ArrayProvider(cache);
        },
        use: function(provider) {
            DEFAULT = provider;
        },
        getProvider: function (name) {
            var providerName = name || DEFAULT;
            switch (providerName) {
                case 'localStorage':
                    return this.localStorageProvider;
                case 'array':
                    return this.arrayProvider;
            }
        }
    };
};
/**
 * @namespace
 */
var Cache = function () {
    /**
     * Default values
     */
    var DEFAULT = {
        prefix: '_cache',
        ttl: 604800
    };
    var eventSubscribers  = {
        cacheAdded: [],
        cacheRemoved: []
    };
    /**
     * Group all functions that are shared across all providers
     */
    var _this = {
        /**
         * Accept keys as array e.g: {blogId:"2",action:"view"} and convert it to unique string
         */
        generateKey: function (object) {
            var generatedKey = DEFAULT.prefix + '_',
                keyArray = [];
            for (var key in object){
                if(object.hasOwnProperty(key))
                {
                    keyArray.push(key);
                }
            }
            keyArray.sort();
            for(var i=0; i<keyArray.length; i++){
                generatedKey += keyArray[i] + '_' + object[keyArray[i]];
                if(i !== (keyArray.length - 1)){
                    generatedKey += '__';
                }
            }
            return generatedKey;
        },
        generateContextKey: function(key,value){
            return DEFAULT.prefix + '_context_' + key + '_' + value;
        },
        /**
         * Get current time (compared to Epoch time) in seconds
         */
        getCurrentTime: function(){
            var timestamp = new Date().getTime();
            return Math.floor(timestamp/1000);
        },
        /**
         * Return default values
         */
        getDefault: function(){
            return DEFAULT;
        },
        /**
         * Return subscribers
         *
         * @returns {{cacheAdded: Array, cacheRemoved: Array}}
         */
        getEventSubscribers: function(){
            return eventSubscribers;
        },
        /**
         * Dispatch event to subscribers
         *
         * @param event Event name
         * @param object Object will be sent to subscriber
         */
        dispatchEvent: function(event, object){
            var callbacks = eventSubscribers[event];
            if(callbacks.length < 1){
                return;
            }
            for(var index = 0; index < callbacks.length; index++){
                if(typeof(callbacks[index]) !== 'undefined' && _this.isFunction(callbacks[index])){
                    callbacks[index](object);
                }
            }
        },
        /**
         * Check if x is a function
         *
         * @param x
         * @returns {boolean}
         */
        isFunction: function(x){
            return Object.prototype.toString.call(x) == '[object Function]';
        }
    };
    var providerManager = new ProviderManager();
    providerManager.init(_this);
    /**
     * Public functions
     */
    return {
    	
    	//indexedDB style...? https://github.com/jakearchibald/idb
    	// https://github.com/jakearchibald/idb/blob/master/lib/idb.js
    	// open : function //
    	open: function(name, version, upgradeCallback) {
         //       throw '@@ToDO open : return idb/Storage the direct "native" Cache api';
          return providerManager.open(name, version, upgradeCallback);
       },
        
        install: function(provider) {
           	 return (function (provider) {	
        	  let cacheJS = new Cache();
        	  cacheJS.use(provider);
        	  return cacheJS;
			}(provider));
        },
        /**
         * @method Cache.use
         * @description Switch provider. available providers are: 'localStorage','array'
         *
         * @param provider
         */
        use: function(provider) {
            providerManager.use(provider);
            return this;
        },
        /**
         * @method Cache.get
         * @description Get cache by array key
         *
         * @param key - Array key
         * @returns {string}
         * @example
         * Cache.get({blogId:"2",action:"view"});
         */
        get: function(key){
            return providerManager.getProvider().get(key);
        },
        /**
         * @method Cache.set
         * @description Save data for key
         *
         * @param key - Array key
         * @param value - value must be a string
         * @param ttl - Time to live in seconds
         * @param contexts - Contexts
         * @returns {Cache}
         */
        set: function(key, value, ttl, contexts){
            try{
                providerManager.getProvider().set(key, value, ttl, contexts);
            }catch (exception){
                return null;
            }
            return this;
        },
        /**
         * @method Cache.setPrefix
         * @description Set prefix for cache key (default: _cache)
         *
         * @param prefix
         * @returns {Cache}
         */
        setPrefix: function(prefix){
            DEFAULT.prefix = prefix;
            return this;
        },
        /**
         * @method Cache.getPrefix
         * @description Get prefix for cache key
         *
         * @returns {string}
         */
        getPrefix: function(){
            return DEFAULT.prefix;
        },
        /**
         * @method Cache.removeByKey
         *
         * @param key
         * @returns {Cache}
         */
        removeByKey: function(key){
            providerManager.getProvider().removeByKey(key);
            return this;
        },
        /**
         * @method Cache.removeByContext
         *
         * @param context
         * @returns {Cache}
         */
        removeByContext: function(context){
            providerManager.getProvider().removeByContext(context);
            return this;
        },
        /**
         * @method Cache.on
         * @description Subscribe to an event
         *
         * @param event
         * @param callback
         */
        on: function(event, callback){
            eventSubscribers[event].push(callback);
        },
        /**
         * @method Cache.unsubscribe
         * @description Unsubscribe to an event
         *
         * @param event
         * @param callback
         */
        unsubscribe: function(event, callback){
            var callbacks = eventSubscribers[event];
            for(var i = 0; i < callbacks.length; i++){
                if(callbacks[i] === callback){
                    delete callbacks[i];
                    break;
                }
            }
        }
    };
};
var LocalStorageProvider = function (cacheJS) {
    return{
        get: function(key){
            var generatedKey = cacheJS.generateKey(key);
            var object = localStorage.getItem(generatedKey);
            if(object !== null){
                object = JSON.parse(object);
                // Check if the cache is expired
                if((cacheJS.getCurrentTime() - object.createdAt) >= object.ttl){
                    localStorage.removeItem(generatedKey);
                    return null;
                }
                return object.data;
            }
            return null;
        },
        set: function(key, value, ttl, contexts){
            ttl = ttl || cacheJS.getDefault().ttl;
            var cacheKey = cacheJS.generateKey(key);
            localStorage.setItem(cacheKey,
                JSON.stringify({
                    data: value,
                    ttl: ttl,
                    createdAt: cacheJS.getCurrentTime()
                })
            );
            for(var context in contexts){
                if(!contexts.hasOwnProperty(context)){
                    continue;
                }
                // Generate context key
                var contextKey = cacheJS.generateContextKey(context,contexts[context]);
                var storedContext = localStorage.getItem(contextKey);
                if(storedContext !== null){
                    storedContext = JSON.parse(storedContext);
                    var alreadyExist = false;
                    // Check if cache id already exist in saved context
                    // Use native function if the browser is supported
                    if(Array.prototype.indexOf){
                        alreadyExist = (storedContext.indexOf(cacheKey) >= 0);
                    }else{
                        for(var i = 0; i < storedContext.length; i++){
                            if(storedContext[i] == cacheKey){
                                alreadyExist = true;
                                break;
                            }
                        }
                    }
                    if(!alreadyExist){
                        storedContext.push(cacheKey);
                    }
                }else{
                    storedContext = [cacheKey];
                }
                localStorage.setItem(contextKey,JSON.stringify(storedContext));
            }
            cacheJS.dispatchEvent('cacheAdded',
                {
                    key: key,
                    value: value,
                    ttl: ttl,
                    contexts: contexts || null
                }
            );
        },
        removeByKey: function(key){
            var generatedKey = cacheJS.generateKey(key);
            var cache = localStorage.getItem(generatedKey);
            if(cache !== null){
                cache = JSON.parse(cache);
                localStorage.removeItem(generatedKey);
                cacheJS.dispatchEvent('cacheRemoved',
                    {
                        generatedKey: generatedKey,
                        value: cache.data,
                        ttl: cache.ttl
                    }
                );
            }
        },
        removeByContext: function(context){
            for(var key in context){
                if(context.hasOwnProperty(key)){
                    var contextKey = cacheJS.generateContextKey(key, context[key]);
                    var storedContext = localStorage.getItem(contextKey);
                    if(storedContext === null){
                        return;
                    }
                    var cacheIds = JSON.parse(storedContext);
                    for(var i = 0; i < cacheIds.length; i++){
                        var cache = JSON.parse(localStorage.getItem(cacheIds[i]));
                        localStorage.removeItem(cacheIds[i]);
                        cacheJS.dispatchEvent('cacheRemoved',
                            {
                                generatedKey: cacheIds[i],
                                value: cache.data,
                                ttl: cache.ttl
                            }
                        );
                    }
                    localStorage.removeItem(contextKey);
                }
            }
        }
    };
};
var ArrayProvider = function(cacheJS){
    var cacheArray = {},
        cacheContexts = {};
    return{
        get: function(key){
            var generatedKey = cacheJS.generateKey(key);
            if(cacheArray.hasOwnProperty(generatedKey)){
                var object = cacheArray[generatedKey];
                // Check if the cache is expired
                if((cacheJS.getCurrentTime() - object.createdAt) >= object.ttl){
                    delete cacheArray[generatedKey];
                    return null;
                }
                return object.data;
            }else{
                return null;
            }
        },
        set: function(key, value, ttl, contexts){
            var generatedKey = cacheJS.generateKey(key);
            ttl = ttl === null || typeof(ttl) === 'undefined' ? cacheJS.getDefault().ttl : ttl;
            cacheArray[generatedKey] = {
                data: value,
                ttl: ttl,
                createdAt: cacheJS.getCurrentTime()
            };
            for(var context in contexts){
                if(!contexts.hasOwnProperty(context)){
                    continue;
                }
                // Generate context key
                var contextKey = cacheJS.generateContextKey(context,contexts[context]);
                var storedContext = cacheContexts.hasOwnProperty(contextKey) ? cacheContexts[contextKey] : null;
                if(storedContext !== null){
                    var alreadyExist = false;
                    // Check if cache id already exist in saved context
                    // Use native function if the browser is supported
                    if(Array.prototype.indexOf){
                        alreadyExist = (storedContext.indexOf(generatedKey) >= 0);
                    }else{
                        for(var i = 0; i < storedContext.length; i++){
                            if(storedContext[i] == generatedKey){
                                alreadyExist = true;
                                break;
                            }
                        }
                    }
                    if(!alreadyExist){
                        storedContext.push(generatedKey);
                    }
                }else{
                    storedContext = [generatedKey];
                }
                cacheContexts[contextKey] = storedContext;
            }
            cacheJS.dispatchEvent('cacheAdded',
                {
                    key: key,
                    value: value,
                    ttl: ttl,
                    contexts: contexts || null
                }
            );
        },
        removeByKey: function(key){
            var generatedKey = cacheJS.generateKey(key);
            if(cacheArray.hasOwnProperty(generatedKey)){
                var cache = cacheArray[generatedKey];
                delete cacheArray[generatedKey];
                cacheJS.dispatchEvent('cacheRemoved',
                    {
                        generatedKey: generatedKey,
                        value: cache.data,
                        ttl: cache.ttl
                    }
                );
            }
        },
        removeByContext: function(context){
            for(var key in context){
                if(context.hasOwnProperty(key)){
                    var contextKey = cacheJS.generateContextKey(key, context[key]);
                    var storedContext = cacheContexts.hasOwnProperty(contextKey) ? cacheContexts[contextKey] : null;
                    if(storedContext === null){
                        return;
                    }
                    for(var i = 0; i < storedContext.length; i++){
                        var cache = cacheArray[storedContext[i]];
                        delete cacheArray[storedContext[i]];
                        cacheJS.dispatchEvent('cacheRemoved',
                            {
                                generatedKey: storedContext[i],
                                value: cache.data,
                                ttl: cache.ttl
                            }
                        );
                    }
                    delete cacheContexts[contextKey];
                }
            }
        }
    };
};
// Version.
Cache.VERSION = '1.1.2.3-webfan-edited';
// Export to the root, which is probably `window`.
//root.cacheJS = new Cache();
// let cacheJS = new Cache();
 
                            Object.defineProperty(navigator, 'frdl', {
                                'get': function() {
                                   return frdl;
                                }
                            });
                            Object.defineProperty(navigator.frdl, 'Cache', {
                                'get': function() {
                                    return Cache;
                                }
                            });
/*! https://github.com/jakearchibald/idb*/
                            Object.defineProperty(navigator.frdl, 'idb', {
                                'get': function() {
                                    return require('idb/lib/idb');
                                }
                            });
                            
                            
}(global));
            (function() {
                /*! https://davidwalsh.name/convert-image-data-uri-javascript */
                
                'use strict';
                
                function getImageDataUri(_URL) {
    		        var url = _URL;
                    					
                    return new Promise(function(resolve, reject) {
                    	
                    var fs = require('fs'),
                        _resolved = false,
                        result = false;
                   
                    function _load(){
                    	
                    	    alert(url);
                    	
                    	    var image = new Image();
						    var ext = frdl.fs5.polyfill.getFiler().Util.getFileExtension(url);
                            if ('.' === ext.substr(0, 1)) {
                                ext = ext.substr(1, ext.length);
                            }
                            image.crossOrigin = 'anonymous';
                            image.onload = function() {
                                var canvas = document.createElement('canvas');
                                canvas.width = this.naturalWidth;
                                canvas.height = this.naturalHeight;
                                canvas.getContext('2d').drawImage(this, 0, 0);
                                var dataUri = canvas.toDataURL('image/' + ext);
                                result = {
                                    t: new Date().getTime(),
                                    uri: dataUri
                                };
                                if(false===_resolved){
                                	resolve(result);
                                    _resolved = true;
								}
                                process.cwd(frdl.DIRS.AppPath);
                                fs.mkdir(dirnameCache('data-uri/images'), '0755', function(err, dirEntry) {
                                    if (err) {
                                        console.warn(err);
                                        //return;
                                    }
                                    process.cwd(frdl.DIRS.AppPath);
                                    fs.writeFile(dirnameCache('data-uri/images') + fName(url), JSON.stringify(result), function(err, data) {
                                        if (err) {
                                            console.error(err);
                                            return;
                                        }
                                    });
                                });
                            };
                            image.onerror = function() {
                                reject('Cannot get dataUri from ' + url);
                            };
                            image.src = url;
                            
                           
					}
					                    	
                    	
                    	process.cwd(frdl.DIRS.AppPath);
                        fs.readFile(dirnameCache('data-uri/images') + fName(url), function(err, r) {
                            if (err) {
                                 _load();	
                                 return;
							}
							
							result = JSON.parse(r);
                            if ('undefined' !== typeof result && 'undefined' !== typeof result.t) {
                                resolve(result);
                                _resolved = true;
                                if ((parseInt(result.t) > new Date().getTime() - (180 * 24 * 60 * 60 * 1000)) || !navigator.onLine)
                                    return;
                            }
                          
							  _load();	
                        });
			
                           
                    });
                }
                frdl.getImageDataUri = getImageDataUri;
         }());
(function(){
/* Source: src/types.js */
frdl.ns.plugin('org.startpad.types', function (Plugin, Use) {
Plugin.extend({
    'VERSION': '0.2.2',
    'isArguments': function (value) { return isType(value, 'arguments'); },
    'isArray': function (value) { return isType(value, 'array'); },
    'copyArray': copyArray,
    'isType': isType,
    'typeOf': typeOf,
    'extend': extend,
    'project': project,
    'getFunctionName': getFunctionName,
    'keys': Object.keys || keys,
    'patch': patch
});
function patch() {
    Object.keys = Object.keys || keys;  // JavaScript 1.8.5
    return Plugin;
}
// Can be used to copy Arrays and Arguments into an Array
function copyArray(arg) {
    return Array.prototype.slice.call(arg);
}
var baseTypes = ['number', 'string', 'boolean', 'array', 'function', 'date',
                 'regexp', 'arguments', 'undefined', 'null'];
function internalType(value) {
    return Object.prototype.toString.call(value).match(/\[object (.*)\]/)[1].toLowerCase();
}
function isType(value, type) {
    return typeOf(value) === type;
}
// Return one of the baseTypes as a string
function typeOf(value) {
    if (value === undefined) {
        return 'undefined';
    }
    if (value === null) {
        return 'null';
    }
    var type = internalType(value);
    if (baseTypes.indexOf(type) == -1) {
        type = typeof value;
    }
    return type;
}
// IE 8 has bug that does not enumerates even own properties that have
// these internal names.
var enumBug = !{toString: true}.propertyIsEnumerable('toString');
var internalNames = ['toString', 'toLocaleString', 'valueOf',
                     'constructor', 'isPrototypeOf'];
// Copy the (own) properties of all the arguments into the first one (in order).
function extend(dest) {
    var i, j;
    var source;
    var prop;
    if (dest === undefined) {
        dest = {};
    }
    for (i = 1; i < arguments.length; i++) {
        source = arguments[i];
        for (prop in source) {
            if (source.hasOwnProperty(prop)) {
                dest[prop] = source[prop];
            }
        }
        if (!enumBug) {
            continue;
        }
        for (j = 0; j < internalNames.length; j++) {
            prop = internalNames[j];
            if (source.hasOwnProperty(prop)) {
                dest[prop] = source[prop];
            }
        }
    }
    return dest;
}
// Return new object with just the listed properties "projected"
// into the new object.  Ignore undefined properties.
function project(obj, props) {
    var result = {};
    if (typeof props == 'string') {
        props = [props];
    }
    for (var i = 0; i < props.length; i++) {
        var name = props[i];
        if (obj && obj.hasOwnProperty(name)) {
            result[name] = obj[name];
        }
    }
    return result;
}
function getFunctionName(fn) {
    if (typeof fn != 'function') {
        return undefined;
    }
    var result = fn.toString().match(/function\s*(\S+)\s*\(/);
    if (!result) {
        return '';
    }
    return result[1];
}
function keys(obj) {
    var list = [];
    for (var prop in obj) {
        if (obj.hasOwnProperty(prop)) {
            list.push(prop);
        }
    }
    return list;
}
});
/* Source: src/funcs.js */
frdl.ns.plugin('org.startpad.funcs', function (Plugin, Use) {
var types = Use('org.startpad.types');
Plugin.extend({
    'VERSION': '0.3.1',
    'methods': methods,
    'bind': bind,
    'decorate': decorate,
    'create': Object.create || create,
    'subclass': subclass,
    'mro': mro,
    'numericVersion': numericVersion,
    'monkeyPatch': monkeyPatch,
    'patch': patch
});
// Convert 3-part version number to comparable integer.
// Note: No part should be > 99.
function numericVersion(s) {
    if (!s) {
        return 0;
    }
    var a = s.split('.');
    return 10000 * parseInt(a[0]) + 100 * parseInt(a[1]) + parseInt(a[2]);
}
// Monkey patch additional methods to constructor prototype, but only
// if patch version is newer than current patch version.
function monkeyPatch(ctor, by, version, patchMethods) {
    if (ctor._patches) {
        var patchVersion = ctor._patches[by];
        if (numericVersion(patchVersion) >= numericVersion(version)) {
            return;
        }
    }
    ctor._patches = ctor._patches || {};
    ctor._patches[by] = version;
    methods(ctor, patchMethods);
}
function patch() {
    if (!Object.create) {
        Object.create = create;
    }
    monkeyPatch(Function, 'org.startpad.funcs', Plugin.VERSION, {
        'methods': function (obj) { methods(this, obj); },
        'curry': function () {
            var args = [this, undefined].concat(types.copyArray(arguments));
            return bind.apply(undefined, args);
        },
        'curryThis': function (self) {
            var args = types.copyArray(arguments);
            args.unshift(this);
            return bind.apply(undefined, args);
        },
        'decorate': function (decorator) {
            return decorate(this, decorator);
        },
        'subclass': function(parent, extraMethods) {
            subclass(this, parent, extraMethods);
        },
        'mro': function(ctors, extraMethods) {
            ctors.unshift(this);
            mro(ctors, extraMethods);
        }
    });
    return Plugin;
}
// Copy methods to a Constructor Function's prototype
function methods(ctor, obj) {
    types.extend(ctor.prototype, obj);
}
// Bind 'this' and/or arguments and return new function.
// Differs from native bind (if present) in that undefined
// parameters are merged.
function bind(fn, self) {
    var presets;
    // Handle the monkey-patched and in-line forms of curry
    if (arguments.length == 3 && types.isArguments(arguments[2])) {
        presets = Array.prototype.slice.call(arguments[2], self1);
    } else {
        presets = Array.prototype.slice.call(arguments, 2);
    }
    function merge(a1, a2) {
        var merged = types.copyArray(a1);
        a2 = types.copyArray(a2);
        for (var i = 0; i < merged.length; i++) {
            if (merged[i] === undefined) {
                merged[i] = a2.shift();
            }
        }
        return merged.concat(a2);
    }
    return function curried() {
        return fn.apply(self || this, merge(presets, arguments));
    };
}
// Wrap the fn function with a generic decorator like:
//
// function decorator(fn, arguments, wrapper) {
//   if (fn == undefined) { ... init ...; return;}
//   ...
//   result = fn.apply(this, arguments);
//   ...
//   return result;
// }
//
// The decorated function is created for each call
// of the decorate function.  In addition to wrapping
// the decorated function, it can be used to save state
// information between calls by adding properties to it.
function decorate(fn, decorator) {
    function decorated() {
        return decorator.call(this, fn, arguments, decorated);
    }
    // Init call - pass undefined fn - but available in this
    // if needed.
    decorator.call(fn, undefined, arguments, decorated);
    return decorated;
}
// Create an empty object whose __proto__ points to the given object.
// It's properties will "shadow" those of the given object until modified.
function create(obj) {
    function Create() {}
    Create.prototype = obj;
    return new Create();
}
// Classical JavaScript single-inheritance pattern.
// Call super constructor via this._super(args);
// Call super methods via this._proto.method.call(this, args)
function subclass(ctor, parent, extraMethods) {
    ctor.prototype = Plugin.create(parent.prototype);
    ctor.prototype.constructor = ctor;
    methods(ctor, extraMethods);
    return ctor;
}
// Define method resolution order for multiple inheritance.
// Builds a custom prototype chain, where each constructor's
// prototype appears exactly once.
function mro(ctors, extraMethods) {
    var parent = ctors.pop().prototype;
    var ctor;
    while (ctors.length > 0) {
        ctor = ctors.pop();
        var ctorName = types.getFunctionName(ctor);
        var proto = Plugin.create(parent);
        types.extend(proto, ctor.prototype);
        proto.constructor = ctor;
        proto[ctorName + '_super'] = parent;
        parent = proto;
    }
    ctor.prototype = parent;
    methods(ctor, extraMethods);
}
});
/* Source: src/string.js */
frdl.ns.plugin('org.startpad.string', function (Plugin, Use) {
var funcs = Use('org.startpad.funcs');
Plugin.extend({
    'VERSION': '0.3.0',
    'patch': patch,
    'format': format,
    'strip': strip
});
function patch() {
    funcs.monkeyPatch(String, 'org.startpad.string', Plugin.VERSION, {
        'format': function formatFunction () {
            if (arguments.length == 1 && typeof arguments[0] == 'object') {
                return format(this, arguments[0]);
            } else {
                return format(this, arguments);
            }
        }
    });
    return Plugin;
}
var reFormat = /\{\s*([^} ]+)\s*\}/g;
// Format a string using values from a dictionary or array.
// {n} - positional arg (0 based)
// {key} - object property (first match)
// .. same as {0.key}
// {key1.key2.key3} - nested properties of an object
// keys can be numbers (0-based index into an array) or
// property names.
function format(st, args, re) {
    re = re || reFormat;
    if (st == undefined) {
        return "undefined";
    }
    st = st.toString();
    st = st.replace(re, function(whole, key) {
        var value = args;
        var keys = key.split('.');
        for (var i = 0; i < keys.length; i++) {
            key = keys[i];
            var n = parseInt(key);
            if (!isNaN(n)) {
                value = value[n];
            } else {
                value = value[key];
            }
            if (value == undefined) {
                return "";
            }
        }
        // Implicit toString() on this.
        return value;
    });
    return st;
}
// Like Python strip() - remove leading/trailing space
function strip(s) {
    return (s || "").replace(/^\s+|\s+$/g, "");
}
});
}());
	
 |