"!==u[1]||Gt.test(o)?0:s:s.firstChild,c=o&&o.childNodes.length;c--;)st.nodeName(l=o.childNodes[c],"tbody")&&!l.childNodes.length&&o.removeChild(l);for(st.merge(h,s.childNodes),s.textContent="";s.firstChild;)s.removeChild(s.firstChild);s=d.lastChild}else h.push(t.createTextNode(o));for(s&&d.removeChild(s),st.support.appendChecked||st.grep(b(h,"input"),x),g=0;o=h[g++];)if((!r||-1===st.inArray(o,r))&&(i=st.contains(o.ownerDocument,o),s=b(d.appendChild(o),"script"),i&&m(s),n))for(c=0;o=s[c++];)tn.test(o.type||"")&&n.push(o);return s=null,d},cleanData:function(e,n){for(var r,i,o,a,s=0,u=st.expando,l=st.cache,c=st.support.deleteExpando,f=st.event.special;null!=(o=e[s]);s++)if((n||st.acceptData(o))&&(i=o[u],r=i&&l[i])){if(r.events)for(a in r.events)f[a]?st.event.remove(o,a):st.removeEvent(o,a,r.handle);l[i]&&(delete l[i],c?delete o[u]:o.removeAttribute!==t?o.removeAttribute(u):o[u]=null,K.push(i))}}});var un,ln,cn,fn=/alpha\([^)]*\)/i,pn=/opacity\s*=\s*([^)]*)/,dn=/^(top|right|bottom|left)$/,hn=/^(none|table(?!-c[ea]).+)/,gn=/^margin/,mn=RegExp("^("+ut+")(.*)$","i"),yn=RegExp("^("+ut+")(?!px)[a-z%]+$","i"),vn=RegExp("^([+-])=("+ut+")","i"),bn={BODY:"block"},xn={position:"absolute",visibility:"hidden",display:"block"},Tn={letterSpacing:0,fontWeight:400},wn=["Top","Right","Bottom","Left"],Nn=["Webkit","O","Moz","ms"];st.fn.extend({css:function(e,n){return st.access(this,function(e,n,r){var i,o,a={},s=0;if(st.isArray(n)){for(i=ln(e),o=n.length;o>s;s++)a[n[s]]=st.css(e,n[s],!1,i);return a}return r!==t?st.style(e,n,r):st.css(e,n)},e,n,arguments.length>1)},show:function(){return N(this,!0)},hide:function(){return N(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:w(this))?st(this).show():st(this).hide()})}}),st.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=un(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":st.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=st.camelCase(n),l=e.style;if(n=st.cssProps[u]||(st.cssProps[u]=T(l,u)),s=st.cssHooks[n]||st.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=vn.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(st.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||st.cssNumber[u]||(r+="px"),st.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=st.camelCase(n);return n=st.cssProps[u]||(st.cssProps[u]=T(e.style,u)),s=st.cssHooks[n]||st.cssHooks[u],s&&"get"in s&&(o=s.get(e,!0,r)),o===t&&(o=un(e,n,i)),"normal"===o&&n in Tn&&(o=Tn[n]),r?(a=parseFloat(o),r===!0||st.isNumeric(a)?a||0:o):o},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(ln=function(t){return e.getComputedStyle(t,null)},un=function(e,n,r){var i,o,a,s=r||ln(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||st.contains(e.ownerDocument,e)||(u=st.style(e,n)),yn.test(u)&&gn.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):V.documentElement.currentStyle&&(ln=function(e){return e.currentStyle},un=function(e,n,r){var i,o,a,s=r||ln(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),yn.test(u)&&!dn.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u}),st.each(["height","width"],function(e,n){st.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&hn.test(st.css(e,"display"))?st.swap(e,xn,function(){return E(e,n,i)}):E(e,n,i):t},set:function(e,t,r){var i=r&&ln(e);return C(e,t,r?k(e,n,r,st.support.boxSizing&&"border-box"===st.css(e,"boxSizing",!1,i),i):0)}}}),st.support.opacity||(st.cssHooks.opacity={get:function(e,t){return pn.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=st.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===st.trim(o.replace(fn,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=fn.test(o)?o.replace(fn,i):o+" "+i)}}),st(function(){st.support.reliableMarginRight||(st.cssHooks.marginRight={get:function(e,n){return n?st.swap(e,{display:"inline-block"},un,[e,"marginRight"]):t}}),!st.support.pixelPosition&&st.fn.position&&st.each(["top","left"],function(e,n){st.cssHooks[n]={get:function(e,r){return r?(r=un(e,n),yn.test(r)?st(e).position()[n]+"px":r):t}}})}),st.expr&&st.expr.filters&&(st.expr.filters.hidden=function(e){return 0===e.offsetWidth&&0===e.offsetHeight||!st.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||st.css(e,"display"))},st.expr.filters.visible=function(e){return!st.expr.filters.hidden(e)}),st.each({margin:"",padding:"",border:"Width"},function(e,t){st.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];4>r;r++)i[e+wn[r]+t]=o[r]||o[r-2]||o[0];return i}},gn.test(e)||(st.cssHooks[e+t].set=C)});var Cn=/%20/g,kn=/\[\]$/,En=/\r?\n/g,Sn=/^(?:submit|button|image|reset)$/i,An=/^(?:input|select|textarea|keygen)/i;st.fn.extend({serialize:function(){return st.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=st.prop(this,"elements");return e?st.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!st(this).is(":disabled")&&An.test(this.nodeName)&&!Sn.test(e)&&(this.checked||!Zt.test(e))}).map(function(e,t){var n=st(this).val();return null==n?null:st.isArray(n)?st.map(n,function(e){return{name:t.name,value:e.replace(En,"\r\n")}}):{name:t.name,value:n.replace(En,"\r\n")}}).get()}}),st.param=function(e,n){var r,i=[],o=function(e,t){t=st.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=st.ajaxSettings&&st.ajaxSettings.traditional),st.isArray(e)||e.jquery&&!st.isPlainObject(e))st.each(e,function(){o(this.name,this.value)});else for(r in e)j(r,e[r],n,o);return i.join("&").replace(Cn,"+")};var jn,Dn,Ln=st.now(),Hn=/\?/,Mn=/#.*$/,qn=/([?&])_=[^&]*/,_n=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Fn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,On=/^(?:GET|HEAD)$/,Bn=/^\/\//,Pn=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Rn=st.fn.load,Wn={},$n={},In="*/".concat("*");try{Dn=Y.href}catch(zn){Dn=V.createElement("a"),Dn.href="",Dn=Dn.href}jn=Pn.exec(Dn.toLowerCase())||[],st.fn.load=function(e,n,r){if("string"!=typeof e&&Rn)return Rn.apply(this,arguments);var i,o,a,s=this,u=e.indexOf(" ");return u>=0&&(i=e.slice(u,e.length),e=e.slice(0,u)),st.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(o="POST"),s.length>0&&st.ajax({url:e,type:o,dataType:"html",data:n}).done(function(e){a=arguments,s.html(i?st("").append(st.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,a||[e.responseText,t,e])}),this},st.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){st.fn[t]=function(e){return this.on(t,e)}}),st.each(["get","post"],function(e,n){st[n]=function(e,r,i,o){return st.isFunction(r)&&(o=o||i,i=r,r=t),st.ajax({url:e,type:n,dataType:o,data:r,success:i})}}),st.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Dn,type:"GET",isLocal:Fn.test(jn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":In,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"},converters:{"* text":e.String,"text html":!0,"text json":st.parseJSON,"text xml":st.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?H(H(e,st.ajaxSettings),t):H(st.ajaxSettings,e)},ajaxPrefilter:D(Wn),ajaxTransport:D($n),ajax:function(e,n){function r(e,n,r,s){var l,f,v,b,T,N=n;2!==x&&(x=2,u&&clearTimeout(u),i=t,a=s||"",w.readyState=e>0?4:0,r&&(b=M(p,w,r)),e>=200&&300>e||304===e?(p.ifModified&&(T=w.getResponseHeader("Last-Modified"),T&&(st.lastModified[o]=T),T=w.getResponseHeader("etag"),T&&(st.etag[o]=T)),304===e?(l=!0,N="notmodified"):(l=q(p,b),N=l.state,f=l.data,v=l.error,l=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),w.status=e,w.statusText=(n||N)+"",l?g.resolveWith(d,[f,N,w]):g.rejectWith(d,[w,N,v]),w.statusCode(y),y=t,c&&h.trigger(l?"ajaxSuccess":"ajaxError",[w,p,l?f:v]),m.fireWith(d,[w,N]),c&&(h.trigger("ajaxComplete",[w,p]),--st.active||st.event.trigger("ajaxStop")))}"object"==typeof e&&(n=e,e=t),n=n||{};var i,o,a,s,u,l,c,f,p=st.ajaxSetup({},n),d=p.context||p,h=p.context&&(d.nodeType||d.jquery)?st(d):st.event,g=st.Deferred(),m=st.Callbacks("once memory"),y=p.statusCode||{},v={},b={},x=0,T="canceled",w={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!s)for(s={};t=_n.exec(a);)s[t[1].toLowerCase()]=t[2];t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=b[n]=b[n]||e,v[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>x)for(t in e)y[t]=[y[t],e[t]];else w.always(e[w.status]);return this},abort:function(e){var t=e||T;return i&&i.abort(t),r(0,t),this}};if(g.promise(w).complete=m.add,w.success=w.done,w.error=w.fail,p.url=((e||p.url||Dn)+"").replace(Mn,"").replace(Bn,jn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=st.trim(p.dataType||"*").toLowerCase().match(lt)||[""],null==p.crossDomain&&(l=Pn.exec(p.url.toLowerCase()),p.crossDomain=!(!l||l[1]===jn[1]&&l[2]===jn[2]&&(l[3]||("http:"===l[1]?80:443))==(jn[3]||("http:"===jn[1]?80:443)))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=st.param(p.data,p.traditional)),L(Wn,p,n,w),2===x)return w;c=p.global,c&&0===st.active++&&st.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!On.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(Hn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=qn.test(o)?o.replace(qn,"$1_="+Ln++):o+(Hn.test(o)?"&":"?")+"_="+Ln++)),p.ifModified&&(st.lastModified[o]&&w.setRequestHeader("If-Modified-Since",st.lastModified[o]),st.etag[o]&&w.setRequestHeader("If-None-Match",st.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&w.setRequestHeader("Content-Type",p.contentType),w.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+In+"; q=0.01":""):p.accepts["*"]);for(f in p.headers)w.setRequestHeader(f,p.headers[f]);if(p.beforeSend&&(p.beforeSend.call(d,w,p)===!1||2===x))return w.abort();T="abort";for(f in{success:1,error:1,complete:1})w[f](p[f]);if(i=L($n,p,n,w)){w.readyState=1,c&&h.trigger("ajaxSend",[w,p]),p.async&&p.timeout>0&&(u=setTimeout(function(){w.abort("timeout")},p.timeout));try{x=1,i.send(v,r)}catch(N){if(!(2>x))throw N;r(-1,N)}}else r(-1,"No Transport");return w},getScript:function(e,n){return st.get(e,t,n,"script")},getJSON:function(e,t,n){return st.get(e,t,n,"json")}}),st.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return st.globalEval(e),e}}}),st.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),st.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=V.head||st("head")[0]||V.documentElement;return{send:function(t,i){n=V.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Xn=[],Un=/(=)\?(?=&|$)|\?\?/;st.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xn.pop()||st.expando+"_"+Ln++;return this[e]=!0,e}}),st.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,u=n.jsonp!==!1&&(Un.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Un.test(n.data)&&"data");return u||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=st.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,u?n[u]=n[u].replace(Un,"$1"+o):n.jsonp!==!1&&(n.url+=(Hn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||st.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Xn.push(o)),s&&st.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Vn,Yn,Jn=0,Gn=e.ActiveXObject&&function(){var e;for(e in Vn)Vn[e](t,!0)};st.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&_()||F()}:_,Yn=st.ajaxSettings.xhr(),st.support.cors=!!Yn&&"withCredentials"in Yn,Yn=st.support.ajax=!!Yn,Yn&&st.ajaxTransport(function(n){if(!n.crossDomain||st.support.cors){var r;return{send:function(i,o){var a,s,u=n.xhr();if(n.username?u.open(n.type,n.url,n.async,n.username,n.password):u.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)u[s]=n.xhrFields[s];n.mimeType&&u.overrideMimeType&&u.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)u.setRequestHeader(s,i[s])}catch(l){}u.send(n.hasContent&&n.data||null),r=function(e,i){var s,l,c,f,p;try{if(r&&(i||4===u.readyState))if(r=t,a&&(u.onreadystatechange=st.noop,Gn&&delete Vn[a]),i)4!==u.readyState&&u.abort();else{f={},s=u.status,p=u.responseXML,c=u.getAllResponseHeaders(),p&&p.documentElement&&(f.xml=p),"string"==typeof u.responseText&&(f.text=u.responseText);try{l=u.statusText}catch(d){l=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=f.text?200:404}}catch(h){i||o(-1,h)}f&&o(s,l,f,c)},n.async?4===u.readyState?setTimeout(r):(a=++Jn,Gn&&(Vn||(Vn={},st(e).unload(Gn)),Vn[a]=r),u.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Qn,Kn,Zn=/^(?:toggle|show|hide)$/,er=RegExp("^(?:([+-])=|)("+ut+")([a-z%]*)$","i"),tr=/queueHooks$/,nr=[W],rr={"*":[function(e,t){var n,r,i=this.createTween(e,t),o=er.exec(t),a=i.cur(),s=+a||0,u=1,l=20;if(o){if(n=+o[2],r=o[3]||(st.cssNumber[e]?"":"px"),"px"!==r&&s){s=st.css(i.elem,e,!0)||n||1;do u=u||".5",s/=u,st.style(i.elem,e,s+r);while(u!==(u=i.cur()/a)&&1!==u&&--l)}i.unit=r,i.start=s,i.end=o[1]?s+(o[1]+1)*n:n}return i}]};st.Animation=st.extend(P,{tweener:function(e,t){st.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");for(var n,r=0,i=e.length;i>r;r++)n=e[r],rr[n]=rr[n]||[],rr[n].unshift(t)},prefilter:function(e,t){t?nr.unshift(e):nr.push(e)}}),st.Tween=$,$.prototype={constructor:$,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(st.cssNumber[n]?"":"px")},cur:function(){var e=$.propHooks[this.prop];return e&&e.get?e.get(this):$.propHooks._default.get(this)},run:function(e){var t,n=$.propHooks[this.prop];return this.pos=t=this.options.duration?st.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):$.propHooks._default.set(this),this}},$.prototype.init.prototype=$.prototype,$.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=st.css(e.elem,e.prop,"auto"),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){st.fx.step[e.prop]?st.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[st.cssProps[e.prop]]||st.cssHooks[e.prop])?st.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},$.propHooks.scrollTop=$.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},st.each(["toggle","show","hide"],function(e,t){var n=st.fn[t];st.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(I(t,!0),e,r,i)}}),st.fn.extend({fadeTo:function(e,t,n,r){return this.filter(w).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=st.isEmptyObject(e),o=st.speed(t,n,r),a=function(){var t=P(this,st.extend({},e),o);a.finish=function(){t.stop(!0)},(i||st._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=st.timers,a=st._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&tr.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&st.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=st._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=st.timers,a=r?r.length:0;for(n.finish=!0,st.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),st.each({slideDown:I("show"),slideUp:I("hide"),slideToggle:I("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){st.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),st.speed=function(e,t,n){var r=e&&"object"==typeof e?st.extend({},e):{complete:n||!n&&t||st.isFunction(e)&&e,duration:e,easing:n&&t||t&&!st.isFunction(t)&&t};return r.duration=st.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in st.fx.speeds?st.fx.speeds[r.duration]:st.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){st.isFunction(r.old)&&r.old.call(this),r.queue&&st.dequeue(this,r.queue)},r},st.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},st.timers=[],st.fx=$.prototype.init,st.fx.tick=function(){var e,n=st.timers,r=0;for(Qn=st.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||st.fx.stop(),Qn=t},st.fx.timer=function(e){e()&&st.timers.push(e)&&st.fx.start()},st.fx.interval=13,st.fx.start=function(){Kn||(Kn=setInterval(st.fx.tick,st.fx.interval))},st.fx.stop=function(){clearInterval(Kn),Kn=null},st.fx.speeds={slow:600,fast:200,_default:400},st.fx.step={},st.expr&&st.expr.filters&&(st.expr.filters.animated=function(e){return st.grep(st.timers,function(t){return e===t.elem}).length}),st.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){st.offset.setOffset(this,e,t)});var n,r,i={top:0,left:0},o=this[0],a=o&&o.ownerDocument;if(a)return n=a.documentElement,st.contains(n,o)?(o.getBoundingClientRect!==t&&(i=o.getBoundingClientRect()),r=z(a),{top:i.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:i.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):i},st.offset={setOffset:function(e,t,n){var r=st.css(e,"position");"static"===r&&(e.style.position="relative");var i,o,a=st(e),s=a.offset(),u=st.css(e,"top"),l=st.css(e,"left"),c=("absolute"===r||"fixed"===r)&&st.inArray("auto",[u,l])>-1,f={},p={};c?(p=a.position(),i=p.top,o=p.left):(i=parseFloat(u)||0,o=parseFloat(l)||0),st.isFunction(t)&&(t=t.call(e,n,s)),null!=t.top&&(f.top=t.top-s.top+i),null!=t.left&&(f.left=t.left-s.left+o),"using"in t?t.using.call(e,f):a.css(f)}},st.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===st.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),st.nodeName(e[0],"html")||(n=e.offset()),n.top+=st.css(e[0],"borderTopWidth",!0),n.left+=st.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-st.css(r,"marginTop",!0),left:t.left-n.left-st.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent||V.documentElement;e&&!st.nodeName(e,"html")&&"static"===st.css(e,"position");)e=e.offsetParent;return e||V.documentElement})}}),st.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);st.fn[e]=function(i){return st.access(this,function(e,i,o){var a=z(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?st(a).scrollLeft():o,r?o:st(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}}),st.each({Height:"height",Width:"width"},function(e,n){st.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){st.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return st.access(this,function(n,r,i){var o;return st.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?st.css(n,r,s):st.style(n,r,i,s)},n,a?i:t,a,null)}})}),e.jQuery=e.$=st,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return st})})(window);
+//@ sourceMappingURL=jquery.min.map
\ No newline at end of file
diff --git a/js/lyre.js b/js/lyre.js
new file mode 100644
index 0000000..5ec0cf1
--- /dev/null
+++ b/js/lyre.js
@@ -0,0 +1,29 @@
+/*jslint newcap: true, plusplus: true, passfail: true, browser: true, devel: true, indent: 4, maxlen: 100 */
+/*global webkitAudioContext: false, createJRemixer: false, jQuery: false, $: false */
+var apiKey = 'YLTCU72SODVIC00NB';
+var trackID = 'TRFINBO13C52D7A637';
+var trackURL = 'audio/something.mp3';
+
+var remixer, player, track, remixed;
+
+(function () {
+ 'use strict';
+
+ var context = new webkitAudioContext();
+
+ remixer = createJRemixer(context, $, apiKey);
+ player = remixer.getPlayer();
+
+ remixer.remixTrackById(trackID, trackURL, function (t, percent) {
+ track = t;
+
+ $('#info').text(percent + "% of the track loaded");
+ if (percent === 100) {
+ $('#info').text(percent + "% of the track loaded, remix time");
+ }
+
+ if (track.status === 'ok') {
+ console.log(track.analysis);
+ }
+ });
+}());
\ No newline at end of file
diff --git a/js/remix.js b/js/remix.js
new file mode 100644
index 0000000..888fb2d
--- /dev/null
+++ b/js/remix.js
@@ -0,0 +1,453 @@
+// Remix.js
+// Thor Kell & Paul Lamere, 12/2012
+// Based on Paul Lamere's Infinite Jukebox and assorted other javascript projects
+
+
+function createJRemixer(context, jquery, apiKey) {
+ var $ = jquery;
+ $.ajaxSetup({ cache: false });
+
+ var remixer = {
+ remixTrackById: function(trackID, trackURL, callback) {
+ var track;
+ var url = 'http://developer.echonest.com/api/v4/track/profile?format=json&bucket=audio_summary'
+ $.getJSON(url, {id:trackID, api_key:apiKey}, function(data) {
+ var analysisURL = data.response.track.audio_summary.analysis_url;
+ track = data.response.track;
+
+ // This call is proxied through the yahoo query engine.
+ // This is temporary, but works.
+ $.getJSON("http://query.yahooapis.com/v1/public/yql",
+ { q: "select * from json where url=\"" + analysisURL + "\"", format: "json"},
+ function(data) {
+ if (data.query.results != null) {
+ track.analysis = data.query.results.json;
+ remixer.remixTrack(track, trackURL, callback);
+ }
+ else {
+ console.log('error', 'No analysis data returned: sorry!');
+ }
+ });
+
+ });
+ },
+
+ remixTrack : function(track, trackURL, callback) {
+ function fetchAudio(url) {
+ var request = new XMLHttpRequest();
+ trace("fetchAudio " + url);
+ track.buffer = null;
+ request.open("GET", url, true);
+ request.responseType = "arraybuffer";
+ this.request = request;
+
+ request.onload = function() {
+ trace('audio loaded');
+ if (false) {
+ track.buffer = context.createBuffer(request.response, false);
+ track.status = 'ok'
+ } else {
+ context.decodeAudioData(request.response,
+ function(buffer) { // completed function
+ track.buffer = buffer;
+ track.status = 'ok';
+ callback(track, 100);
+ },
+ function(e) { // error function
+ track.status = 'error: loading audio'
+ console.log('audio error', e);
+ }
+ );
+ }
+ }
+ request.onerror = function(e) {
+ trace('error loading loaded');
+ track.status = 'error: loading audio'
+ }
+ request.onprogress = function(e) {
+ var percent = Math.round(e.position * 100 / e.totalSize);
+ callback(track, percent);
+ }
+ request.send();
+ }
+
+ function preprocessTrack(track) {
+ trace('preprocessTrack');
+ var types = ['sections', 'bars', 'beats', 'tatums', 'segments'];
+
+ for (var i in types) {
+ var type = types[i];
+ trace('preprocessTrack ' + type);
+ for (var j in track.analysis[type]) {
+ var qlist = track.analysis[type]
+
+ j = parseInt(j)
+
+ var q = qlist[j]
+ q.track = track;
+ q.which = j;
+ if (j > 0) {
+ q.prev = qlist[j-1];
+ } else {
+ q.prev = null
+ }
+
+ if (j < qlist.length - 1) {
+ q.next = qlist[j+1];
+ } else {
+ q.next = null
+ }
+ }
+ }
+
+ connectQuanta(track, 'sections', 'bars');
+ connectQuanta(track, 'bars', 'beats');
+ connectQuanta(track, 'beats', 'tatums');
+ connectQuanta(track, 'tatums', 'segments');
+
+ connectFirstOverlappingSegment(track, 'bars');
+ connectFirstOverlappingSegment(track, 'beats');
+ connectFirstOverlappingSegment(track, 'tatums');
+
+ connectAllOverlappingSegments(track, 'bars');
+ connectAllOverlappingSegments(track, 'beats');
+ connectAllOverlappingSegments(track, 'tatums');
+
+ filterSegments(track);
+ }
+
+ function filterSegments(track) {
+ var threshold = .3;
+ var fsegs = [];
+ fsegs.push(track.analysis.segments[0]);
+ for (var i = 1; i < track.analysis.segments.length; i++) {
+ var seg = track.analysis.segments[i];
+ var last = fsegs[fsegs.length - 1];
+ if (isSimilar(seg, last) && seg.confidence < threshold) {
+ fsegs[fsegs.length -1].duration += seg.duration;
+ } else {
+ fsegs.push(seg);
+ }
+ }
+ track.analysis.fsegments = fsegs;
+ }
+
+ function isSimilar(seg1, seg2) {
+ var threshold = 1;
+ var distance = timbral_distance(seg1, seg2);
+ return (distance < threshold);
+ }
+
+ function connectQuanta(track, parent, child) {
+ var last = 0;
+ var qparents = track.analysis[parent];
+ var qchildren = track.analysis[child];
+
+ for (var i in qparents) {
+ var qparent = qparents[i]
+ qparent.children = [];
+
+ for (var j = last; j < qchildren.length; j++) {
+ var qchild = qchildren[j];
+ if (qchild.start >= qparent.start
+ && qchild.start < qparent.start + qparent.duration) {
+ qchild.parent = qparent;
+ qchild.indexInParent = qparent.children.length;
+ qparent.children.push(qchild);
+ last = j;
+ } else if (qchild.start > qparent.start) {
+ break;
+ }
+ }
+ }
+ }
+
+ // connects a quanta with the first overlapping segment
+ function connectFirstOverlappingSegment(track, quanta_name) {
+ var last = 0;
+ var quanta = track.analysis[quanta_name];
+ var segs = track.analysis.segments;
+
+ for (var i = 0; i < quanta.length; i++) {
+ var q = quanta[i]
+
+ for (var j = last; j < segs.length; j++) {
+ var qseg = segs[j];
+ if (qseg.start >= q.start) {
+ q.oseg = qseg;
+ last = j;
+ break
+ }
+ }
+ }
+ }
+
+ function connectAllOverlappingSegments(track, quanta_name) {
+ var last = 0;
+ var quanta = track.analysis[quanta_name];
+ var segs = track.analysis.segments;
+
+ for (var i = 0; i < quanta.length; i++) {
+ var q = quanta[i]
+ q.overlappingSegments = [];
+
+ for (var j = last; j < segs.length; j++) {
+ var qseg = segs[j];
+ // seg starts before quantum so no
+ if ((qseg.start + qseg.duration) < q.start) {
+ continue;
+ }
+ // seg starts after quantum so no
+ if (qseg.start > (q.start + q.duration)) {
+ break;
+ }
+ last = j;
+ q.overlappingSegments.push(qseg);
+ }
+ }
+ }
+
+
+ if (track.status == 'complete') {
+ preprocessTrack(track);
+ fetchAudio(trackURL);
+ } else {
+ track.status = 'error: incomplete analysis';
+ }
+ },
+
+ getPlayer : function() {
+ var queueTime = 0;
+ var audioGain = context.createGainNode();
+ var curAudioSource = null;
+ var currentlyQueued = new Array();
+ var curQ = null;
+ audioGain.gain.value = 1;
+ audioGain.connect(context.destination);
+
+ function queuePlay(when, q) {
+ audioGain.gain.value = 1;
+ if (isAudioBuffer(q)) {
+ var audioSource = context.createBufferSource();
+ audioSource.buffer = q;
+ audioSource.connect(audioGain);
+ currentlyQueued.push(audioSource);
+ audioSource.noteOn(when);
+ return when;
+ } else if ($.isArray(q)) {
+ // Correct for load times
+ if (when == 0) {
+ when = context.currentTime;
+ }
+ for (var i = 0; i < q.length; i++) {
+ when = queuePlay(when, q[i]);
+ }
+ return when;
+ } else if (isQuantum(q)) {
+ var audioSource = context.createBufferSource();
+ audioSource.buffer = q.track.buffer;
+ audioSource.connect(audioGain);
+ q.audioSource = audioSource;
+ currentlyQueued.push(audioSource);
+ audioSource.noteGrainOn(when, q.start, q.duration);
+ return (when + parseFloat(q.duration));
+ } else {
+ error("can't play " + q);
+ return when;
+ }
+ }
+
+ function error(s) {
+ console.log(s);
+ }
+
+ var player = {
+ play: function(when, q) {
+ return queuePlay(0, q);
+ },
+
+ addCallback: function(callback) {
+ },
+
+ queue: function(q) {
+ var now = context.currentTime;
+ if (now > queueTime) {
+ queueTime = now;
+ }
+ queueTime = queuePlay(queueTime, q);
+ },
+
+ queueRest: function(duration) {
+ queueTime += duration;
+ },
+
+ stop: function() {
+ for (var i = 0; i < currentlyQueued.length; i++) {
+ if (currentlyQueued[i] != null) {
+ currentlyQueued[i].noteOff(0);
+ }
+ }
+ currentlyQueued = new Array();
+ },
+
+ curTime: function() {
+ return context.currentTime;
+ },
+
+
+ }
+ return player;
+ },
+
+ fetchSound : function(audioURL, callback) {
+ var request = new XMLHttpRequest();
+
+ trace("fetchSound " + audioURL);
+ request.open("GET", audioURL, true);
+ request.responseType = "arraybuffer";
+ this.request = request;
+
+ request.onload = function() {
+ var buffer = context.createBuffer(request.response, false);
+ callback(true, buffer);
+ }
+
+ request.onerror = function(e) {
+ callback(false, null);
+ }
+ request.send();
+ },
+ };
+
+ function isQuantum(a) {
+ return 'start' in a && 'duration' in a;
+ }
+
+ function isAudioBuffer(a) {
+ return 'getChannelData' in a;
+ }
+
+ function trace(text) {
+ if (false) {
+ console.log(text);
+ }
+ }
+
+ return remixer;
+}
+
+
+function euclidean_distance(v1, v2) {
+ var sum = 0;
+ for (var i = 0; i < 3; i++) {
+ var delta = v2[i] - v1[i];
+ sum += delta * delta;
+ }
+ return Math.sqrt(sum);
+}
+
+function timbral_distance(s1, s2) {
+ return euclidean_distance(s1.timbre, s2.timbre);
+}
+
+
+function clusterSegments(track, numClusters, fieldName, vecName) {
+ var vname = vecName || 'timbre';
+ var fname = fieldName || 'cluster';
+ var maxLoops = 1000;
+
+ function zeroArray(size) {
+ var arry = [];
+ for (var i = 0; i < size; i++) {
+ arry.push(0);
+ }
+ return arry;
+ }
+
+ function reportClusteringStats() {
+ var counts = zeroArray(numClusters);
+ for (var i = 0; i < track.analysis.segments.length; i++) {
+ var cluster = track.analysis.segments[i][fname];
+ counts[cluster]++;
+ }
+ //console.log('clustering stats');
+ for (var i = 0; i < counts.length; i++) {
+ //console.log('clus', i, counts[i]);
+ }
+ }
+
+ function sumArray(v1, v2) {
+ for (var i = 0; i < v1.length; i++) {
+ v1[i] += v2[i];
+ }
+ return v1;
+ }
+
+ function divArray(v1, scalar) {
+ for (var i = 0; i < v1.length; i++) {
+ v1[i] /= scalar
+ }
+ return v1;
+ }
+ function getCentroid(cluster) {
+ var count = 0;
+ var segs = track.analysis.segments;
+ var vsum = zeroArray(segs[0][vname].length);
+
+ for (var i = 0; i < segs.length; i++) {
+ if (segs[i][fname] === cluster) {
+ count++;
+ vsum = sumArray(vsum, segs[i][vname]);
+ }
+ }
+
+ vsum = divArray(vsum, count);
+ return vsum;
+ }
+
+ function findNearestCluster(clusters, seg) {
+ var shortestDistance = Number.MAX_VALUE;
+ var bestCluster = -1;
+
+ for (var i = 0; i < clusters.length; i++) {
+ var distance = euclidean_distance(clusters[i], seg[vname]);
+ if (distance < shortestDistance) {
+ shortestDistance = distance;
+ bestCluster = i;
+ }
+ }
+ return bestCluster;
+ }
+
+ // kmeans clusterer
+ // use random initial assignments
+ for (var i = 0; i < track.analysis.segments.length; i++) {
+ track.analysis.segments[i][fname] = Math.floor(Math.random() * numClusters);
+ }
+
+ reportClusteringStats();
+
+ while (maxLoops-- > 0) {
+ // calculate cluster centroids
+ var centroids = [];
+ for (var i = 0; i < numClusters; i++) {
+ centroids[i] = getCentroid(i);
+ }
+ // reassign segs to clusters
+ var switches = 0;
+ for (var i = 0; i < track.analysis.segments.length; i++) {
+ var seg = track.analysis.segments[i];
+ var oldCluster = seg[fname];
+ var newCluster = findNearestCluster(centroids, seg);
+ if (oldCluster !== newCluster) {
+ switches++;
+ seg[fname] = newCluster;
+ }
+ }
+ //console.log("loopleft", maxLoops, 'switches', switches);
+ if (switches == 0) {
+ break;
+ }
+ }
+ reportClusteringStats();
+}
diff --git a/somethingResponse.json b/somethingResponse.json
new file mode 100644
index 0000000..7909a94
--- /dev/null
+++ b/somethingResponse.json
@@ -0,0 +1,23 @@
+{
+ "response": {
+ "status": {
+ "version": "4.2",
+ "code": 0,
+ "message": "Success"
+ },
+ "track": {
+ "status": "pending",
+ "song_id": "SOCJMRB1367892C0B5",
+ "audio_md5": "297d033e321d7c327183b515999a944a",
+ "artist": "Beatles",
+ "title": "Something",
+ "analyzer_version": "3.1.3",
+ "release": "",
+ "artist_id": "AR6XZ861187FB4CECD",
+ "bitrate": 192,
+ "id": "TRFINBO13C52D7A637",
+ "samplerate": 44100,
+ "md5": "b38a41b4805d6cc5fc44838c9ca4ae23"
+ }
+ }
+}
\ No newline at end of file