a+1&&b.push
(d.slice(a+1,f)),a=f):f===e-1&&b.push(d.slice(a+1,f+1
))});this.segments=b},setOptions:function(a){var b=
this.chart.options,c=b.plotOptions,d=a.data;return a
.data=null,c=b$(c[this.type],c.series,a),c.data=a.data=
d,this.tooltipOptions=b$(b.tooltip,c.tooltip),c},getColor
:function(){var a=this.options,b=this.chart.options
.colors,c=this.chart.counters;this.color=a.color||!
a.colorByPoint&&b[c.color++]||"gray",c.wrapColor(b.
length)},getSymbol:function(){var a=this.options.marker
,b=this.chart,c=b.options.symbols,b=b.counters;this
.symbol=a.symbol||c[b.symbol++],/^url/.test(this.symbol
)&&(a.radius=0),b.wrapSymbol(c.length)},drawLegendSymbol
:function(a){var b=this.options,c=b.marker,d=a.options
.symbolWidth,e=this.chart.renderer,f=this.legendGroup
,a=a.baseline,g;b.lineWidth&&(g={"stroke-width":b.lineWidth
},b.dashStyle&&(g.dashstyle=b.dashStyle),this.legendLine=
e.path(["M",0,a-4,"L",d,a-4]).attr(g).add(f)),c&&c.
enabled&&(b=c.radius,this.legendSymbol=e.symbol(this
.symbol,d/2-b,a-4-b,2*b,2*b).attr(this.pointAttr[""
]).add(f))},addPoint:function(a,b,c,d){var e=this.data
,f=this.graph,g=this.area,h=this.chart,i=this.xData
,j=this.yData,k=f&&f.shift||0,l=this.options.data;E
(d,h),f&&c&&(f.shift=k+1),g&&(c&&(g.shift=k+1),g.isArea=!0
),b=n(b,!0),d={series:this},this.pointClass.prototype
.applyOptions.apply(d,[a]),i.push(d.x),j.push(this.
valueCount===4?[d.open,d.high,d.low,d.close]:d.y),l
.push(a),c&&(e[0]&&e[0].remove?e[0].remove(!1):(e.shift
(),i.shift(),j.shift(),l.shift())),this.getAttribs(
),this.isDirtyData=this.isDirty=!0,b&&h.redraw()},setData
:function(a,b){var c=this.points,d=this.options,e=this
.initialColor,h=this.chart,i=null,j=this.xAxis,l=this
.pointClass.prototype;this.xIncrement=null,this.pointRange=
j&&j.categories&&1||d.pointRange,k(e)&&(h.counters.
color=e);var m=[],o=[],p=a?a.length:[],q=this.valueCount
;if(p>(d.turboThreshold||1e3)){for(e=0;i===null&&e<
p;)i=a[e],e++;if(g(i)){l=n(d.pointStart,0),d=n(d.pointInterval
,1);for(e=0;ek||this.forceCrop))if(a=i.getExtremes
(),i=a.min,k=a.max,b[d-1]k)b=[],c=[];else if(
b[0]k){for(a=0;a=i){e=W(0
,a-1);break}for(;ak){f=a+1;break}b=b
.slice(e,f),c=c.slice(e,f),g=!0}for(a=b.length-1;a>0
;a--)if(d=b[a]-b[a-1],d>0&&(h===P||d=0&&d<=
e;)h[d++]=f}this.tooltipPoints=h}},tooltipHeaderFormatter
:function(a){var b=this.tooltipOptions,c=b.xDateFormat
,d=this.xAxis,e=d&&d.options.type==="datetime",f;if(
e&&!c)for(f in bs)if(bs[f]>=d.closestPointRange){c=
b.dateTimeLabelFormats[f];break}return b.headerFormat
.replace("{point.key}",e?bp(c,a):a).replace("{series.name}"
,this.name).replace("{series.color}",this.color)},onMouseOver
:function(){var a=this.chart,b=a.hoverSeries;if(bk||!
a.mouseIsDown)b&&b!==this&&b.onMouseOut(),this.options
.events.mouseOver&&cb(this,"mouseOver"),this.setState
("hover"),a.hoverSeries=this},onMouseOut:function()
{var a=this.options,b=this.chart,c=b.tooltip,d=b.hoverPoint
;d&&d.onMouseOut(),this&&a.events.mouseOut&&cb(this
,"mouseOut"),c&&!a.stickyTracking&&!c.shared&&c.hide
(),this.setState(),b.hoverSeries=null},animate:function(
a){var b=this.chart,c=this.clipRect,d=this.options.
animation;d&&!e(d)&&(d={}),a?c.isAnimating||(c.attr
("width",0),c.isAnimating=!0):(c.animate({width:b.plotSizeX
},d),this.animate=null)},drawPoints:function(){var b
,c=this.points,d=this.chart,e,f,g,h,i,j,k,l;if(this
.options.marker.enabled)for(g=c.length;g--;)if(h=c[
g],e=h.plotX,f=h.plotY,l=h.graphic,f!==P&&!isNaN(f)
)if(b=h.pointAttr[h.selected?"select":""],i=b.r,j=n
(h.marker&&h.marker.symbol,this.symbol),k=j.indexOf
("url")===0,l)l.animate(a({x:e-i,y:f-i},l.symbolName?
{width:2*i,height:2*i}:{}));else if(i>0||k)h.graphic=
d.renderer.symbol(j,e-i,f-i,2*i,2*i).attr(b).add(this
.group)},convertAttribs:function(a,b,c,d){var e=this
.pointAttrToOptions,f,g,h={},a=a||{},b=b||{},c=c||{
},d=d||{};for(f in e)g=e[f],h[f]=n(a[g],b[f],c[f],d
[f]);return h},getAttribs:function(){var a=this,b=ci
[a.type].marker?a.options.marker:a.options,c=b.states
,d=c.hover,e,f=a.color,g={stroke:f,fill:f},h=a.points||
[],i=[],j,l=a.pointAttrToOptions,m;a.options.marker?
(d.radius=d.radius||b.radius+2,d.lineWidth=d.lineWidth||
b.lineWidth+1):d.color=d.color||cj(d.color||f).brighten
(d.brightness).get(),i[""]=a.convertAttribs(b,g),bW
(["hover","select"],function(b){i[b]=a.convertAttribs
(c[b],i[""])}),a.pointAttr=i;for(f=h.length;f--;){g=
h[f],(b=g.options&&g.options.marker||g.options)&&b.
enabled===!1&&(b.radius=0),e=!1;if(g.options)for(m in
l)k(b[l[m]])&&(e=!0);e?(j=[],c=b.states||{},e=c.hover=
c.hover||{},a.options.marker||(e.color=cj(e.color||
g.options.color).brighten(e.brightness||d.brightness
).get()),j[""]=a.convertAttribs(b,i[""]),j.hover=a.
convertAttribs(c.hover,i.hover,j[""]),j.select=a.convertAttribs
(c.select,i.select,j[""])):j=i,g.pointAttr=j}},destroy
:function(){var a=this,b=a.chart,c=a.clipRect,d=/AppleWebKit\/533/
.test(bb),e,f,g=a.data||[],h,i,k;cb(a,"destroy"),ca
(a),bW(["xAxis","yAxis"],function(b){if(k=a[b])j(k.
series,a),k.isDirty=!0}),a.legendItem&&a.chart.legend
.destroyItem(a);for(f=g.length;f--;)(h=g[f])&&h.destroy&&
h.destroy();a.points=null,c&&c!==b.clipRect&&(a.clipRect=
c.destroy()),bW("area,graph,dataLabelsGroup,group,tracker,trackerGroup"
.split(","),function(b){a[b]&&(e=d&&b==="group"?"hide"
:"destroy",a[b][e]())}),b.hoverSeries===a&&(b.hoverSeries=
null),j(b.series,a);for(i in a)delete a[i]},drawDataLabels
:function(){var a=this,b=a.options,c=b.dataLabels;if(
c.enabled||a._hasPointLabels){var d,e,f=a.points,g,
h,i,j=a.dataLabelsGroup,l=a.chart,m=a.xAxis,m=m?m.left
:l.plotLeft,o=a.yAxis,o=o?o.top:l.plotTop,p=l.renderer
,q=l.inverted,r=a.type,s=b.stacking,t=r==="column"||
r==="bar",u=c.verticalAlign===null,v=c.y===null,w=p
.fontMetrics(c.style.fontSize),x=w.h,y=w.b,z,A;t&&(
w={top:y,middle:y-x/2,bottom:-x+y},s?(u&&(c=b$(c,{verticalAlign
:"middle"})),v&&(c=b$(c,{y:w[c.verticalAlign]}))):u?
c=b$(c,{verticalAlign:"top"}):v&&(c=b$(c,{y:w[c.verticalAlign
]}))),j?j.translate(m,o):j=a.dataLabelsGroup=p.g("data-labels"
).attr({visibility:a.visible?"visible":"hidden",zIndex
:6}).translate(m,o).add(),h=c,bW(f,function(f){z=f.
dataLabel,c=h,(g=f.options)&&g.dataLabels&&(c=b$(c,
g.dataLabels));if(A=c.enabled){var m=f.barX&&f.barX+
f.barW/2||n(f.plotX,-999),o=n(f.plotY,-999),u=c.y===
null?f.y>=b.threshold?-x+y:y:c.y;d=(q?l.plotWidth-o
:m)+c.x,e=T((q?l.plotHeight-m:o)+u)}if(z&&a.isCartesian&&
(!l.isInsidePlot(d,e)||!A))f.dataLabel=z.destroy();
else if(A){var m=c.align,v;i=c.formatter.call(f.getLabelConfig
(),c),r==="column"&&(d+={left:-1,right:1}[m]*f.barW/2||0
),!s&&q&&f.y<0&&(m="right",d-=10),c.style.color=n(c
.color,c.style.color,a.color,"black");if(z)z.attr({
text:i}).animate({x:d,y:e});else if(k(i)){m={align:
m,fill:c.backgroundColor,stroke:c.borderColor,"stroke-width"
:c.borderWidth,r:c.borderRadius||0,rotation:c.rotation
,padding:c.padding,zIndex:1};for(v in m)m[v]===P&&delete
m[v];z=f.dataLabel=p[c.rotation?"text":"label"](i,d
,e,null,null,null,c.useHTML,!0).attr(m).css(c.style
).add(j).shadow(c.shadow)}t&&b.stacking&&z&&(v=f.barX
,m=f.barY,o=f.barW,f=f.barH,z.align(c,null,{x:q?l.plotWidth-
m-f:v,y:q?l.plotHeight-v-o:m,width:q?f:o,height:q?o
:f}))}})}},getSegmentPath:function(a){var b=this,c=
[];return bW(a,function(d,e){b.getPointSpline?c.push
.apply(c,b.getPointSpline(a,d,e)):(c.push(e?"L":"M"
),e&&b.options.step&&c.push(d.plotX,a[e-1].plotY),c
.push(d.plotX,d.plotY))}),c},drawGraph:function(){var a=
this,b=a.options,c=a.graph,d=[],e=a.group,f=b.lineColor||
a.color,g=b.lineWidth,h=b.dashStyle,i,j=a.chart.renderer
,k=[];bW(a.segments,function(b){i=a.getSegmentPath(
b),b.length>1?d=d.concat(i):k.push(b[0])}),a.graphPath=
d,a.singlePoints=k,c?(ce(c),c.animate({d:d})):g&&(c=
{stroke:f,"stroke-width":g},h&&(c.dashstyle=h),a.graph=
j.path(d).attr(c).add(e).shadow(b.shadow))},invertGroups
:function(){function a(){var a={width:b.yAxis.len,height
:b.xAxis.len};c.attr(a).invert(),d&&d.attr(a).invert
()}var b=this,c=b.group,d=b.trackerGroup,e=b.chart;
b_(e,"resize",a),b_(b,"destroy",function(){ca(e,"resize"
,a)}),a(),b.invertGroups=a},createGroup:function(){
var a=this.chart;(this.group=a.renderer.g("series")
).attr({visibility:this.visible?"visible":"hidden",
zIndex:this.options.zIndex}).translate(this.xAxis.left
,this.yAxis.top).add(a.seriesGroup),this.createGroup=
bt},render:function(){var a=this,b=a.chart,c,d=a.options
,e=d.clip!==!1,f=d.animation,f=(d=f&&a.animate)?f&&
f.duration||500:0,g=a.clipRect,h=b.renderer;!g&&(g=
a.clipRect=!b.hasRendered&&b.clipRect?b.clipRect:h.
clipRect(0,0,b.plotSizeX,b.plotSizeY+1),!b.clipRect
)&&(b.clipRect=g),a.createGroup(),c=a.group,a.drawDataLabels
(),d&&a.animate(!0),a.getAttribs(),a.drawGraph&&a.drawGraph
(),a.drawPoints(),a.options.enableMouseTracking!==!1&&
a.drawTracker(),b.inverted&&a.invertGroups(),e&&!a.
hasRendered&&(c.clip(g),a.trackerGroup&&a.trackerGroup
.clip(b.clipRect)),d&&a.animate(),setTimeout(function(
){g.isAnimating=!1,(c=a.group)&&g!==b.clipRect&&g.renderer&&
(e&&c.clip(a.clipRect=b.clipRect),g.destroy())},f),
a.isDirty=a.isDirtyData=!1,a.hasRendered=!0},redraw
:function(){var a=this.chart,b=this.isDirtyData,c=this
.group;c&&(a.inverted&&c.attr({width:a.plotWidth,height
:a.plotHeight}),c.animate({translateX:this.xAxis.left
,translateY:this.yAxis.top})),this.translate(),this
.setTooltipPoints(!0),this.render(),b&&cb(this,"updatedData"
)},setState:function(a){var b=this.options,c=this.graph
,d=b.states,b=b.lineWidth,a=a||"";this.state!==a&&(
this.state=a,d[a]&&d[a].enabled===!1||(a&&(b=d[a].lineWidth||
b+1),c&&!c.dashstyle&&c.attr({"stroke-width":b},a?0
:500)))},setVisible:function(a,b){var c=this.chart,
d=this.legendItem,e=this.group,f=this.tracker,g=this
.dataLabelsGroup,h,i=this.points,j=c.options.chart.
ignoreHiddenSeries;h=this.visible,h=(this.visible=a=
a===P?!h:a)?"show":"hide",e&&e[h]();if(f)f[h]();else if(
i)for(e=i.length;e--;)(f=i[e],f.tracker)&&f.tracker
[h]();g&&g[h](),d&&c.legend.colorizeItem(this,a),this
.isDirty=!0,this.options.stacking&&bW(c.series,function(
a){a.options.stacking&&a.visible&&(a.isDirty=!0)}),
j&&(c.isDirtyBox=!0),b!==!1&&c.redraw(),cb(this,h)}
,show:function(){this.setVisible(!0)},hide:function(
){this.setVisible(!1)},select:function(a){this.selected=
a=a===P?!this.selected:a,this.checkbox&&(this.checkbox
.checked=a),cb(this,a?"select":"unselect")},drawTrackerGroup
:function(){var a=this.trackerGroup,b=this.chart;return this
.isCartesian&&(a||(this.trackerGroup=a=b.renderer.g
().attr({zIndex:this.options.zIndex||1}).add(b.trackerGroup
)),a.translate(this.xAxis.left,this.yAxis.top)),a},
drawTracker:function(){var a=this,b=a.options,c=b.trackByArea
,d=[].concat(c?a.areaPath:a.graphPath),e=d.length,f=
a.chart,g=f.renderer,h=f.options.tooltip.snap,i=a.tracker
,j=b.cursor,j=j&&{cursor:j},k=a.singlePoints,l=a.drawTrackerGroup
(),m;if(e&&!c)for(m=e+1;m--;)d[m]==="M"&&d.splice(m+1
,0,d[m+1]-h,d[m+2],"L"),(m&&d[m]==="M"||m===e)&&d.splice
(m,0,"L",d[m-2]+h,d[m-1]);for(m=0;m=0;d--)da&&i>e?(i=W(a,e),
k=2*e-i):ig&&k>e?(k=W
(g,e),i=2*e-k):kx?h-x:w-(g<=w?x:0)),
a(d,{barX:i,barY:j,barW:u,barH:k,pointWidth:t}),d.shapeType="rect"
,d.shapeArgs=g=c.renderer.Element.prototype.crisp.call
(0,f,i,j,u,k),f%2&&(g.y-=1,g.height+=1),d.trackerArgs=
Y(k)<3&&b$(d.shapeArgs,{height:6,y:j-3})})},getSymbol
:function(){},drawLegendSymbol:bT.prototype.drawLegendSymbol
,drawGraph:function(){},drawPoints:function(){var a=
this,b=a.options,c=a.chart.renderer,d,e;bW(a.points
,function(f){var g=f.plotY;g!==P&&!isNaN(g)&&f.y!==
null&&(d=f.graphic,e=f.shapeArgs,d?(ce(d),d.animate
(b$(e))):f.graphic=d=c[f.shapeType](e).attr(f.pointAttr
[f.selected?"select":""]).add(a.group).shadow(b.shadow
,null,b.stacking&&!b.borderRadius))})},drawTracker:
function(){var a=this,b=a.chart,c=b.renderer,d,e,f=+
(new Date),g=a.options,h=g.cursor,i=h&&{cursor:h},j=
a.drawTrackerGroup(),k,m,n;bW(a.points,function(h){
e=h.tracker,d=h.trackerArgs||h.shapeArgs,m=h.plotY,
n=!a.isCartesian||m!==P&&!isNaN(m),delete d.strokeWidth
,h.y!==null&&n&&(e?e.attr(d):h.tracker=c[h.shapeType
](d).attr({isTracker:f,fill:bw,visibility:a.visible?"visible"
:"hidden"}).on(bk?"touchstart":"mouseover",function(
c){k=c.relatedTarget||c.fromElement,b.hoverSeries!==
a&&l(k,"isTracker")!==f&&a.onMouseOver(),h.onMouseOver
()}).on("mouseout",function(b){!g.stickyTracking&&(
k=b.relatedTarget||b.toElement,l(k,"isTracker")!==f
)&&a.onMouseOut()}).css(i).add(h.group||j))})},animate
:function(a){var b=this,c=b.points,d=b.options;a||(
bW(c,function(a){var c=a.graphic,a=a.shapeArgs,e=b.
yAxis,f=d.threshold;c&&(c.attr({height:0,y:k(f)?e.getThreshold
(f):e.translate(e.getExtremes().min,0,1,0,1)}),c.animate
({height:a.height,y:a.y},d.animation))}),b.animate=
null)},remove:function(){var a=this,b=a.chart;b.hasRendered&&
bW(b.series,function(b){b.type===a.type&&(b.isDirty=!0
)}),cq.prototype.remove.apply(a,arguments)}}),bR.column=
cm,ci.bar=b$(ci.column,{dataLabels:{align:"left",x:5
,y:null,verticalAlign:"middle"}}),cr=q(cm,{type:"bar"
,inverted:!0}),bR.bar=cr,ci.scatter=b$(bS,{lineWidth
:0,states:{hover:{lineWidth:0}},tooltip:{headerFormat
:'{series.name}
'
,pointFormat:"x: {point.x}
y: {point.y}
"
}}),cr=q(cq,{type:"scatter",sorted:!1,translate:function(
){var a=this;cq.prototype.translate.apply(a),bW(a.points
,function(b){b.shapeType="circle",b.shapeArgs={x:b.
plotX,y:b.plotY,r:a.chart.options.tooltip.snap}})},
drawTracker:function(){for(var a=this,b=a.options.cursor
,b=b&&{cursor:b},c=a.points,d=c.length,e;d--;)if(e=
c[d].graphic)e.element._i=d;a._hasTracking?a._hasTracking=!0
:a.group.attr({isTracker:!0}).on(bk?"touchstart":"mouseover"
,function(b){a.onMouseOver(),b.target._i!==P&&c[b.target
._i].onMouseOver()}).on("mouseout",function(){a.options
.stickyTracking||a.onMouseOut()}).css(b)}}),bR.scatter=
cr,ci.pie=b$(bS,{borderColor:"#FFFFFF",borderWidth:1
,center:["50%","50%"],colorByPoint:!0,dataLabels:{distance
:30,enabled:!0,formatter:function(){return this.point
.name},y:5},legendType:"point",marker:null,size:"75%"
,showInLegend:!1,slicedOffset:10,states:{hover:{brightness
:.1,shadow:!1}}}),bS={type:"pie",isCartesian:!1,pointClass
:q(cp,{init:function(){cp.prototype.init.apply(this
,arguments);var b=this,c;return a(b,{visible:b.visible!==!1
,name:n(b.name,"Slice")}),c=function(){b.slice()},b_
(b,"select",c),b_(b,"unselect",c),b},setVisible:function(
a){var b=this.series.chart,c=this.tracker,d=this.dataLabel
,e=this.connector,f=this.shadowGroup,g;g=(this.visible=
a=a===P?!this.visible:a)?"show":"hide",this.group[g
](),c&&c[g](),d&&d[g](),e&&e[g](),f&&f[g](),this.legendItem&&
b.legend.colorizeItem(this,a)},slice:function(a,b,c
){var d=this.series.chart,e=this.slicedTranslation;
E(c,d),n(b,!0),a=this.sliced=k(a)?a:!this.sliced,a=
{translateX:a?e[0]:d.plotLeft,translateY:a?e[1]:d.plotTop
},this.group.animate(a),this.shadowGroup&&this.shadowGroup
.animate(a)}}),pointAttrToOptions:{stroke:"borderColor"
,"stroke-width":"borderWidth",fill:"color"},getColor
:function(){this.initialColor=this.chart.counters.color
},animate:function(){var a=this;bW(a.points,function(
b){var c=b.graphic,b=b.shapeArgs,d=-_/2;c&&(c.attr(
{r:0,start:d,end:d}),c.animate({r:b.r,start:b.start
,end:b.end},a.options.animation))}),a.animate=null}
,setData:function(a,b){cq.prototype.setData.call(this
,a,!1),this.processData(),this.generatePoints(),n(b
,!0)&&this.chart.redraw()},getCenter:function(){var a=
this.options,b=this.chart,d=b.plotWidth,e=b.plotHeight
,a=a.center.concat([a.size,a.innerSize||0]),f=X(d,e
),g;return bZ(a,function(a,b){return(g=/%$/.test(a)
)?[d,e,f,f][b]*c(a)/100:a})},translate:function(){this
.generatePoints();var a=0,b=-0.25,c=this.options,d=
c.slicedOffset,e=d+c.borderWidth,f,g=this.chart,h,i
,j,k=this.points,l=2*_,m,n,o,p=c.dataLabels.distance
;this.center=f=this.getCenter(),this.getX=function(
a,b){return j=S.asin((a-f[1])/(f[2]/2+p)),f[0]+(b?-1
:1)*Z(j)*(f[2]/2+p)},bW(k,function(b){a+=b.y}),bW(k
,function(c){m=a?c.y/a:0,h=T(b*l*1e3)/1e3,b+=m,i=T(
b*l*1e3)/1e3,c.shapeType="arc",c.shapeArgs={x:f[0],
y:f[1],r:f[2]/2,innerR:f[3]/2,start:h,end:i},j=(i+h
)/2,c.slicedTranslation=bZ([Z(j)*d+g.plotLeft,$(j)*
d+g.plotTop],T),n=Z(j)*f[2]/2,o=$(j)*f[2]/2,c.tooltipPos=
[f[0]+n*.7,f[1]+o*.7],c.labelPos=[f[0]+n+Z(j)*p,f[1
]+o+$(j)*p,f[0]+n+Z(j)*e,f[1]+o+$(j)*e,f[0]+n,f[1]+
o,p<0?"center":j0,p=[[],[]],q,r,s,t,u=2
,v;if(d.enabled){cq.prototype.drawDataLabels.apply(
this),bW(a,function(a){a.dataLabel&&p[a.labelPos[7]<
_/2?0:1].push(a)}),p[1].reverse(),t=function(a,b){return b
.y-a.y};for(a=p[0][0]&&p[0][0].dataLabel&&(p[0][0].
dataLabel.getBBox().height||21);u--;){var w=[],x=[]
,y=p[u],z=y.length,A;if(j>0){for(v=m-l-j;v<=m+l+j;v+=
a)w.push(v);s=w.length;if(z>s){h=[].concat(y),h.sort
(t);for(v=z;v--;)h[v].rank=v;for(v=z;v--;)y[v].rank>=
s&&y.splice(v,1);z=y.length}for(v=0;v0){if(r=x.pop(),A=r.i,r=r.y,
q>r&&w[A+1]!==null||q>>0;if(c===0)return-1;var d=0;arguments.
length>0&&(d=Number(arguments[1]),d!==d?d=0:d!==0&&
d!==Infinity&&d!==-Infinity&&(d=(d>0||-1)*Math.floor
(Math.abs(d))));if(d>=c)return-1;var e=d>=0?d:Math.
max(c-Math.abs(d),0);for(;e0
)g=a.shift(),f=f[g];if(!f){if(I18n.fallbacks){var h=
this.getFallbacks(e);for(var i=0;i11?1:0,k=a.getSeconds(),l=a.getMinutes(),
m=a.getTimezoneOffset(),n=Math.floor(Math.abs(m/60)
),o=Math.abs(m)-n*60,p=(m>0?"-":"+")+(n.toString().
length<2?"0"+n:n)+(o.toString().length<2?"0"+o:o);i>12?
i-=12:i===0&&(i=12);var q=function(a){var b="0"+a.toString
();return b.substr(b.length-2)},r=b;return r=r.replace
("%a",c.abbr_day_names[d]),r=r.replace("%A",c.day_names
[d]),r=r.replace("%b",c.abbr_month_names[g]),r=r.replace
("%B",c.month_names[g]),r=r.replace("%d",q(e)),r=r.
replace("%e",e),r=r.replace("%-d",e),r=r.replace("%H"
,q(h)),r=r.replace("%-H",h),r=r.replace("%I",q(i)),
r=r.replace("%-I",i),r=r.replace("%m",q(g)),r=r.replace
("%-m",g),r=r.replace("%M",q(l)),r=r.replace("%-M",
l),r=r.replace("%p",c.meridian[j]),r=r.replace("%S"
,q(k)),r=r.replace("%-S",k),r=r.replace("%w",d),r=r
.replace("%y",q(f)),r=r.replace("%-y",q(f).replace(/^0+/
,"")),r=r.replace("%Y",f),r=r.replace("%z",p),r},I18n
.toNumber=function(a,b){b=this.prepareOptions(b,this
.lookup("number.format"),{precision:3,separator:"."
,delimiter:",",strip_insignificant_zeros:!1});var c=
a<0,d=Math.abs(a).toFixed(b.precision).toString(),e=
d.split("."),f,g=[],h;a=e[0],f=e[1];while(a.length>0
)g.unshift(a.substr(Math.max(0,a.length-3),3)),a=a.
substr(0,a.length-3);h=g.join(b.delimiter),b.precision>0&&
(h+=b.separator+e[1]),c&&(h="-"+h);if(b.strip_insignificant_zeros
){var i={separator:new RegExp(b.separator.replace(/\./
,"\\.")+"$"),zeros:/0+$/};h=h.replace(i.zeros,"").replace
(i.separator,"")}return h},I18n.toCurrency=function(
a,b){return b=this.prepareOptions(b,this.lookup("number.currency.format"
),this.lookup("number.format"),{unit:"$",precision:2
,format:"%u%n",delimiter:",",separator:"."}),a=this
.toNumber(a,b),a=b.format.replace("%u",b.unit).replace
("%n",a),a},I18n.toHumanSize=function(a,b){var c=1024
,d=a,e=0,f,g;while(d>=c&&e<4)d/=c,e+=1;return e===0?
(f=this.t("number.human.storage_units.units.byte",{
count:d}),g=0):(f=this.t("number.human.storage_units.units."+
[null,"kb","mb","gb","tb"][e]),g=d-Math.floor(d)===0?0
:1),b=this.prepareOptions(b,{precision:g,format:"%n%u"
,delimiter:""}),a=this.toNumber(d,b),a=b.format.replace
("%u",f).replace("%n",a),a},I18n.toPercentage=function(
a,b){return b=this.prepareOptions(b,this.lookup("number.percentage.format"
),this.lookup("number.format"),{precision:3,separator
:".",delimiter:""}),a=this.toNumber(a,b),a+"%"},I18n
.pluralizer=function(a){return pluralizer=this.pluralizationRules
[a],pluralizer!==undefined?pluralizer:this.pluralizationRules
.en},I18n.findAndTranslateValidNode=function(a,b){for(
i=0;i "+a),w.emit("state_change"
,{previous:d,current:a}),w.emit(a,b))}var w=this;c.
EventsDispatcher.call(this),this.options=c.Util.extend
({encrypted:!1},k),this.netInfo=new c.NetInfo,this.
netInfo.bind("online",function(){w._machine.is("waiting"
)&&(w._machine.transition("connecting"),v("connecting"
))}),this.netInfo.bind("offline",function(){w._machine
.is("connected")&&(w.socket.onclose=void 0,w.socket
.onmessage=void 0,w.socket.onerror=void 0,w.socket.
onopen=void 0,w.socket.close(),w.socket=void 0,w._machine
.transition("waiting"))}),this._machine=new c.Machine
("initialized",d,{initializedPre:function(){w.compulsorySecure=
w.options.encrypted,w.key=b,w.socket=null,w.socket_id=
null,w.state="initialized"},waitingPre:function(){w
.connectionWait>0&&w.emit("connecting_in",w.connectionWait
),w.netInfo.isOnLine()&&w.connectionAttempts<=4?v("connecting"
):v("unavailable"),w.netInfo.isOnLine()&&(w._waitingTimer=
setTimeout(function(){w._machine.transition("connecting"
)},o()))},waitingExit:function(){clearTimeout(w._waitingTimer
)},connectingPre:function(){if(w.netInfo.isOnLine()===!1
)w._machine.transition("waiting"),v("unavailable");
else{var a;a=c.ws_port;var b="ws://";if(w.connectionSecure||
document.location.protocol==="https:")a=c.wss_port,
b="wss://";a=b+c.host+":"+a+"/app/"+w.key+"?protocol=5&client=js&version="+
c.VERSION+"&flash="+(c.TransportType==="flash"?"true"
:"false"),c.debug("Connecting",a),w.socket=new c.Transport
(a),w.socket.onopen=p,w.socket.onclose=t,w.socket.onerror=
u,w._connectingTimer=setTimeout(m,w.openTimeout)}},
connectingExit:function(){clearTimeout(w._connectingTimer
),w.socket.onopen=void 0},connectingToWaiting:function(
){l()},connectingToImpermanentlyClosing:function(){
l()},openPre:function(){w.socket.onmessage=q,w.socket
.onerror=u,w.socket.onclose=t,w._openTimer=setTimeout
(m,w.connectedTimeout)},openExit:function(){clearTimeout
(w._openTimer),w.socket.onmessage=void 0},openToWaiting
:function(){l()},openToImpermanentlyClosing:function(
){l()},connectedPre:function(b){w.socket_id=b,w.socket
.onmessage=r,w.socket.onerror=u,w.socket.onclose=t,
a(w),w.connectedAt=(new Date).getTime(),n()},connectedPost
:function(){v("connected")},connectedExit:function(
){w._activityTimer&&clearTimeout(w._activityTimer),
v("disconnected")},impermanentlyClosingPost:function(
){w.socket&&(w.socket.onclose=t,w.socket.close())},
permanentlyClosingPost:function(){w.socket?(w.socket
.onclose=function(){a(w),w._machine.transition("permanentlyClosed"
)},w.socket.close()):(a(w),w._machine.transition("permanentlyClosed"
))},failedPre:function(){v("failed"),c.debug("WebSockets are not available in this browser."
)},permanentlyClosedPost:function(){v("disconnected"
)}})}var c=this.Pusher,d={initialized:["waiting","failed"
],waiting:["connecting","permanentlyClosed"],connecting
:["open","permanentlyClosing","impermanentlyClosing"
,"waiting"],open:["connected","permanentlyClosing","impermanentlyClosing"
,"waiting"],connected:["permanentlyClosing","waiting"
],impermanentlyClosing:["waiting","permanentlyClosing"
],permanentlyClosing:["permanentlyClosed"],permanentlyClosed
:["waiting","failed"],failed:["permanentlyClosed"]}
,e=2e3,f=2e3,g=2e3,h=5*e,i=5*f,j=5*g;b.prototype.connect=
function(){!this._machine.is("failed")&&!c.Transport?
this._machine.transition("failed"):this._machine.is
("initialized")?(a(this),this._machine.transition("waiting"
)):this._machine.is("waiting")&&this.netInfo.isOnLine
()===!0?this._machine.transition("connecting"):this
._machine.is("permanentlyClosed")&&(a(this),this._machine
.transition("waiting"))},b.prototype.send=function(
a){if(this._machine.is("connected")){var b=this;return setTimeout
(function(){b.socket.send(a)},0),!0}return!1},b.prototype
.send_event=function(a,b,d){return a={event:a,data:
b},d&&(a.channel=d),c.debug("Event sent",a),this.send
(JSON.stringify(a))},b.prototype.disconnect=function(
){this._machine.is("permanentlyClosed")||(this._machine
.is("waiting")||this._machine.is("failed")?this._machine
.transition("permanentlyClosed"):this._machine.transition
("permanentlyClosing"))},c.Util.extend(b.prototype,
c.EventsDispatcher.prototype),this.Pusher.Connection=
b}.call(this),function(){Pusher.Channels=function()
{this.channels={}},Pusher.Channels.prototype={add:function(
a,b){var c=this.find(a);return c||(c=Pusher.Channel
.factory(a,b),this.channels[a]=c),c},find:function(
a){return this.channels[a]},remove:function(a){delete
this.channels[a]},disconnect:function(){for(var a in
this.channels)this.channels[a].disconnect()}},Pusher
.Channel=function(a,b){var c=this;Pusher.EventsDispatcher
.call(this,function(b){Pusher.debug("No callbacks on "+
a+" for "+b)}),this.pusher=b,this.name=a,this.subscribed=!1
,this.bind("pusher_internal:subscription_succeeded"
,function(a){c.onSubscriptionSucceeded(a)})},Pusher
.Channel.prototype={init:function(){},disconnect:function(
){this.subscribed=!1,this.emit("pusher_internal:disconnected"
)},onSubscriptionSucceeded:function(){this.subscribed=!0
,this.emit("pusher:subscription_succeeded")},authorize
:function(a,b,c){return c(!1,{})},trigger:function(
a,b){return this.pusher.send_event(a,b,this.name)}}
,Pusher.Util.extend(Pusher.Channel.prototype,Pusher
.EventsDispatcher.prototype),Pusher.Channel.PrivateChannel=
{authorize:function(a,b,c){var d=this;return(new Pusher
.Channel.Authorizer(this,Pusher.channel_auth_transport
,b)).authorize(a,function(a,b){a||d.emit("pusher_internal:authorized"
,b),c(a,b)})}},Pusher.Channel.PresenceChannel={init
:function(){this.members=new a(this)},onSubscriptionSucceeded
:function(){this.subscribed=!0}};var a=function(a){
var b=this,c=function(){this._members_map={},this.count=0
,this.me=null};c.call(this),a.bind("pusher_internal:authorized"
,function(c){var d=JSON.parse(c.channel_data);a.bind
("pusher_internal:subscription_succeeded",function(
c){b._members_map=c.presence.hash,b.count=c.presence
.count,b.me=b.get(d.user_id),a.emit("pusher:subscription_succeeded"
,b)})}),a.bind("pusher_internal:member_added",function(
c){b.get(c.user_id)===null&&b.count++,b._members_map
[c.user_id]=c.user_info,a.emit("pusher:member_added"
,b.get(c.user_id))}),a.bind("pusher_internal:member_removed"
,function(c){var d=b.get(c.user_id);d&&(delete b._members_map
[c.user_id],b.count--,a.emit("pusher:member_removed"
,d))}),a.bind("pusher_internal:disconnected",function(
){c.call(b)})};a.prototype={each:function(a){for(var b in
this._members_map)a(this.get(b))},get:function(a){return this
._members_map.hasOwnProperty(a)?{id:a,info:this._members_map
[a]}:null}},Pusher.Channel.factory=function(a,b){var c=new
Pusher.Channel(a,b);return a.indexOf("private-")===0?
Pusher.Util.extend(c,Pusher.Channel.PrivateChannel)
:a.indexOf("presence-")===0&&(Pusher.Util.extend(c,
Pusher.Channel.PrivateChannel),Pusher.Util.extend(c
,Pusher.Channel.PresenceChannel)),c.init(),c}}.call
(this),function(){Pusher.Channel.Authorizer=function(
a,b,c){this.channel=a,this.type=b,this.authOptions=
(c||{}).auth||{}},Pusher.Channel.Authorizer.prototype=
{composeQuery:function(a){var a="&socket_id="+encodeURIComponent
(a)+"&channel_name="+encodeURIComponent(this.channel
.name),b;for(b in this.authOptions.params)a+="&"+encodeURIComponent
(b)+"="+encodeURIComponent(this.authOptions.params[
b]);return a},authorize:function(a,b){return Pusher
.authorizers[this.type].call(this,a,b)}},Pusher.auth_callbacks=
{},Pusher.authorizers={ajax:function(a,b){var c;c=Pusher
.XHR?new Pusher.XHR:window.XMLHttpRequest?new window
.XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP"
),c.open("POST",Pusher.channel_auth_endpoint,!0),c.
setRequestHeader("Content-Type","application/x-www-form-urlencoded"
);for(var d in this.authOptions.headers)c.setRequestHeader
(d,this.authOptions.headers[d]);return c.onreadystatechange=
function(){if(c.readyState==4)if(c.status==200){var a
,d=!1;try{a=JSON.parse(c.responseText),d=!0}catch(e
){b(!0,"JSON returned from webapp was invalid, yet status code was 200. Data was: "+
c.responseText)}d&&b(!1,a)}else Pusher.warn("Couldn't get auth info from your webapp"
,c.status),b(!0,c.status)},c.send(this.composeQuery
(a)),c},jsonp:function(a,b){this.authOptions.headers!==void 0&&
Pusher.warn("Warn","To send headers with the auth request, you must use AJAX, rather than JSONP."
);var c=document.createElement("script");Pusher.auth_callbacks
[this.channel.name]=function(a){b(!1,a)},c.src=Pusher
.channel_auth_endpoint+"?callback="+encodeURIComponent
("Pusher.auth_callbacks['"+this.channel.name+"']")+
this.composeQuery(a);var d=document.getElementsByTagName
("head")[0]||document.documentElement;d.insertBefore
(c,d.firstChild)}}}.call(this);var _require=function(
){function a(a,b){document.addEventListener?a.addEventListener
("load",b,!1):a.attachEvent("onreadystatechange",function(
){(a.readyState=="loaded"||a.readyState=="complete"
)&&b()})}function b(b,c){var d=document.getElementsByTagName
("head")[0],e=document.createElement("script");e.setAttribute
("src",b),e.setAttribute("type","text/javascript"),
e.setAttribute("async",!0),a(e,function(){c()}),d.appendChild
(e)}return function(a,c){for(var d=0,e=0;e0?_require(b,e):e()})();minispade.register("app","(function() {(function() {\nminispade.require('travis');\nminispade.require('auth');\nminispade.require('controllers');\nminispade.require('helpers');\nminispade.require('models');\nminispade.require('pusher');\nminispade.require('routes');\nminispade.require('slider');\nminispade.require('store');\nminispade.require('tailing');\nminispade.require('templates');\nminispade.require('views');\nminispade.require('config/locales');\nminispade.require('data/sponsors');\n\n Travis.reopen({\n App: Em.Application.extend({\n autoinit: false,\n currentUserBinding: 'auth.user',\n authStateBinding: 'auth.state',\n init: function() {\n this._super.apply(this, arguments);\n this.store = Travis.Store.create();\n this.store.loadMany(Travis.Sponsor, Travis.SPONSORS);\n this.set('auth', Travis.Auth.create({\n store: this.store,\n endpoint: Travis.config.api_endpoint\n }));\n this.slider = new Travis.Slider();\n this.pusher = new Travis.Pusher(Travis.config.pusher);\n return this.tailing = new Travis.Tailing();\n },\n signIn: function() {\n return this.get('auth').signIn();\n },\n signOut: function() {\n this.get('auth').signOut();\n return this.get('router').send('showAuthenticated');\n },\n receive: function() {\n return this.store.receive.apply(this.store, arguments);\n },\n toggleSidebar: function() {\n var element;\n $('body').toggleClass('maximized');\n element = $('');\n $('#top .profile').append(element);\n Em.run.later((function() {\n return element.remove();\n }), 10);\n element = $('');\n $('#repository').append(element);\n return Em.run.later((function() {\n return element.remove();\n }), 10);\n }\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=app"
),minispade.register("auth","(function() {(function() {\n\n this.Travis.Auth = Ember.Object.extend({\n iframe: $('').hide(),\n timeout: 5000,\n state: 'signed-out',\n receivingEnd: \"\" + location.protocol + \"//\" + location.host,\n init: function() {\n var _this = this;\n this.iframe.appendTo('body');\n window.addEventListener('message', function(e) {\n return _this.receiveMessage(e);\n });\n return this.loadUser();\n },\n accessToken: (function() {\n return sessionStorage.getItem('travis.token');\n }).property(),\n loadUser: function() {\n var user;\n if (user = typeof sessionStorage !== \"undefined\" && sessionStorage !== null ? sessionStorage.getItem('travis.user') : void 0) {\n return this.setData({\n user: JSON.parse(user)\n });\n } else if (typeof localStorage !== \"undefined\" && localStorage !== null ? localStorage.getItem('travis.auto_signin') : void 0) {\n return this.trySignIn();\n }\n },\n signIn: function() {\n this.set('state', 'signing-in');\n this.trySignIn();\n return Ember.run.later(this, this.checkSignIn.bind(this), this.timeout);\n },\n trySignIn: function() {\n return this.iframe.attr('src', \"\" + this.endpoint + \"/auth/post_message?origin=\" + this.receivingEnd);\n },\n checkSignIn: function() {\n if (this.get('state') === 'signing-in') {\n return this.forceSignIn();\n }\n },\n forceSignIn: function() {\n if (typeof localStorage !== \"undefined\" && localStorage !== null) {\n localStorage.setItem('travis.auto_signin', 'true');\n }\n return window.location = \"\" + this.endpoint + \"/auth/handshake?redirect_uri=\" + location;\n },\n signOut: function() {\n if (typeof localStorage !== \"undefined\" && localStorage !== null) {\n localStorage.clear();\n }\n if (typeof sessionStorage !== \"undefined\" && sessionStorage !== null) {\n sessionStorage.clear();\n }\n return this.setData();\n },\n setData: function(data) {\n var user;\n if (typeof data === 'string') {\n data = JSON.parse(data);\n }\n if (data != null ? data.token : void 0) {\n this.storeToken(data.token);\n }\n if (data != null ? data.user : void 0) {\n user = this.storeUser(data.user);\n }\n this.set('state', user ? 'signed-in' : 'signed-out');\n return this.set('user', user ? user : void 0);\n },\n storeToken: function(token) {\n if (typeof sessionStorage !== \"undefined\" && sessionStorage !== null) {\n sessionStorage.setItem('travis.token', token);\n }\n return this.notifyPropertyChange('accessToken');\n },\n storeUser: function(user) {\n if (typeof localStorage !== \"undefined\" && localStorage !== null) {\n localStorage.setItem('travis.auto_signin', 'true');\n }\n if (typeof sessionStorage !== \"undefined\" && sessionStorage !== null) {\n sessionStorage.setItem('travis.user', JSON.stringify(user));\n }\n this.store.load(Travis.User, user);\n return this.store.find(Travis.User, user.id);\n },\n receiveMessage: function(event) {\n if (event.origin === this.expectedOrigin()) {\n this.setData(event.data);\n return console.log(\"signed in as \" + event.data.user.login);\n } else {\n return console.log(\"unexpected message \" + event.origin + \": \" + event.data);\n }\n },\n expectedOrigin: function() {\n if (this.endpoint[0] === '/') {\n return this.receivingEnd;\n } else {\n return this.endpoint;\n }\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=auth"
),minispade.register("controllers","(function() {(function() {\nminispade.require('helpers');\nminispade.require('travis/ticker');\n\n Travis.reopen({\n Controller: Em.Controller.extend({\n connectOutlet: function() {\n var view, _connectedOutletViews;\n view = this._super.apply(this, arguments);\n if (view) {\n _connectedOutletViews = Travis.app.get('_connectedOutletViews');\n if (!_connectedOutletViews) {\n _connectedOutletViews = [];\n }\n _connectedOutletViews.pushObject(view);\n Travis.app.set('_connectedOutletViews', _connectedOutletViews);\n }\n return view;\n }\n }),\n TopController: Em.Controller.extend({\n userBinding: 'Travis.app.currentUser'\n }),\n ApplicationController: Em.Controller.extend(),\n MainController: Em.Controller.extend(),\n StatsLayoutController: Em.Controller.extend(),\n ProfileLayoutController: Em.Controller.extend()\n });\nminispade.require('controllers/accounts');\nminispade.require('controllers/builds');\nminispade.require('controllers/home');\nminispade.require('controllers/profile');\nminispade.require('controllers/repositories');\nminispade.require('controllers/repository');\nminispade.require('controllers/sidebar');\nminispade.require('controllers/stats');\n\n}).call(this);\n\n})();\n//@ sourceURL=controllers"
),minispade.register("controllers/accounts","(function() {(function() {\n\n Travis.AccountsController = Ember.ArrayController.extend({\n tab: 'accounts',\n init: function() {\n return this._super();\n },\n findByLogin: function(login) {\n return this.find(function(account) {\n return account.get('login') === 'login';\n });\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=controllers/accounts"
),minispade.register("controllers/builds","(function() {(function() {\n\n Travis.BuildsController = Em.ArrayController.extend({\n repositoryBinding: 'parent.repository',\n contentBinding: 'parent.builds'\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=controllers/builds"
),minispade.register("controllers/home","(function() {(function() {\n\n Travis.HomeController = Travis.Controller.extend();\n\n}).call(this);\n\n})();\n//@ sourceURL=controllers/home"
),minispade.register("controllers/job","(function() {(function() {\n\n\n\n}).call(this);\n\n})();\n//@ sourceURL=controllers/job"
),minispade.register("controllers/profile","(function() {(function() {\n\n Travis.ProfileController = Travis.Controller.extend({\n name: 'profile',\n userBinding: 'Travis.app.currentUser',\n accountsBinding: 'Travis.app.router.accountsController',\n account: (function() {\n var login;\n login = this.get('params.login') || Travis.app.get('currentUser.login');\n return this.get('accounts').filter(function(account) {\n if (account.get('login') === login) {\n return account;\n }\n })[0];\n }).property('accounts.length', 'params.login'),\n activate: function(action, params) {\n this.setParams(params || this.get('params'));\n return this[\"view\" + ($.camelize(action))]();\n },\n viewHooks: function() {\n this.connectTab('hooks');\n return this.set('hooks', Travis.Hook.find({\n owner_name: this.get('params.login') || Travis.app.get('currentUser.login')\n }));\n },\n viewUser: function() {\n return this.connectTab('user');\n },\n connectTab: function(tab) {\n var viewClass;\n viewClass = Travis[\"\" + ($.camelize(tab)) + \"View\"];\n this.set('tab', tab);\n return this.connectOutlet({\n outletName: 'pane',\n controller: this,\n viewClass: viewClass\n });\n },\n setParams: function(params) {\n var key, value, _results;\n this.set('params', {});\n _results = [];\n for (key in params) {\n value = params[key];\n _results.push(this.set(\"params.\" + key, params[key]));\n }\n return _results;\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=controllers/profile"
),minispade.register("controllers/repositories","(function() {(function() {\n\n Travis.RepositoriesController = Ember.ArrayController.extend({\n defaultTab: 'recent',\n sortProperties: ['sortOrder'],\n init: function() {\n this.activate(this.defaultTab);\n return Ember.run.later(this.updateTimes.bind(this), Travis.INTERVALS.updateTimes);\n },\n updateTimes: function() {\n var content;\n if (content = this.get('content')) {\n content.forEach(function(r) {\n return r.updateTimes();\n });\n }\n return Ember.run.later(this.updateTimes.bind(this), Travis.INTERVALS.updateTimes);\n },\n activate: function(tab, params) {\n this.set('tab', tab);\n return this[\"view\" + ($.camelize(tab))](params);\n },\n viewRecent: function() {\n return this.set('content', Travis.Repository.find());\n },\n viewOwned: function() {\n return this.set('content', Travis.Repository.ownedBy(Travis.app.get('currentUser.login')));\n },\n viewSearch: function(params) {\n return this.set('content', Travis.Repository.search(params.search));\n },\n searchObserver: (function() {\n var search, tab;\n search = this.get('search');\n tab = search ? 'search' : 'recent';\n return this.activate(tab, {\n search: search\n });\n }).observes('search')\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=controllers/repositories"
),minispade.register("controllers/repository","(function() {(function() {\n\n Travis.RepositoryController = Travis.Controller.extend({\n bindings: [],\n init: function() {\n this._super.apply(this, arguments);\n return Ember.run.later(this.updateTimes.bind(this), Travis.INTERVALS.updateTimes);\n },\n updateTimes: function() {\n var build, builds;\n if (builds = this.get('builds')) {\n builds.forEach(function(b) {\n return b.updateTimes();\n });\n }\n if (build = this.get('build')) {\n build.updateTimes();\n build.get('jobs').forEach(function(j) {\n return j.updateTimes();\n });\n }\n return Ember.run.later(this.updateTimes.bind(this), Travis.INTERVALS.updateTimes);\n },\n activate: function(action) {\n this._unbind();\n return this[\"view\" + ($.camelize(action))]();\n },\n viewIndex: function() {\n this._bind('repository', 'controllers.repositoriesController.firstObject');\n this._bind('build', 'repository.lastBuild');\n return this.connectTab('current');\n },\n viewCurrent: function() {\n this.connectTab('current');\n return this._bind('build', 'repository.lastBuild');\n },\n viewBuilds: function() {\n this.connectTab('builds');\n return this._bind('builds', 'repository.builds');\n },\n viewPullRequests: function() {\n this.connectTab('pull_requests');\n return this._bind('builds', 'repository.pullRequests');\n },\n viewBranches: function() {\n this.connectTab('branches');\n return this._bind('builds', 'repository.branches');\n },\n viewBuild: function() {\n return this.connectTab('build');\n },\n viewJob: function() {\n this._bind('build', 'job.build');\n return this.connectTab('job');\n },\n repositoryObserver: (function() {\n var repository;\n repository = this.get('repository');\n if (repository) {\n return repository.select();\n }\n }).observes('repository.id'),\n connectTab: function(tab) {\n var name, viewClass;\n name = tab === 'current' ? 'build' : tab;\n viewClass = name === 'builds' || name === 'branches' || name === 'pull_requests' ? Travis.BuildsView : Travis[\"\" + ($.camelize(name)) + \"View\"];\n this.set('tab', tab);\n return this.connectOutlet({\n outletName: 'pane',\n controller: this,\n viewClass: viewClass\n });\n },\n _bind: function(to, from) {\n return this.bindings.push(Ember.oneWay(this, to, from));\n },\n _unbind: function() {\n var binding, _i, _len, _ref;\n _ref = this.bindings;\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n binding = _ref[_i];\n binding.disconnect(this);\n }\n return this.bindings.length = 0;\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=controllers/repository"
),minispade.register("controllers/sidebar","(function() {(function() {\n\n Travis.reopen({\n SidebarController: Em.ArrayController.extend({\n init: function() {\n this.tickables = [];\n return Travis.Ticker.create({\n target: this,\n interval: Travis.INTERVALS.sponsors\n });\n },\n tick: function() {\n var tickable, _i, _len, _ref, _results;\n _ref = this.tickables;\n _results = [];\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n tickable = _ref[_i];\n _results.push(tickable.tick());\n }\n return _results;\n }\n }),\n QueuesController: Em.ArrayController.extend(),\n WorkersController: Em.ArrayController.extend({\n groups: (function() {\n var content, groups, host, worker, _i, _len, _ref;\n if (content = this.get('content')) {\n groups = {};\n _ref = content.toArray();\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n worker = _ref[_i];\n host = worker.get('host');\n if (!groups[host]) {\n groups[host] = Em.ArrayProxy.create({\n content: []\n });\n }\n groups[host].pushObject(worker);\n }\n return $.values(groups);\n }\n }).property('content.length')\n }),\n SponsorsController: Em.ArrayController.extend({\n page: 0,\n arrangedContent: (function() {\n return this.get('shuffled').slice(this.start(), this.end());\n }).property('shuffled.length', 'page'),\n shuffled: (function() {\n var content;\n if (content = this.get('content')) {\n return $.shuffle(content);\n } else {\n return [];\n }\n }).property('content.length'),\n tick: function() {\n return this.set('page', this.isLast() ? 0 : this.get('page') + 1);\n },\n pages: (function() {\n var length;\n length = this.get('content.length');\n if (length) {\n return parseInt(length / this.get('perPage') + 1);\n } else {\n return 1;\n }\n }).property('length'),\n isLast: function() {\n return this.get('page') === this.get('pages') - 1;\n },\n start: function() {\n return this.get('page') * this.get('perPage');\n },\n end: function() {\n return this.start() + this.get('perPage');\n }\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=controllers/sidebar"
),minispade.register("controllers/stats","(function() {(function() {\n\n Travis.StatsController = Travis.Controller.extend({\n name: 'stats',\n init: function() {\n return this._super('top');\n },\n activate: function(action, params) {}\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=controllers/stats"
),minispade.register("helpers","(function() {(function() {\nminispade.require('helpers/handlebars');\nminispade.require('helpers/helpers');\nminispade.require('helpers/urls');\n\n}).call(this);\n\n})();\n//@ sourceURL=helpers"
),minispade.register("helpers/handlebars","(function() {(function() {\n var safe;\nminispade.require('ext/ember/bound_helper');\n\n safe = function(string) {\n return new Handlebars.SafeString(string);\n };\n\n Handlebars.registerHelper('tipsy', function(text, tip) {\n return safe('' + text + '');\n });\n\n Handlebars.registerHelper('t', function(key) {\n return safe(I18n.t(key));\n });\n\n Ember.registerBoundHelper('formatTime', function(value, options) {\n return safe(Travis.Helpers.timeAgoInWords(value) || '-');\n });\n\n Ember.registerBoundHelper('formatDuration', function(duration, options) {\n return safe(Travis.Helpers.timeInWords(duration));\n });\n\n Ember.registerBoundHelper('formatCommit', function(commit, options) {\n if (commit) {\n return safe(Travis.Helpers.formatCommit(commit.get('sha'), commit.get('branch')));\n }\n });\n\n Ember.registerBoundHelper('formatSha', function(sha, options) {\n return safe(Travis.Helpers.formatSha(sha));\n });\n\n Ember.registerBoundHelper('pathFrom', function(url, options) {\n return safe(Travis.Helpers.pathFrom(url));\n });\n\n Ember.registerBoundHelper('formatMessage', function(message, options) {\n return safe(Travis.Helpers.formatMessage(message, options));\n });\n\n Ember.registerBoundHelper('formatConfig', function(config, options) {\n return safe(Travis.Helpers.formatConfig(config));\n });\n\n Ember.registerBoundHelper('formatLog', function(log, options) {\n return Travis.Helpers.formatLog(log) || '';\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=helpers/handlebars"
),minispade.register("helpers/helpers","(function() {(function() {\nminispade.require('travis/log');\nminispade.require('emoij');\n\n this.Travis.Helpers = {\n compact: function(object) {\n var key, result, value, _ref;\n result = {};\n _ref = object || {};\n for (key in _ref) {\n value = _ref[key];\n if (!$.isEmpty(value)) {\n result[key] = value;\n }\n }\n return result;\n },\n safe: function(string) {\n return new Handlebars.SafeString(string);\n },\n colorForResult: function(result) {\n if (result === 0) {\n return 'green';\n } else {\n if (result === 1) {\n return 'red';\n } else {\n return null;\n }\n }\n },\n formatCommit: function(sha, branch) {\n return Travis.Helpers.formatSha(sha) + (branch ? \" (\" + branch + \")\" : '');\n },\n formatSha: function(sha) {\n return (sha || '').substr(0, 7);\n },\n formatConfig: function(config) {\n var values;\n config = $.only(config, 'rvm', 'gemfile', 'env', 'otp_release', 'php', 'node_js', 'scala', 'jdk', 'python', 'perl');\n values = $.map(config, function(value, key) {\n value = (value && value.join ? value.join(', ') : value) || '';\n return '%@: %@'.fmt($.camelize(key), value);\n });\n if (values.length === 0) {\n return '-';\n } else {\n return values.join(', ');\n }\n },\n formatMessage: function(message, options) {\n message = message || '';\n if (options.short) {\n message = message.split(/\\n/)[0];\n }\n return this._emojize(this._escape(message)).replace(/\\n/g, '
');\n },\n formatLog: function(log) {\n return Travis.Log.filter(log);\n },\n pathFrom: function(url) {\n return (url || '').split('/').pop();\n },\n timeAgoInWords: function(date) {\n return $.timeago.distanceInWords(date);\n },\n durationFrom: function(started, finished) {\n started = started && this._toUtc(new Date(this._normalizeDateString(started)));\n finished = finished ? this._toUtc(new Date(this._normalizeDateString(finished))) : this._nowUtc();\n if (started && finished) {\n return Math.round((finished - started) / 1000);\n } else {\n return 0;\n }\n },\n timeInWords: function(duration) {\n var days, hours, minutes, result, seconds;\n days = Math.floor(duration / 86400);\n hours = Math.floor(duration % 86400 / 3600);\n minutes = Math.floor(duration % 3600 / 60);\n seconds = duration % 60;\n if (days > 0) {\n return 'more than 24 hrs';\n } else {\n result = [];\n if (hours === 1) {\n result.push(hours + ' hr');\n }\n if (hours > 1) {\n result.push(hours + ' hrs');\n }\n if (minutes > 0) {\n result.push(minutes + ' min');\n }\n if (seconds > 0) {\n result.push(seconds + ' sec');\n }\n if (result.length > 0) {\n return result.join(' ');\n } else {\n return '-';\n }\n }\n },\n _normalizeDateString: function(string) {\n if (window.JHW) {\n string = string.replace('T', ' ').replace(/-/g, '/');\n string = string.replace('Z', '').replace(/\\..*$/, '');\n }\n return string;\n },\n _nowUtc: function() {\n return this._toUtc(new Date());\n },\n _toUtc: function(date) {\n return Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n },\n _emojize: function(text) {\n var emojis;\n emojis = text.match(/:\\S+?:/g);\n if (emojis !== null) {\n $.each(emojis.uniq(), function(ix, emoji) {\n var image, strippedEmoji;\n strippedEmoji = emoji.substring(1, emoji.length - 1);\n if (EmojiDictionary.indexOf(strippedEmoji) !== -1) {\n image = '
';\n return text = text.replace(new RegExp(emoji, 'g'), image);\n }\n });\n }\n return text;\n },\n _escape: function(text) {\n return text.replace(/&/g, '&').replace(//g, '>');\n }\n };\n\n}).call(this);\n\n})();\n//@ sourceURL=helpers/helpers"
),minispade.register("helpers/urls",'(function() {(function() {\n\n this.Travis.Urls = {\n repository: function(slug) {\n return "/" + slug;\n },\n builds: function(slug) {\n return "/" + slug + "/builds";\n },\n pullRequests: function(slug) {\n return "/" + slug + "/pull_requests";\n },\n branches: function(slug) {\n return "/" + slug + "/branches";\n },\n build: function(slug, id) {\n return "/" + slug + "/builds/" + id;\n },\n job: function(slug, id) {\n return "/" + slug + "/jobs/" + id;\n },\n githubCommit: function(slug, sha) {\n return "http://github.com/" + slug + "/commit/" + sha;\n },\n githubRepository: function(slug) {\n return "http://github.com/" + slug;\n },\n githubWatchers: function(slug) {\n return "http://github.com/" + slug + "/watchers";\n },\n githubNetwork: function(slug) {\n return "http://github.com/" + slug + "/network";\n },\n githubAdmin: function(slug) {\n return "http://github.com/" + slug + "/admin/hooks#travis_minibucket";\n },\n statusImage: function(slug, branch) {\n return ("https://secure.travis-ci.org/" + slug + ".png") + (branch ? "?branch=" + branch : \'\');\n },\n email: function(email) {\n return "mailto:" + email;\n },\n account: function(login) {\n return "/profile/" + login;\n },\n user: function(login) {\n return "/profile/" + login + "/me";\n }\n };\n\n}).call(this);\n\n})();\n//@ sourceURL=helpers/urls'
),minispade.register("models","(function() {(function() {\nminispade.require('models/extensions');\nminispade.require('models/account');\nminispade.require('models/artifact');\nminispade.require('models/branch');\nminispade.require('models/build');\nminispade.require('models/commit');\nminispade.require('models/hook');\nminispade.require('models/job');\nminispade.require('models/repository');\nminispade.require('models/sponsor');\nminispade.require('models/user');\nminispade.require('models/worker');\n\n}).call(this);\n\n})();\n//@ sourceURL=models"
),minispade.register("models/account","(function() {(function() {\nminispade.require('travis/model');\n\n this.Travis.Account = Travis.Model.extend({\n primaryKey: 'login',\n login: DS.attr('string'),\n name: DS.attr('string'),\n type: DS.attr('string'),\n reposCount: DS.attr('number'),\n urlGithub: (function() {\n return \"http://github.com/\" + (this.get('login'));\n }).property()\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=models/account"
),minispade.register("models/artifact","(function() {(function() {\nminispade.require('travis/model');\n\n this.Travis.Artifact = Travis.Model.extend({\n body: DS.attr('string'),\n init: function() {\n this._super.apply(this, arguments);\n return this.set('queue', Ember.A([]));\n },\n append: function(body) {\n if (this.get('isLoaded')) {\n return this.set('body', this.get('body') + body);\n } else {\n return this.get('queue').pushObject(body);\n }\n },\n recordDidLoad: (function() {\n var queue;\n if (this.get('isLoaded')) {\n queue = this.get('queue');\n if (queue.get('length') > 0) {\n return this.append(queue.toArray().join(''));\n }\n }\n }).observes('isLoaded')\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=models/artifact"
),minispade.register("models/branch","(function() {(function() {\nminispade.require('travis/model');\n\n this.Travis.Branch = Travis.Model.extend(Travis.Helpers, {\n repositoryId: DS.attr('number'),\n commitId: DS.attr('number'),\n number: DS.attr('number'),\n branch: DS.attr('string'),\n message: DS.attr('string'),\n result: DS.attr('number'),\n duration: DS.attr('number'),\n startedAt: DS.attr('string'),\n finishedAt: DS.attr('string'),\n commit: DS.belongsTo('Travis.Commit'),\n repository: (function() {\n if (this.get('repositoryId')) {\n return Travis.Repository.find(this.get('repositoryId'));\n }\n }).property('repositoryId'),\n updateTimes: function() {\n this.notifyPropertyChange('started_at');\n return this.notifyPropertyChange('finished_at');\n }\n });\n\n this.Travis.Branch.reopenClass({\n byRepositoryId: function(id) {\n return this.find({\n repository_id: id\n });\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=models/branch"
),minispade.register("models/build","(function() {(function() {\nminispade.require('travis/model');\n\n this.Travis.Build = Travis.Model.extend(Travis.DurationCalculations, {\n eventType: DS.attr('string'),\n repositoryId: DS.attr('number'),\n commitId: DS.attr('number'),\n state: DS.attr('string'),\n number: DS.attr('number'),\n branch: DS.attr('string'),\n message: DS.attr('string'),\n result: DS.attr('number'),\n _duration: DS.attr('number', {\n key: 'duration'\n }),\n startedAt: DS.attr('string', {\n key: 'started_at'\n }),\n finishedAt: DS.attr('string', {\n key: 'finished_at'\n }),\n repository: DS.belongsTo('Travis.Repository'),\n commit: DS.belongsTo('Travis.Commit'),\n jobs: DS.hasMany('Travis.Job', {\n key: 'job_ids'\n }),\n config: (function() {\n return Travis.Helpers.compact(this.get('data.config'));\n }).property('data.config'),\n isMatrix: (function() {\n return this.get('data.job_ids.length') > 1;\n }).property('data.job_ids.length'),\n requiredJobs: (function() {\n return this.get('jobs').filter(function(data) {\n return !data.get('allowFailure');\n });\n }).property('jobs.@each.allowFailure'),\n allowedFailureJobs: (function() {\n return this.get('jobs').filter(function(data) {\n return data.get('allowFailure');\n });\n }).property('jobs.@each.allowFailure'),\n configKeys: (function() {\n var config, headers, key, keys;\n if (!(config = this.get('config'))) {\n return [];\n }\n keys = $.intersect($.keys(config), Travis.CONFIG_KEYS);\n headers = (function() {\n var _i, _len, _ref, _results;\n _ref = ['build.job', 'build.duration', 'build.finished_at'];\n _results = [];\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n key = _ref[_i];\n _results.push(I18n.t(key));\n }\n return _results;\n })();\n return $.map(headers.concat(keys), function(key) {\n return $.camelize(key);\n });\n }).property('config')\n });\n\n this.Travis.Build.reopenClass({\n byRepositoryId: function(id, parameters) {\n return this.find($.extend(parameters || {}, {\n repository_id: id,\n orderBy: 'number DESC'\n }));\n },\n olderThanNumber: function(id, build_number) {\n return this.find({\n url: \"/builds\",\n repository_id: id,\n after_number: build_number\n });\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=models/build"
),minispade.register("models/commit","(function() {(function() {\nminispade.require('travis/model');\n\n this.Travis.Commit = Travis.Model.extend({\n buildId: DS.attr('number'),\n sha: DS.attr('string'),\n branch: DS.attr('string'),\n message: DS.attr('string'),\n compareUrl: DS.attr('string'),\n authorName: DS.attr('string'),\n authorEmail: DS.attr('string'),\n committerName: DS.attr('string'),\n committerEmail: DS.attr('string'),\n build: DS.belongsTo('Travis.Build', {\n key: 'buildId'\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=models/commit"
),minispade.register("models/extensions","(function() {(function() {\n\n Travis.DurationCalculations = Ember.Mixin.create({\n duration: (function() {\n var duration;\n if (duration = this.get('_duration')) {\n return duration;\n } else {\n return Travis.Helpers.durationFrom(this.get('startedAt'), this.get('finishedAt'));\n }\n }).property('_duration', 'finishedAt', 'startedAt'),\n updateTimes: function() {\n this.notifyPropertyChange('_duration');\n return this.notifyPropertyChange('finished_at');\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=models/extensions"
),minispade.register("models/hook","(function() {(function() {\nminispade.require('travis/model');\n\n this.Travis.Hook = Travis.Model.extend({\n name: DS.attr('string'),\n ownerName: DS.attr('string'),\n description: DS.attr('string'),\n active: DS.attr('boolean'),\n account: (function() {\n return this.get('slug').split('/')[0];\n }).property('slug'),\n slug: (function() {\n return \"\" + (this.get('ownerName')) + \"/\" + (this.get('name'));\n }).property('ownerName', 'name'),\n urlGithub: (function() {\n return \"http://github.com/\" + (this.get('slug'));\n }).property(),\n urlGithubAdmin: (function() {\n return \"http://github.com/\" + (this.get('slug')) + \"/admin/hooks#travis_minibucket\";\n }).property(),\n toggle: function() {\n var transaction;\n transaction = this.get('store').transaction();\n transaction.add(this);\n this.set('active', !this.get('active'));\n return transaction.commit();\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=models/hook"
),minispade.register("models/job","(function() {(function() {\nminispade.require('travis/model');\n\n this.Travis.Job = Travis.Model.extend(Travis.DurationCalculations, {\n repositoryId: DS.attr('number'),\n buildId: DS.attr('number'),\n commitId: DS.attr('number'),\n logId: DS.attr('number'),\n queue: DS.attr('string'),\n state: DS.attr('string'),\n number: DS.attr('string'),\n result: DS.attr('number'),\n _duration: DS.attr('number', {\n key: 'duration'\n }),\n startedAt: DS.attr('string'),\n finishedAt: DS.attr('string'),\n allowFailure: DS.attr('boolean', {\n key: 'allow_failure'\n }),\n repository: DS.belongsTo('Travis.Repository', {\n key: 'repository_id'\n }),\n build: DS.belongsTo('Travis.Build', {\n key: 'build_id'\n }),\n commit: DS.belongsTo('Travis.Commit', {\n key: 'commit_id'\n }),\n log: DS.belongsTo('Travis.Artifact', {\n key: 'log_id'\n }),\n isQueued: (function() {}).property('state'),\n config: (function() {\n return Travis.Helpers.compact(this.get('data.config'));\n }).property('data.config'),\n sponsor: (function() {\n return this.get('data.sponsor');\n }).property('data.sponsor'),\n configValues: (function() {\n var config;\n if (config = this.get('config')) {\n return $.values($.only.apply(config, Travis.CONFIG_KEYS));\n } else {\n return [];\n }\n }).property('config'),\n appendLog: function(text) {\n var log;\n if (log = this.get('log')) {\n return log.append(text);\n }\n },\n subscribe: function() {\n var id;\n if (id = this.get('id')) {\n return Travis.app.pusher.subscribe(\"job-\" + id);\n }\n },\n onStateChange: (function() {\n if (this.get('state') === 'finished') {\n return Travis.app.pusher.unsubscribe(\"job-\" + (this.get('id')));\n }\n }).observes('state')\n });\n\n this.Travis.Job.reopenClass({\n queued: function(queue) {\n this.find();\n return Travis.app.store.filter(this, function(job) {\n var queued;\n queued = ['created', 'queued'].indexOf(job.get('state')) !== -1;\n return queued && job.get('queue') === (\"builds.\" + queue);\n });\n },\n findMany: function(ids) {\n return Travis.app.store.findMany(this, ids);\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=models/job"
),minispade.register("models/repository","(function() {(function() {\nminispade.require('travis/expandable_record_array');\nminispade.require('travis/model');\n\n this.Travis.Repository = Travis.Model.extend({\n slug: DS.attr('string'),\n description: DS.attr('string'),\n lastBuildId: DS.attr('number'),\n lastBuildNumber: DS.attr('string'),\n lastBuildResult: DS.attr('number'),\n lastBuildStartedAt: DS.attr('string'),\n lastBuildFinishedAt: DS.attr('string'),\n lastBuild: DS.belongsTo('Travis.Build'),\n builds: (function() {\n var array, builds, id;\n id = this.get('id');\n builds = Travis.Build.byRepositoryId(id, {\n event_type: 'push'\n });\n array = Travis.ExpandableRecordArray.create({\n type: Travis.Build,\n content: Ember.A([]),\n store: this.get('store')\n });\n array.load(builds);\n return array;\n }).property(),\n pullRequests: (function() {\n var array, builds, id;\n id = this.get('id');\n builds = Travis.Build.byRepositoryId(id, {\n event_type: 'pull_request'\n });\n array = Travis.ExpandableRecordArray.create({\n type: Travis.Build,\n content: Ember.A([]),\n store: this.get('store')\n });\n array.load(builds);\n return array;\n }).property(),\n branches: (function() {\n return Travis.Branch.byRepositoryId(this.get('id'));\n }).property(),\n owner: (function() {\n return (this.get('slug') || '').split('/')[0];\n }).property('slug'),\n name: (function() {\n return (this.get('slug') || '').split('/')[1];\n }).property('slug'),\n lastBuildDuration: (function() {\n var duration;\n duration = this.get('data.last_build_duration');\n if (!duration) {\n duration = Travis.Helpers.durationFrom(this.get('lastBuildStartedAt'), this.get('lastBuildFinishedAt'));\n }\n return duration;\n }).property('data.last_build_duration', 'lastBuildStartedAt', 'lastBuildFinishedAt'),\n sortOrder: (function() {\n var lastBuildFinishedAt;\n if (lastBuildFinishedAt = this.get('lastBuildFinishedAt')) {\n return -new Date(lastBuildFinishedAt).getTime();\n } else {\n return -new Date('9999').getTime() - parseInt(this.get('lastBuildId'));\n }\n }).property('lastBuildFinishedAt', 'lastBuildId'),\n stats: (function() {\n var _this = this;\n return this.get('_stats') || $.get(\"https://api.github.com/repos/\" + (this.get('slug')), function(data) {\n _this.set('_stats', data);\n return _this.notifyPropertyChange('stats');\n }) && {};\n }).property(),\n select: function() {\n return Travis.Repository.select(this.get('id'));\n },\n updateTimes: function() {\n return this.notifyPropertyChange('lastBuildDuration');\n }\n });\n\n this.Travis.Repository.reopenClass({\n recent: function() {\n return this.find();\n },\n ownedBy: function(login) {\n return this.find({\n owner_name: login,\n orderBy: 'name'\n });\n },\n search: function(query) {\n return this.find({\n search: query,\n orderBy: 'name'\n });\n },\n bySlug: function(slug) {\n var repo;\n repo = $.select(this.find().toArray(), function(repo) {\n return repo.get('slug') === slug;\n });\n if (repo.length > 0) {\n return repo;\n } else {\n return this.find({\n slug: slug\n });\n }\n },\n select: function(id) {\n return this.find().forEach(function(repository) {\n return repository.set('selected', repository.get('id') === id);\n });\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=models/repository"
),minispade.register("models/sponsor","(function() {(function() {\nminispade.require('travis/model');\n\n this.Travis.Sponsor = Travis.Model.extend({\n type: DS.attr('string'),\n url: DS.attr('string'),\n link: DS.attr('string'),\n image: (function() {\n return \"/images/sponsors/\" + (this.get('data.image'));\n }).property('data.image')\n });\n\n Travis.Sponsor.reopenClass({\n decks: function() {\n return this.platinum().concat(this.gold());\n },\n platinum: function() {\n var platinum, sponsor, _i, _len, _results;\n platinum = this.byType('platinum').toArray();\n _results = [];\n for (_i = 0, _len = platinum.length; _i < _len; _i++) {\n sponsor = platinum[_i];\n _results.push([sponsor]);\n }\n return _results;\n },\n gold: function() {\n var gold, _results;\n gold = this.byType('gold').toArray();\n _results = [];\n while (gold.length > 0) {\n _results.push(gold.splice(0, 2));\n }\n return _results;\n },\n links: function() {\n return this.byType('silver');\n },\n byType: function() {\n var types;\n types = Array.prototype.slice.apply(arguments);\n return Travis.Sponsor.filter(function(sponsor) {\n return types.indexOf(sponsor.get('type')) !== -1;\n });\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=models/sponsor"
),minispade.register("models/user","(function() {(function() {\nminispade.require('travis/ajax');\nminispade.require('travis/model');\n\n this.Travis.User = Travis.Model.extend(Travis.Ajax, {\n name: DS.attr('string'),\n email: DS.attr('string'),\n login: DS.attr('string'),\n token: DS.attr('string'),\n locale: DS.attr('string'),\n gravatarId: DS.attr('string'),\n isSyncing: DS.attr('boolean'),\n syncedAt: DS.attr('string'),\n repoCount: DS.attr('number'),\n init: function() {\n if (this.get('isSyncing')) {\n this.poll();\n }\n this._super();\n return Ember.run.next(this, function() {\n var transaction;\n transaction = this.get('store').transaction();\n return transaction.add(this);\n });\n },\n urlGithub: (function() {\n return \"https://github.com/\" + (this.get('login'));\n }).property(),\n updateLocale: function(locale) {\n var observer, self, transaction;\n this.setWithSession('locale', locale);\n transaction = this.get('transaction');\n transaction.commit();\n self = this;\n observer = function() {\n if (!self.get('isSaving')) {\n self.removeObserver('isSaving', observer);\n transaction = self.get('store').transaction();\n return transaction.add(self);\n }\n };\n return this.addObserver('isSaving', observer);\n },\n type: (function() {\n return 'user';\n }).property(),\n sync: function() {\n this.post('/users/sync');\n this.setWithSession('isSyncing', true);\n return this.poll();\n },\n poll: function() {\n var _this = this;\n return this.ajax('/users', 'get', {\n success: function(data) {\n if (data.user.is_syncing) {\n return Ember.run.later(_this, _this.poll.bind(_this), 3000);\n } else {\n _this.set('isSyncing', false);\n return _this.setWithSession('syncedAt', data.user.synced_at);\n }\n }\n });\n },\n setWithSession: function(name, value) {\n var user;\n this.set(name, value);\n user = JSON.parse(typeof sessionStorage !== \"undefined\" && sessionStorage !== null ? sessionStorage.getItem('travis.user') : void 0);\n user[$.underscore(name)] = this.get(name);\n return typeof sessionStorage !== \"undefined\" && sessionStorage !== null ? sessionStorage.setItem('travis.user', JSON.stringify(user)) : void 0;\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=models/user"
),minispade.register("models/worker","(function() {(function() {\nminispade.require('travis/model');\n\n this.Travis.Worker = Travis.Model.extend({\n state: DS.attr('string'),\n name: DS.attr('string'),\n host: DS.attr('string'),\n lastSeenAt: DS.attr('string'),\n payload: (function() {\n return this.get('data.payload');\n }).property('data.payload'),\n number: (function() {\n return this.get('name').match(/\\d+$/)[0];\n }).property('name'),\n isWorking: (function() {\n return this.get('state') === 'working';\n }).property('state'),\n repository: (function() {\n return Travis.Repository.find(this.get('payload.repository.id'));\n }).property('payload.repository.id'),\n job_id: (function() {\n return this.get('payload.job.id');\n }).property('payload.job.id'),\n job: (function() {\n return Travis.Job.find(this.get('job_id'));\n }).property('job_id')\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=models/worker"
),minispade.register("pusher","(function() {(function() {\n\n Travis.Pusher = function(config) {\n if (config) {\n this.init(config);\n }\n return this;\n };\n\n $.extend(Travis.Pusher, {\n CHANNELS: ['common'],\n CHANNEL_PREFIX: ''\n });\n\n $.extend(Travis.Pusher.prototype, {\n active_channels: [],\n init: function(config) {\n var channel, _i, _len, _ref, _results;\n Pusher.warn = this.warn.bind(this);\n this.pusher = new Pusher(config.key);\n _ref = Travis.Pusher.CHANNELS;\n _results = [];\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n channel = _ref[_i];\n _results.push(this.subscribe(channel));\n }\n return _results;\n },\n subscribe: function(channel) {\n var _this = this;\n if (this.pusher && this.active_channels.indexOf(channel) === -1) {\n this.active_channels.push(channel);\n return this.pusher.subscribe(this.prefix(channel)).bind_all(function(event, data) {\n return _this.receive(event, data);\n });\n }\n },\n unsubscribe: function(channel) {\n var ix;\n ix = this.active_channels.indexOf(channel);\n if (this.pusher && ix === -1) {\n this.active_channels.splice(ix, 1);\n return this.pusher.unsubscribe(this.prefix(channel));\n }\n },\n prefix: function(channel) {\n return \"\" + Travis.Pusher.CHANNEL_PREFIX + channel;\n },\n receive: function(event, data) {\n if (event.substr(0, 6) === 'pusher') {\n return;\n }\n if (data.id) {\n data = this.normalize(event, data);\n }\n return Ember.run.next(function() {\n return Travis.app.store.receive(event, data);\n });\n },\n normalize: function(event, data) {\n switch (event) {\n case 'build:started':\n case 'build:finished':\n return data;\n case 'job:created':\n case 'job:started':\n case 'job:finished':\n case 'job:log':\n if (data.queue) {\n data.queue = data.queue.replace('builds.', '');\n }\n return {\n job: data\n };\n case 'worker:added':\n case 'worker:updated':\n case 'worker:removed':\n return {\n worker: data\n };\n }\n },\n warn: function(type, warning) {\n if (!this.ignoreWarning(warning)) {\n return console.warn(warning);\n }\n },\n ignoreWarning: function(warning) {\n var message, _ref;\n if (message = (_ref = warning.data) != null ? _ref.message : void 0) {\n return message.indexOf('Existing subscription') === 0 || message.indexOf('No current subscription') === 0;\n }\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=pusher"
),minispade.register("routes","(function() {(function() {\n\n Travis.Router = Ember.Router.extend({\n location: 'history',\n enableLogging: true,\n initialState: 'loading',\n goToRoot: Ember.Route.transitionTo('root.home.show'),\n goToStats: Ember.Route.transitionTo('root.stats'),\n showRepository: Ember.Route.transitionTo('root.home.repository.show'),\n showBuilds: Ember.Route.transitionTo('root.home.repository.builds.index'),\n showBuild: Ember.Route.transitionTo('root.home.repository.builds.show'),\n showPullRequests: Ember.Route.transitionTo('root.home.repository.pullRequests'),\n showBranches: Ember.Route.transitionTo('root.home.repository.branches'),\n showJob: Ember.Route.transitionTo('root.home.repository.job'),\n showProfile: Ember.Route.transitionTo('root.profile'),\n showAccount: Ember.Route.transitionTo('root.profile.account'),\n showUserProfile: Ember.Route.transitionTo('root.profile.account.profile'),\n signedIn: function() {\n return !!Travis.app.get('auth.user');\n },\n requiresAuth: function(path) {\n return path === '/profile' && !this.signedIn();\n },\n loading: Ember.Route.extend({\n routePath: function(router, path) {\n router.set('lastAttemptedPath', path);\n if (router.requiresAuth(path)) {\n return router.send('showUnauthenticated');\n } else {\n return router.send('showAuthenticated');\n }\n }\n }),\n showUnauthenticated: Ember.State.transitionTo('root.home.show'),\n showAuthenticated: Ember.State.transitionTo('authenticated.index'),\n authenticated: Ember.Route.extend({\n index: Ember.Route.extend({\n connectOutlets: function(router) {\n var path;\n router.transitionTo('root');\n path = router.get('lastAttemptedPath');\n if (path && path !== '/') {\n return router.route(path);\n }\n }\n })\n }),\n root: Ember.Route.extend({\n initialState: 'home',\n loading: Ember.State.extend(),\n stats: Ember.Route.extend({\n route: '/stats',\n connectOutlets: function(router) {\n router.get('applicationController').connectOutlet('statsLayout');\n $('body').attr('id', 'stats');\n router.get('statsLayoutController').connectOutlet('top', 'top');\n return router.get('statsLayoutController').connectOutlet('main', 'stats');\n }\n }),\n profile: Ember.Route.extend({\n initialState: 'index',\n route: '/profile',\n connectOutlets: function(router) {\n router.get('applicationController').connectOutlet('profileLayout');\n $('body').attr('id', 'profile');\n router.get('accountsController').set('content', Travis.Account.find());\n router.get('profileLayoutController').connectOutlet('top', 'top');\n return router.get('profileLayoutController').connectOutlet('left', 'accounts');\n },\n index: Ember.Route.extend({\n route: '/',\n connectOutlets: function(router) {\n router.get('profileLayoutController').connectOutlet('main', 'profile');\n return router.get('profileController').activate('hooks');\n }\n }),\n account: Ember.Route.extend({\n initialState: 'index',\n route: '/:login',\n connectOutlets: function(router, account) {\n var params;\n if (account) {\n params = {\n login: account.get('login')\n };\n return router.get('profileController').setParams(params);\n } else {\n return router.send('showProfile');\n }\n },\n deserialize: function(router, params) {\n return router.get('accountsController').findByLogin(params.login);\n },\n serialize: function(router, account) {\n if (account) {\n return {\n login: account.get('login')\n };\n } else {\n return {};\n }\n },\n index: Ember.Route.extend({\n route: '/',\n connectOutlets: function(router) {\n return router.get('profileController').activate('hooks');\n }\n }),\n profile: Ember.Route.extend({\n route: '/profile',\n connectOutlets: function(router) {\n return router.get('profileController').activate('user');\n }\n })\n })\n }),\n home: Ember.Route.extend({\n initialState: 'show',\n route: '/',\n connectOutlets: function(router) {\n router.get('applicationController').connectOutlet('home');\n $('body').attr('id', 'home');\n router.get('homeController').connectOutlet('left', 'repositories');\n router.get('homeController').connectOutlet('right', 'sidebar');\n router.get('homeController').connectOutlet('top', 'top');\n return router.get('homeController').connectOutlet('main', 'repository');\n },\n show: Ember.Route.extend({\n route: '/',\n connectOutlets: function(router) {\n return router.get('repositoryController').activate('index');\n }\n }),\n repository: Ember.Route.extend({\n initialState: 'show',\n route: '/:owner/:name',\n connectOutlets: function(router, repository) {\n return router.get('repositoryController').set('repository', repository);\n },\n deserialize: function(router, params) {\n var deferred, observer, repos, slug;\n slug = \"\" + params.owner + \"/\" + params.name;\n repos = Travis.Repository.bySlug(slug);\n deferred = $.Deferred();\n observer = function() {\n if (repos.get('isLoaded')) {\n repos.removeObserver('isLoaded', observer);\n return deferred.resolve(repos.objectAt(0));\n }\n };\n repos.addObserver('isLoaded', observer);\n return deferred.promise();\n },\n serialize: function(router, repository) {\n if (repository) {\n return {\n owner: repository.get('owner'),\n name: repository.get('name')\n };\n } else {\n return {};\n }\n },\n show: Ember.Route.extend({\n route: '/',\n connectOutlets: function(router) {\n return router.get('repositoryController').activate('current');\n }\n }),\n builds: Ember.Route.extend({\n route: '/builds',\n initialState: 'index',\n index: Ember.Route.extend({\n route: '/',\n connectOutlets: function(router, repository) {\n return router.get('repositoryController').activate('builds');\n }\n }),\n show: Ember.Route.extend({\n route: '/:build_id',\n connectOutlets: function(router, build) {\n if (!build.get) {\n build = Travis.Build.find(build);\n }\n router.get('repositoryController').set('build', build);\n return router.get('repositoryController').activate('build');\n },\n serialize: function(router, build) {\n if (build.get) {\n return {\n build_id: build.get('id')\n };\n } else {\n return {\n build_id: build\n };\n }\n },\n deserialize: function(router, params) {\n var build, deferred, observer;\n build = Travis.Build.find(params.build_id);\n deferred = $.Deferred();\n observer = function() {\n if (build.get('id')) {\n build.removeObserver('id', observer);\n return deferred.resolve(build);\n }\n };\n build.addObserver('id', observer);\n return deferred.promise();\n }\n })\n }),\n pullRequests: Ember.Route.extend({\n route: '/pull_requests',\n connectOutlets: function(router, repository) {\n return router.get('repositoryController').activate('pull_requests');\n }\n }),\n branches: Ember.Route.extend({\n route: '/branches',\n connectOutlets: function(router, repository) {\n return router.get('repositoryController').activate('branches');\n }\n }),\n job: Ember.Route.extend({\n route: '/jobs/:job_id',\n connectOutlets: function(router, job) {\n if (!job.get) {\n job = Travis.Job.find(job);\n }\n router.get('repositoryController').set('job', job);\n return router.get('repositoryController').activate('job');\n },\n serialize: function(router, job) {\n if (job.get) {\n return {\n job_id: job.get('id')\n };\n } else {\n return {\n job_id: job\n };\n }\n },\n deserialize: function(router, params) {\n var deferred, job, observer;\n job = Travis.Job.find(params.job_id);\n deferred = $.Deferred();\n observer = function() {\n if (job.get('id')) {\n job.removeObserver('id', observer);\n return deferred.resolve(job);\n }\n };\n job.addObserver('id', observer);\n return deferred.promise();\n }\n })\n })\n })\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=routes"
),minispade.register("slider","(function() {(function() {\n\n this.Travis.Slider = function() {\n if ((typeof localStorage !== \"undefined\" && localStorage !== null ? localStorage.getItem('travis.maximized') : void 0) === 'true') {\n this.minimize();\n }\n return this;\n };\n\n $.extend(Travis.Slider.prototype, {\n persist: function() {\n return typeof localStorage !== \"undefined\" && localStorage !== null ? localStorage.setItem('travis.maximized', this.isMinimized()) : void 0;\n },\n isMinimized: function() {\n return $('body').hasClass('maximized');\n },\n minimize: function() {\n return $('body').addClass('maximized');\n },\n toggle: function() {\n var element;\n $('body').toggleClass('maximized');\n this.persist();\n element = $('');\n $('#top .profile').append(element);\n return Em.run.later((function() {\n return element.remove();\n }), 10);\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=slider"
),minispade.register("store","(function() {(function() {\n var DATA_PROXY,\n __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\nminispade.require('store/rest_adapter');\n\n DATA_PROXY = {\n get: function(name) {\n return this.savedData[name];\n }\n };\n\n Travis.Store = DS.Store.extend({\n revision: 4,\n adapter: Travis.RestAdapter.create(),\n merge: function(type, id, hash) {\n var clientId, data, dataCache, primaryKey, record, recordCache, typeMap;\n if (hash === void 0) {\n hash = id;\n primaryKey = type.proto().primaryKey;\n Ember.assert(\"A data hash was loaded for a record of type \" + type.toString() + \" but no primary key '\" + primaryKey + \"' was provided.\", hash[primaryKey]);\n id = hash[primaryKey];\n }\n typeMap = this.typeMapFor(type);\n dataCache = typeMap.cidToHash;\n clientId = typeMap.idToCid[id];\n recordCache = this.get('recordCache');\n if (clientId !== void 0) {\n if (data = dataCache[clientId]) {\n $.extend(data, hash);\n } else {\n dataCache[clientId] = hash;\n }\n if (record = recordCache[clientId]) {\n record.send('didChangeData');\n }\n } else {\n clientId = this.find(type, id).get('clientId');\n }\n if (clientId) {\n DATA_PROXY.savedData = hash;\n this.updateRecordArrays(type, clientId, DATA_PROXY);\n return {\n id: id,\n clientId: clientId\n };\n }\n },\n receive: function(event, data) {\n var job, mappings, name, type, _ref;\n _ref = event.split(':'), name = _ref[0], type = _ref[1];\n mappings = this.adapter.get('mappings');\n type = mappings[name];\n if (event === 'job:log') {\n if (job = this.find(Travis.Job, data['job']['id'])) {\n return job.appendLog(data['job']['_log']);\n }\n } else if (data[type.singularName()]) {\n return this._loadOne(this, type, data);\n } else if (data[type.pluralName()]) {\n return this._loadMany(this, type, data);\n } else {\n if (!type) {\n throw \"can't load data for \" + name;\n }\n }\n },\n _loadOne: function(store, type, json) {\n var root;\n root = type.singularName();\n this.adapter.sideload(store, type, json, root);\n this.merge(type, json[root]);\n return this._updateAssociations(type, root, json[root]);\n },\n _loadMany: function(store, type, json) {\n var root;\n root = type.pluralName();\n this.adapter.sideload(store, type, json, root);\n return this.loadMany(type, json[root]);\n },\n _updateAssociations: function(type, name, data) {\n var _this = this;\n return Em.get(type, 'associationsByName').forEach(function(key, meta) {\n var clientId, dataProxy, id, ids, parent, _ref;\n if (meta.kind === 'belongsTo') {\n id = data[\"\" + key + \"_id\"];\n if (clientId = _this.typeMapFor(meta.type).idToCid[id]) {\n if (parent = _this.findByClientId(meta.type, clientId, id)) {\n dataProxy = parent.get('data');\n if (ids = dataProxy.get(\"\" + name + \"_ids\")) {\n if (_ref = data.id, __indexOf.call(ids, _ref) < 0) {\n ids.pushObject(data.id);\n }\n return parent.send('didChangeData');\n }\n }\n }\n }\n });\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=store"
),minispade.register("store/fixture_adapter",'(function() {(function() {\n\n this.Travis.FixtureAdapter = DS.Adapter.extend({\n find: function(store, type, id) {\n var fixtures;\n fixtures = type.FIXTURES;\n Ember.assert("Unable to find fixtures for model type " + type.toString(), !!fixtures);\n if (fixtures.hasLoaded) {\n return;\n }\n return setTimeout((function() {\n store.loadMany(type, fixtures);\n return fixtures.hasLoaded = true;\n }), 300);\n },\n findMany: function() {\n return this.find.apply(this, arguments);\n },\n findAll: function(store, type) {\n var fixtures, ids;\n fixtures = type.FIXTURES;\n Ember.assert("Unable to find fixtures for model type " + type.toString(), !!fixtures);\n ids = fixtures.map(function(item, index, self) {\n return item.id;\n });\n return store.loadMany(type, ids, fixtures);\n },\n findQuery: function(store, type, params, array) {\n var fixture, fixtures, hashes, key, matches, value;\n fixtures = type.FIXTURES;\n Ember.assert("Unable to find fixtures for model type " + type.toString(), !!fixtures);\n hashes = (function() {\n var _i, _len, _results;\n _results = [];\n for (_i = 0, _len = fixtures.length; _i < _len; _i++) {\n fixture = fixtures[_i];\n matches = (function() {\n var _results1;\n _results1 = [];\n for (key in params) {\n value = params[key];\n _results1.push(key === \'orderBy\' || fixture[key] === value);\n }\n return _results1;\n })();\n if (matches.reduce(function(a, b) {\n return a && b;\n })) {\n _results.push(fixture);\n } else {\n _results.push(null);\n }\n }\n return _results;\n })();\n return array.load(hashes.compact());\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=store/fixture_adapter'
),minispade.register("store/rest_adapter","(function() {(function() {\nminispade.require('travis/ajax');\nminispade.require('models');\n\n this.Travis.RestAdapter = DS.RESTAdapter.extend(Travis.Ajax, {\n mappings: {\n repositories: Travis.Repository,\n repository: Travis.Repository,\n builds: Travis.Build,\n build: Travis.Build,\n commits: Travis.Commit,\n commit: Travis.Commit,\n jobs: Travis.Job,\n job: Travis.Job,\n account: Travis.Account,\n accounts: Travis.Account,\n worker: Travis.Worker,\n workers: Travis.Worker\n },\n plurals: {\n repository: 'repositories',\n build: 'builds',\n branch: 'branches',\n job: 'jobs',\n worker: 'workers',\n profile: 'profile'\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=store/rest_adapter"
),minispade.register("tailing","(function() {(function() {\n\n this.Travis.Tailing = function() {\n this.position = $(window).scrollTop();\n $(window).scroll(this.onScroll.bind(this));\n return this;\n };\n\n $.extend(Travis.Tailing.prototype, {\n options: {\n timeout: 200\n },\n run: function() {\n this.autoScroll();\n this.positionButton();\n if (this.active()) {\n return Ember.run.later(this.run.bind(this), this.options.timeout);\n }\n },\n toggle: function(event) {\n if (this.active()) {\n return this.stop();\n } else {\n return this.start();\n }\n },\n active: function() {\n return $('#tail').hasClass('active');\n },\n start: function() {\n $('#tail').addClass('active');\n return this.run();\n },\n stop: function() {\n return $('#tail').removeClass('active');\n },\n autoScroll: function() {\n var log, logBottom, win, winBottom;\n if (!this.active()) {\n return;\n }\n win = $(window);\n log = $('#log');\n logBottom = log.offset().top + log.outerHeight() + 40;\n winBottom = win.scrollTop() + win.height();\n if (logBottom - winBottom > 0) {\n return win.scrollTop(logBottom - win.height());\n }\n },\n onScroll: function() {\n var position;\n this.positionButton();\n position = $(window).scrollTop();\n if (position < this.position) {\n this.stop();\n }\n return this.position = position;\n },\n positionButton: function() {\n var max, offset, tail;\n tail = $('#tail');\n if (tail.length === 0) {\n return;\n }\n offset = $(window).scrollTop() - $('#log').offset().top;\n max = $('#log').height() - $('#tail').height() + 5;\n if (offset > max) {\n offset = max;\n }\n if (offset > 0) {\n return tail.css({\n top: offset - 2\n });\n } else {\n return tail.css({\n top: 0\n });\n }\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=tailing"
),minispade.register("views","(function() {(function() {\nminispade.require('ext/ember/namespace');\n\n this.Travis.reopen({\n View: Em.View.extend({\n popup: function(event) {\n return $(\"#\" + event.target.name).toggleClass('display');\n }\n })\n });\n\n this.Travis.reopen({\n HomeView: Travis.View.extend({\n templateName: 'layouts/home'\n }),\n ProfileLayoutView: Travis.View.extend({\n templateName: 'layouts/profile'\n }),\n StatsLayoutView: Travis.View.extend({\n templateName: 'layouts/simple'\n }),\n ApplicationView: Travis.View.extend({\n templateName: 'application'\n })\n });\nminispade.require('views/accounts');\nminispade.require('views/build');\nminispade.require('views/job');\nminispade.require('views/repo');\nminispade.require('views/profile');\nminispade.require('views/sidebar');\nminispade.require('views/stats');\nminispade.require('views/top');\n\n}).call(this);\n\n})();\n//@ sourceURL=views"
),minispade.register("views/accounts","(function() {(function() {\n\n this.Travis.reopen({\n AccountsView: Travis.View.extend({\n tabBinding: 'controller.tab',\n templateName: 'profile/accounts',\n classAccounts: (function() {\n if (this.get('tab') === 'accounts') {\n return 'active';\n }\n }).property('tab')\n }),\n AccountsListView: Em.CollectionView.extend({\n elementId: 'accounts',\n accountBinding: 'content',\n tagName: 'ul',\n emptyView: Ember.View.extend({\n template: Ember.Handlebars.compile('Loading
')\n }),\n itemViewClass: Travis.View.extend({\n accountBinding: 'content',\n typeBinding: 'content.type',\n selectedBinding: 'account.selected',\n classNames: ['account'],\n classNameBindings: ['type', 'selected'],\n name: (function() {\n return this.get('content.name') || this.get('content.login');\n }).property('content.login', 'content.name'),\n urlAccount: (function() {\n return Travis.Urls.account(this.get('account.login'));\n }).property('account.login')\n })\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=views/accounts"
),minispade.register("views/build","(function() {(function() {\n\n this.Travis.reopen({\n BuildsView: Travis.View.extend({\n templateName: 'builds/list',\n buildsBinding: 'controller.builds',\n showMore: function() {\n var id, number;\n id = this.get('controller.repository.id');\n number = this.get('builds.lastObject.number');\n return this.get('builds').load(Travis.Build.olderThanNumber(id, number));\n },\n ShowMoreButton: Em.View.extend({\n tagName: 'button',\n classNameBindings: ['isLoading'],\n attributeBindings: ['disabled'],\n isLoadingBinding: 'controller.builds.isLoading',\n template: Em.Handlebars.compile('{{view.label}}'),\n disabledBinding: 'isLoading',\n label: (function() {\n if (this.get('isLoading')) {\n return 'Loading';\n } else {\n return 'Show more';\n }\n }).property('isLoading'),\n click: function() {\n return this.get('parentView').showMore();\n }\n })\n }),\n BuildsItemView: Travis.View.extend({\n tagName: 'tr',\n classNameBindings: ['color'],\n repositoryBinding: 'controller.repository',\n buildBinding: 'context',\n commitBinding: 'build.commit',\n color: (function() {\n return Travis.Helpers.colorForResult(this.get('build.result'));\n }).property('build.result'),\n urlBuild: (function() {\n return Travis.Urls.build(this.get('repository.slug'), this.get('build.id'));\n }).property('repository.slug', 'build.id'),\n urlGithubCommit: (function() {\n return Travis.Urls.githubCommit(this.get('repository.slug'), this.get('commit.sha'));\n }).property('repository.slug', 'commit.sha')\n }),\n BuildView: Travis.View.extend({\n templateName: 'builds/show',\n elementId: 'build',\n classNameBindings: ['color', 'loading'],\n repositoryBinding: 'controller.repository',\n buildBinding: 'controller.build',\n commitBinding: 'build.commit',\n loading: (function() {\n return !this.get('build.isLoaded');\n }).property('build.isLoaded'),\n color: (function() {\n return Travis.Helpers.colorForResult(this.get('build.result'));\n }).property('build.result'),\n urlBuild: (function() {\n return Travis.Urls.build(this.get('repository.slug'), this.get('build.id'));\n }).property('repository.slug', 'build.id'),\n urlGithubCommit: (function() {\n return Travis.Urls.githubCommit(this.get('repository.slug'), this.get('commit.sha'));\n }).property('repository.slug', 'commit.sha'),\n urlAuthor: (function() {\n return Travis.Urls.email(this.get('commit.authorEmail'));\n }).property('commit.authorEmail'),\n urlCommitter: (function() {\n return Travis.Urls.email(this.get('commit.committerEmail'));\n }).property('commit.committerEmail')\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=views/build"
),minispade.register("views/job","(function() {(function() {\n\n this.Travis.reopen({\n JobsView: Travis.View.extend({\n templateName: 'jobs/list',\n buildBinding: 'controller.build'\n }),\n JobsItemView: Travis.View.extend({\n tagName: 'tr',\n classNameBindings: ['color'],\n repositoryBinding: 'context.repository',\n jobBinding: 'context',\n color: (function() {\n return Travis.Helpers.colorForResult(this.get('job.result'));\n }).property('job.result'),\n urlJob: (function() {\n return Travis.Urls.job(this.get('repository.slug'), this.get('job.id'));\n }).property('repository.slug', 'job.id')\n }),\n JobView: Travis.View.extend({\n templateName: 'jobs/show',\n repositoryBinding: 'controller.repository',\n jobBinding: 'controller.job',\n commitBinding: 'job.commit',\n color: (function() {\n return Travis.Helpers.colorForResult(this.get('job.result'));\n }).property('job.result'),\n urlJob: (function() {\n return Travis.Urls.job(this.get('repository.slug'), this.get('job.id'));\n }).property('repository.slug', 'job.id'),\n urlGithubCommit: (function() {\n return Travis.Urls.githubCommit(this.get('repository.slug'), this.get('commit.sha'));\n }).property('repository.slug', 'commit.sha'),\n urlAuthor: (function() {\n return Travis.Urls.email(this.get('commit.authorEmail'));\n }).property('commit.authorEmail'),\n urlCommitter: (function() {\n return Travis.Urls.email(this.get('commit.committerEmail'));\n }).property('commit.committerEmail')\n }),\n LogView: Travis.View.extend({\n templateName: 'jobs/log',\n logBinding: 'job.log',\n click: function(event) {\n return $(event.target).closest('.fold').toggleClass('open');\n },\n toTop: function() {\n return $(window).scrollTop(0);\n },\n jobBinding: 'context',\n toggleTailing: function(event) {\n Travis.app.tailing.toggle();\n return event.preventDefault();\n },\n logSubscriber: (function() {\n var job, state;\n job = this.get('job');\n state = this.get('job.state');\n if (job && state !== 'finished') {\n job.subscribe();\n }\n return null;\n }).property('job', 'job.state')\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=views/job"
),minispade.register("views/left","(function() {(function() {\n\n this.Travis.reopen({\n ReposView: Travis.View.extend({\n templateName: 'repos/list',\n tabBinding: 'controller.tab',\n classRecent: (function() {\n if (this.get('tab') === 'recent') {\n return 'active';\n }\n }).property('tab'),\n classOwned: (function() {\n var classes;\n classes = [];\n if (this.get('tab') === 'owned') {\n classes.push('active');\n }\n if (Travis.app.get('currentUser')) {\n classes.push('display');\n }\n return classes.join(' ');\n }).property('tab', 'Travis.currentUser'),\n classSearch: (function() {\n if (this.get('tab') === 'search') {\n return 'active';\n }\n }).property('tab')\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=views/left"
),minispade.register("views/profile","(function() {(function() {\n\n this.Travis.reopen({\n ProfileView: Travis.View.extend({\n templateName: 'profile/show',\n accountBinding: 'controller.account',\n name: (function() {\n return this.get('account.name') || this.get('account.login');\n }).property('account.name', 'account.login')\n }),\n ProfileTabsView: Travis.View.extend({\n templateName: 'profile/tabs',\n tabBinding: 'controller.tab',\n activate: function(event) {\n return this.get('controller').activate(event.target.name);\n },\n classHooks: (function() {\n if (this.get('tab') === 'hooks') {\n return 'active';\n }\n }).property('tab'),\n classUser: (function() {\n if (this.get('tab') === 'user') {\n return 'active';\n }\n }).property('tab'),\n accountBinding: 'controller.account',\n displayUser: (function() {\n return this.get('controller.account.login') === this.get('controller.user.login');\n }).property('controller.account.login', 'controller.user.login')\n }),\n HooksView: Travis.View.extend({\n templateName: 'profile/tabs/hooks',\n userBinding: 'controller.user',\n urlGithubAdmin: (function() {\n return Travis.Urls.githubAdmin(this.get('hook.slug'));\n }).property('hook.slug')\n }),\n UserView: Travis.View.extend({\n templateName: 'profile/tabs/user',\n userBinding: 'controller.user',\n gravatarUrl: (function() {\n return \"\" + location.protocol + \"//www.gravatar.com/avatar/\" + (this.get('user.gravatarId')) + \"?s=48&d=mm\";\n }).property('user.gravatarId'),\n locales: (function() {\n return [\n {\n key: null,\n name: ''\n }, {\n key: 'en',\n name: 'English'\n }, {\n key: 'ca',\n name: 'Catalan'\n }, {\n key: 'cs',\n name: 'Čeština'\n }, {\n key: 'es',\n name: 'Español'\n }, {\n key: 'fr',\n name: 'Français'\n }, {\n key: 'ja',\n name: '日本語'\n }, {\n key: 'nl',\n name: 'Nederlands'\n }, {\n key: 'nb',\n name: 'Norsk Bokmål'\n }, {\n key: 'pl',\n name: 'Polski'\n }, {\n key: {\n 'pt-BR': {\n name: 'Português brasileiro'\n }\n }\n }, {\n key: 'ru',\n name: 'Русский'\n }\n ];\n }).property(),\n saveLocale: function(event) {\n return this.get('user').updateLocale($('#locale').val());\n }\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=views/profile"
),minispade.register("views/repo","(function() {(function() {\nminispade.require('views/repo/list');\nminispade.require('views/repo/show');\n\n}).call(this);\n\n})();\n//@ sourceURL=views/repo"
),minispade.register("views/repo/list","(function() {(function() {\n\n this.Travis.reopen({\n RepositoriesView: Travis.View.extend({\n templateName: 'repos/list',\n toggleInfo: function(event) {\n return $('#repositories').toggleClass('open');\n }\n }),\n RepositoriesListView: Em.CollectionView.extend({\n elementId: 'repositories',\n tagName: 'ul',\n emptyView: Ember.View.extend({\n template: Ember.Handlebars.compile('Loading
')\n }),\n itemViewClass: Travis.View.extend({\n repositoryBinding: 'content',\n classNames: ['repository'],\n classNameBindings: ['color', 'selected'],\n selectedBinding: 'repository.selected',\n color: (function() {\n return Travis.Helpers.colorForResult(this.get('repository.lastBuildResult'));\n }).property('repository.lastBuildResult'),\n urlRepository: (function() {\n return Travis.Urls.repository(this.get('repository.slug'));\n }).property('repository.slug'),\n urlLastBuild: (function() {\n return Travis.Urls.build(this.get('repository.slug'), this.get('repository.lastBuildId'));\n }).property('repository.slug', 'repository.lastBuildId')\n })\n }),\n ReposListTabsView: Travis.View.extend({\n templateName: 'repos/list/tabs',\n tabBinding: 'controller.tab',\n activate: function(event) {\n return this.get('controller').activate(event.target.name);\n },\n classRecent: (function() {\n if (this.get('tab') === 'recent') {\n return 'active';\n }\n }).property('tab'),\n classOwned: (function() {\n var classes;\n classes = [];\n if (this.get('tab') === 'owned') {\n classes.push('active');\n }\n if (Travis.app.get('currentUser')) {\n classes.push('display-inline');\n }\n return classes.join(' ');\n }).property('tab', 'Travis.app.currentUser'),\n classSearch: (function() {\n if (this.get('tab') === 'search') {\n return 'active';\n }\n }).property('tab')\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=views/repo/list"
),minispade.register("views/repo/show","(function() {(function() {\n\n this.Travis.reopen({\n RepositoryView: Travis.View.extend({\n templateName: 'repos/show',\n repositoryBinding: 'controller.repository',\n \"class\": (function() {\n if (!this.get('repository.isLoaded')) {\n return 'loading';\n }\n }).property('repository.isLoaded'),\n urlGithub: (function() {\n return Travis.Urls.githubRepository(this.get('repository.slug'));\n }).property('repository.slug'),\n urlGithubWatchers: (function() {\n return Travis.Urls.githubWatchers(this.get('repository.slug'));\n }).property('repository.slug'),\n urlGithubNetwork: (function() {\n return Travis.Urls.githubNetwork(this.get('repository.slug'));\n }).property('repository.slug')\n }),\n RepoShowTabsView: Travis.View.extend({\n templateName: 'repos/show/tabs',\n repositoryBinding: 'controller.repository',\n buildBinding: 'controller.build',\n jobBinding: 'controller.job',\n tabBinding: 'controller.tab',\n classCurrent: (function() {\n if (this.get('tab') === 'current') {\n return 'active';\n }\n }).property('tab'),\n classBuilds: (function() {\n if (this.get('tab') === 'builds') {\n return 'active';\n }\n }).property('tab'),\n classPullRequests: (function() {\n if (this.get('tab') === 'pull_requests') {\n return 'active';\n }\n }).property('tab'),\n classBranches: (function() {\n if (this.get('tab') === 'branches') {\n return 'active';\n }\n }).property('tab'),\n classBuild: (function() {\n var classes, tab;\n tab = this.get('tab');\n classes = [];\n if (tab === 'build') {\n classes.push('active');\n }\n if (tab === 'build' || tab === 'job') {\n classes.push('display-inline');\n }\n return classes.join(' ');\n }).property('tab'),\n classJob: (function() {\n if (this.get('tab') === 'job') {\n return 'active display-inline';\n }\n }).property('tab')\n }),\n RepoShowToolsView: Travis.View.extend({\n templateName: 'repos/show/tools',\n repositoryBinding: 'controller.repository',\n buildBinding: 'controller.build',\n jobBinding: 'controller.job',\n tabBinding: 'controller.tab',\n toggle: function() {\n var element;\n element = $('#tools .pane').toggleClass('display-inline');\n return this.set('active', element.hasClass('display-inline'));\n },\n branches: (function() {\n if (this.get('active')) {\n return this.get('repository.branches');\n }\n }).property('active', 'repository.branches'),\n urlRepository: (function() {\n return 'https://' + location.host + Travis.Urls.repository(this.get('repository.slug'));\n }).property('repository.slug'),\n urlStatusImage: (function() {\n return Travis.Urls.statusImage(this.get('repository.slug'), this.get('branch.commit.branch'));\n }).property('repository.slug', 'branch'),\n markdownStatusImage: (function() {\n return \"[) + \")](\" + (this.get('urlRepository')) + \")\";\n }).property('urlStatusImage'),\n textileStatusImage: (function() {\n return \"!\" + (this.get('urlStatusImage')) + \"!:\" + (this.get('urlRepository'));\n }).property('urlStatusImage'),\n rdocStatusImage: (function() {\n return \"{
}[\" + (this.get('urlRepository')) + \"]\";\n }).property('urlStatusImage')\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=views/repo/show"
),minispade.register("views/sidebar","(function() {(function() {\n\n this.Travis.reopen({\n SidebarView: Travis.View.extend({\n templateName: 'layouts/sidebar',\n DecksView: Em.View.extend({\n templateName: \"sponsors/decks\",\n controller: Travis.SponsorsController.create({\n perPage: 1\n }),\n didInsertElement: function() {\n var controller;\n controller = this.get('controller');\n if (!controller.get('content')) {\n Travis.app.get('router.sidebarController').tickables.push(controller);\n controller.set('content', Travis.Sponsor.decks());\n }\n return this._super.apply(this, arguments);\n }\n }),\n LinksView: Em.View.extend({\n templateName: \"sponsors/links\",\n controller: Travis.SponsorsController.create({\n perPage: 6\n }),\n didInsertElement: function() {\n var controller;\n controller = this.get('controller');\n if (!controller.get('content')) {\n controller.set('content', Travis.Sponsor.links());\n Travis.app.get('router.sidebarController').tickables.push(controller);\n }\n return this._super.apply(this, arguments);\n }\n }),\n WorkersView: Em.View.extend({\n templateName: 'workers/list',\n controller: Travis.WorkersController.create(),\n didInsertElement: function() {\n this.set('controller.content', Travis.Worker.find());\n return this._super.apply(this, arguments);\n }\n }),\n QueuesView: Em.View.extend({\n templateName: 'queues/list',\n controller: Travis.QueuesController.create(),\n didInsertElement: function() {\n var queue, queues;\n queues = (function() {\n var _i, _len, _ref, _results;\n _ref = Travis.QUEUES;\n _results = [];\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n queue = _ref[_i];\n _results.push(Em.ArrayController.create({\n content: Travis.Job.queued(queue.name),\n id: \"queue_\" + queue.name,\n name: queue.display\n }));\n }\n return _results;\n })();\n this.set('controller.content', queues);\n return this._super.apply(this, arguments);\n }\n })\n }),\n WorkersView: Travis.View.extend({\n toggleWorkers: function(event) {\n var handle;\n handle = $(event.target).toggleClass('open');\n if (handle.hasClass('open')) {\n return $('#workers li').addClass('open');\n } else {\n return $('#workers li').removeClass('open');\n }\n }\n }),\n WorkersListView: Travis.View.extend({\n toggle: function(event) {\n return $(event.target).closest('li').toggleClass('open');\n }\n }),\n WorkersItemView: Travis.View.extend({\n display: (function() {\n var name, number, payload, repo, state;\n name = (this.get('worker.name') || '').replace('travis-', '');\n state = this.get('worker.state');\n payload = this.get('worker.payload');\n if (state === 'working' && payload !== void 0) {\n repo = payload.repository.slug;\n number = ' #' + payload.build.number;\n return (\"\" + name + \": \" + repo + \" \" + number).htmlSafe();\n } else {\n return \"\" + name + \": \" + state;\n }\n }).property('worker.state')\n }),\n QueueItemView: Travis.View.extend({\n tagName: 'li',\n urlJob: (function() {\n return Travis.Urls.job(this.get('job.repository.slug'), this.get('job.id'));\n }).property('job.repository.slug', 'job.id')\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=views/sidebar"
),minispade.register("views/stats",'(function() {(function() {\n\n this.Travis.reopen({\n StatsView: Travis.View.extend({\n templateName: \'stats/show\',\n didInsertElement: function() {},\n renderChart: function(config) {\n var chart;\n chart = new Highcharts.Chart(config);\n return this.fetch(config.source, function(data) {\n var stats;\n stats = (function() {\n var _i, _len, _ref, _results;\n _ref = data.stats;\n _results = [];\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n stats = _ref[_i];\n _results.push(config.map(stats));\n }\n return _results;\n })();\n return chart.series[0].setData(stats);\n });\n },\n fetch: function(url, callback) {\n return $.ajax({\n type: \'GET\',\n url: url,\n accepts: {\n json: \'application/vnd.travis-ci.2+json\'\n },\n success: callback\n });\n },\n CHARTS: {\n repos: {\n source: \'/api/stats/repos\',\n total: 0,\n map: function(data) {\n return [Date.parse(data.date), this.total += parseInt(data.count)];\n },\n chart: {\n renderTo: "repos_stats"\n },\n title: {\n text: "Total Projects/Repositories"\n },\n xAxis: {\n type: "datetime",\n dateTimeLabelFormats: {\n month: "%e. %b",\n year: "%b"\n }\n },\n yAxis: {\n title: {\n text: "Count"\n },\n min: 0\n },\n tooltip: {\n formatter: function() {\n return Highcharts.dateFormat("%e. %b", this.x) + ": " + this.y + " repos";\n }\n },\n series: [\n {\n name: "Repository Growth",\n data: []\n }\n ]\n },\n builds: {\n source: \'/api/stats/tests\',\n map: function(data) {\n return [Date.parse(data.date), parseInt(data.count)];\n },\n chart: {\n renderTo: "tests_stats",\n type: "column"\n },\n title: {\n text: "Build Count"\n },\n subtitle: {\n text: "last month"\n },\n xAxis: {\n type: "datetime",\n dateTimeLabelFormats: {\n month: "%e. %b",\n year: "%b"\n }\n },\n yAxis: {\n title: {\n text: "Count"\n },\n min: 0\n },\n tooltip: {\n formatter: function() {\n return Highcharts.dateFormat("%e. %b", this.x) + ": " + this.y + " builds";\n }\n },\n series: [\n {\n name: "Total Builds",\n data: []\n }\n ]\n }\n }\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=views/stats'
),minispade.register("views/top","(function() {(function() {\n\n this.Travis.reopen({\n TopView: Travis.View.extend({\n templateName: 'layouts/top',\n tabBinding: 'controller.tab',\n userBinding: 'controller.user',\n gravatarUrl: (function() {\n return \"\" + location.protocol + \"//www.gravatar.com/avatar/\" + (this.get('user.gravatarId')) + \"?s=24&d=mm\";\n }).property('user.gravatarId'),\n classHome: (function() {\n if (this.get('tab') === 'home') {\n return 'active';\n }\n }).property('tab'),\n classStats: (function() {\n if (this.get('tab') === 'stats') {\n return 'active';\n }\n }).property('tab'),\n classProfile: (function() {\n var classes;\n classes = ['profile'];\n if (this.get('tab') === 'profile') {\n classes.push('active');\n }\n classes.push(Travis.app.get('authState'));\n return classes.join(' ');\n }).property('tab', 'Travis.app.authState'),\n showProfile: function() {\n return $('#top .profile ul').show();\n },\n hideProfile: function() {\n return $('#top .profile ul').hide();\n }\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=views/top"
),minispade.register("data/sponsors",'(function() {(function() {\n\n this.Travis.SPONSORS = [\n {\n type: \'platinum\',\n url: "http://www.wooga.com",\n image: "wooga-205x130.png"\n }, {\n type: \'platinum\',\n url: "http://bendyworks.com",\n image: "bendyworks-205x130.png"\n }, {\n type: \'platinum\',\n url: "http://cloudcontrol.com",\n image: "cloudcontrol-205x130.png"\n }, {\n type: \'platinum\',\n url: "http://xing.de",\n image: "xing-205x130.png"\n }, {\n type: \'gold\',\n url: "http://heroku.com",\n image: "heroku-205x60.png"\n }, {\n type: \'gold\',\n url: "http://soundcloud.com",\n image: "soundcloud-205x60.png"\n }, {\n type: \'gold\',\n url: "http://nedap.com",\n image: "nedap-205x60.png"\n }, {\n type: \'gold\',\n url: "http://mongohq.com",\n image: "mongohq-205x60.png"\n }, {\n type: \'gold\',\n url: "http://zweitag.de",\n image: "zweitag-205x60.png"\n }, {\n type: \'gold\',\n url: "http://kanbanery.com",\n image: "kanbanery-205x60.png"\n }, {\n type: \'gold\',\n url: "http://ticketevolution.com",\n image: "ticketevolution-205x60.jpg"\n }, {\n type: \'gold\',\n url: "http://plan.io/travis",\n image: "planio-205x60.png"\n }, {\n type: \'silver\',\n link: "Cobot: The one tool to run your coworking space"\n }, {\n type: \'silver\',\n link: "JumpstartLab: We build developers"\n }, {\n type: \'silver\',\n link: "Evil Martians: Agile Ruby on Rails development"\n }, {\n type: \'silver\',\n link: "Zendesk: Love your helpdesk"\n }, {\n type: \'silver\',\n link: "Stripe: Payments for developers"\n }, {\n type: \'silver\',\n link: "Basho: We make Riak!"\n }, {\n type: \'silver\',\n link: "Relevance: We deliver software solutions"\n }, {\n type: \'silver\',\n link: "Mindmatters: Software für Menschen"\n }, {\n type: \'silver\',\n link: "Amen: The best and worst of everything"\n }, {\n type: \'silver\',\n link: "Site5: Premium Web Hosting Solutions"\n }, {\n type: \'silver\',\n link: "Crowd Interactive: Leading Rails consultancy in Mexico"\n }, {\n type: \'silver\',\n link: "Atomic Object: Work with really smart people"\n }, {\n type: \'silver\',\n link: "Codeminer: smart services for your startup"\n }, {\n type: \'silver\',\n link: "Cloudant: grow into your data layer, not out of it"\n }, {\n type: \'silver\',\n link: "Gidsy: Explore, organize & book unique things to do!"\n }, {\n type: \'silver\',\n link: "5apps: Package & deploy HTML5 apps automatically"\n }, {\n type: \'silver\',\n link: "Meltmedia: We are Interactive Superheroes"\n }, {\n type: \'silver\',\n link: "Fingertips offers design and development services"\n }, {\n type: \'silver\',\n link: "Engine Yard: Build epic apps, let us handle the rest"\n }, {\n type: \'silver\',\n link: "Malwarebytes: Defeat Malware once and for all."\n }, {\n type: \'silver\',\n link: "Readmill: The best reading app on the iPad."\n }, {\n type: \'silver\',\n link: "Medidata: clinical tech improving quality of life"\n }, {\n type: \'silver\',\n link: "ESM: Japan\'s best agile Ruby/Rails consultancy"\n }, {\n type: \'silver\',\n link: "Twitter: instantly connects people everywhere"\n }, {\n type: \'silver\',\n link: "AGiLE ANiMAL: we <3 Travis CI."\n }, {\n type: \'silver\',\n link: "Tupalo: Discover, review & share local businesses."\n }\n ];\n\n}).call(this);\n\n})();\n//@ sourceURL=data/sponsors'
),minispade.register("emoij","(function() {(function() {\n\n this.EmojiDictionary = ['-1', '0', '1', '109', '2', '3', '4', '5', '6', '7', '8', '8ball', '9', 'a', 'ab', 'airplane', 'alien', 'ambulance', 'angel', 'anger', 'angry', 'apple', 'aquarius', 'aries', 'arrow_backward', 'arrow_down', 'arrow_forward', 'arrow_left', 'arrow_lower_left', 'arrow_lower_right', 'arrow_right', 'arrow_up', 'arrow_upper_left', 'arrow_upper_right', 'art', 'astonished', 'atm', 'b', 'baby', 'baby_chick', 'baby_symbol', 'balloon', 'bamboo', 'bank', 'barber', 'baseball', 'basketball', 'bath', 'bear', 'beer', 'beers', 'beginner', 'bell', 'bento', 'bike', 'bikini', 'bird', 'birthday', 'black_square', 'blue_car', 'blue_heart', 'blush', 'boar', 'boat', 'bomb', 'book', 'boot', 'bouquet', 'bow', 'bowtie', 'boy', 'bread', 'briefcase', 'broken_heart', 'bug', 'bulb', 'bullettrain_front', 'bullettrain_side', 'bus', 'busstop', 'cactus', 'cake', 'calling', 'camel', 'camera', 'cancer', 'capricorn', 'car', 'cat', 'cd', 'chart', 'checkered_flag', 'cherry_blossom', 'chicken', 'christmas_tree', 'church', 'cinema', 'city_sunrise', 'city_sunset', 'clap', 'clapper', 'clock1', 'clock10', 'clock11', 'clock12', 'clock2', 'clock3', 'clock4', 'clock5', 'clock6', 'clock7', 'clock8', 'clock9', 'closed_umbrella', 'cloud', 'clubs', 'cn', 'cocktail', 'coffee', 'cold_sweat', 'computer', 'confounded', 'congratulations', 'construction', 'construction_worker', 'convenience_store', 'cool', 'cop', 'copyright', 'couple', 'couple_with_heart', 'couplekiss', 'cow', 'crossed_flags', 'crown', 'cry', 'cupid', 'currency_exchange', 'curry', 'cyclone', 'dancer', 'dancers', 'dango', 'dart', 'dash', 'de', 'department_store', 'diamonds', 'disappointed', 'dog', 'dolls', 'dolphin', 'dress', 'dvd', 'ear', 'ear_of_rice', 'egg', 'eggplant', 'egplant', 'eight_pointed_black_star', 'eight_spoked_asterisk', 'elephant', 'email', 'es', 'european_castle', 'exclamation', 'eyes', 'factory', 'fallen_leaf', 'fast_forward', 'fax', 'fearful', 'feelsgood', 'feet', 'ferris_wheel', 'finnadie', 'fire', 'fire_engine', 'fireworks', 'fish', 'fist', 'flags', 'flushed', 'football', 'fork_and_knife', 'fountain', 'four_leaf_clover', 'fr', 'fries', 'frog', 'fuelpump', 'gb', 'gem', 'gemini', 'ghost', 'gift', 'gift_heart', 'girl', 'goberserk', 'godmode', 'golf', 'green_heart', 'grey_exclamation', 'grey_question', 'grin', 'guardsman', 'guitar', 'gun', 'haircut', 'hamburger', 'hammer', 'hamster', 'hand', 'handbag', 'hankey', 'hash', 'headphones', 'heart', 'heart_decoration', 'heart_eyes', 'heartbeat', 'heartpulse', 'hearts', 'hibiscus', 'high_heel', 'horse', 'hospital', 'hotel', 'hotsprings', 'house', 'hurtrealbad', 'icecream', 'id', 'ideograph_advantage', 'imp', 'information_desk_person', 'iphone', 'it', 'jack_o_lantern', 'japanese_castle', 'joy', 'jp', 'key', 'kimono', 'kiss', 'kissing_face', 'kissing_heart', 'koala', 'koko', 'kr', 'leaves', 'leo', 'libra', 'lips', 'lipstick', 'lock', 'loop', 'loudspeaker', 'love_hotel', 'mag', 'mahjong', 'mailbox', 'man', 'man_with_gua_pi_mao', 'man_with_turban', 'maple_leaf', 'mask', 'massage', 'mega', 'memo', 'mens', 'metal', 'metro', 'microphone', 'minidisc', 'mobile_phone_off', 'moneybag', 'monkey', 'monkey_face', 'moon', 'mortar_board', 'mount_fuji', 'mouse', 'movie_camera', 'muscle', 'musical_note', 'nail_care', 'necktie', 'new', 'no_good', 'no_smoking', 'nose', 'notes', 'o', 'o2', 'ocean', 'octocat', 'octopus', 'oden', 'office', 'ok', 'ok_hand', 'ok_woman', 'older_man', 'older_woman', 'open_hands', 'ophiuchus', 'palm_tree', 'parking', 'part_alternation_mark', 'pencil', 'penguin', 'pensive', 'persevere', 'person_with_blond_hair', 'phone', 'pig', 'pill', 'pisces', 'plus1', 'point_down', 'point_left', 'point_right', 'point_up', 'point_up_2', 'police_car', 'poop', 'post_office', 'postbox', 'pray', 'princess', 'punch', 'purple_heart', 'question', 'rabbit', 'racehorse', 'radio', 'rage', 'rage1', 'rage2', 'rage3', 'rage4', 'rainbow', 'raised_hands', 'ramen', 'red_car', 'red_circle', 'registered', 'relaxed', 'relieved', 'restroom', 'rewind', 'ribbon', 'rice', 'rice_ball', 'rice_cracker', 'rice_scene', 'ring', 'rocket', 'roller_coaster', 'rose', 'ru', 'runner', 'sa', 'sagittarius', 'sailboat', 'sake', 'sandal', 'santa', 'satellite', 'satisfied', 'saxophone', 'school', 'school_satchel', 'scissors', 'scorpius', 'scream', 'seat', 'secret', 'shaved_ice', 'sheep', 'shell', 'ship', 'shipit', 'shirt', 'shit', 'shoe', 'signal_strength', 'six_pointed_star', 'ski', 'skull', 'sleepy', 'slot_machine', 'smile', 'smiley', 'smirk', 'smoking', 'snake', 'snowman', 'sob', 'soccer', 'space_invader', 'spades', 'spaghetti', 'sparkler', 'sparkles', 'speaker', 'speedboat', 'squirrel', 'star', 'star2', 'stars', 'station', 'statue_of_liberty', 'stew', 'strawberry', 'sunflower', 'sunny', 'sunrise', 'sunrise_over_mountains', 'surfer', 'sushi', 'suspect', 'sweat', 'sweat_drops', 'swimmer', 'syringe', 'tada', 'tangerine', 'taurus', 'taxi', 'tea', 'telephone', 'tennis', 'tent', 'thumbsdown', 'thumbsup', 'ticket', 'tiger', 'tm', 'toilet', 'tokyo_tower', 'tomato', 'tongue', 'top', 'tophat', 'traffic_light', 'train', 'trident', 'trophy', 'tropical_fish', 'truck', 'trumpet', 'tshirt', 'tulip', 'tv', 'u5272', 'u55b6', 'u6307', 'u6708', 'u6709', 'u6e80', 'u7121', 'u7533', 'u7a7a', 'umbrella', 'unamused', 'underage', 'unlock', 'up', 'us', 'v', 'vhs', 'vibration_mode', 'virgo', 'vs', 'walking', 'warning', 'watermelon', 'wave', 'wc', 'wedding', 'whale', 'wheelchair', 'white_square', 'wind_chime', 'wink', 'wink2', 'wolf', 'woman', 'womans_hat', 'womens', 'x', 'yellow_heart', 'zap', 'zzz'];\n\n}).call(this);\n\n})();\n//@ sourceURL=emoij"
),minispade.register("ext/jquery","(function() {(function() {\n\n $.fn.extend({\n outerHtml: function() {\n return $(this).wrap('').parent().html();\n },\n outerElement: function() {\n return $($(this).outerHtml()).empty();\n },\n flash: function() {\n return Utils.flash(this);\n },\n unflash: function() {\n return Utils.unflash(this);\n },\n filterLog: function() {\n this.deansi();\n return this.foldLog();\n },\n deansi: function() {\n return this.html(Utils.deansi(this.html()));\n },\n foldLog: function() {\n return this.html(Utils.foldLog(this.html()));\n },\n unfoldLog: function() {\n return this.html(Utils.unfoldLog(this.html()));\n },\n updateTimes: function() {\n return Utils.updateTimes(this);\n },\n activateTab: function(tab) {\n return Utils.activateTab(this, tab);\n },\n timeInWords: function() {\n return $(this).each(function() {\n return $(this).text(Utils.timeInWords(parseInt($(this).attr('title'))));\n });\n },\n updateGithubStats: function(repository) {\n return Utils.updateGithubStats(repository, $(this));\n }\n });\n\n $.extend({\n isEmpty: function(obj) {\n if ($.isArray(obj)) {\n return !obj.length;\n } else if ($.isObject(obj)) {\n return !$.keys(obj).length;\n } else {\n return !obj;\n }\n },\n isObject: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Object]';\n },\n keys: function(obj) {\n var keys;\n keys = [];\n $.each(obj, function(key) {\n return keys.push(key);\n });\n return keys;\n },\n values: function(obj) {\n var values;\n values = [];\n $.each(obj, function(key, value) {\n return values.push(value);\n });\n return values;\n },\n underscore: function(string) {\n return string[0].toLowerCase() + string.substring(1).replace(/([A-Z])?/g, function(match, chr) {\n if (chr) {\n return \"_\" + (chr.toUpperCase());\n } else {\n return '';\n }\n });\n },\n camelize: function(string, uppercase) {\n string = uppercase === false ? $.underscore(string) : $.capitalize(string);\n return string.replace(/_(.)?/g, function(match, chr) {\n if (chr) {\n return chr.toUpperCase();\n } else {\n return '';\n }\n });\n },\n capitalize: function(string) {\n return string[0].toUpperCase() + string.substring(1);\n },\n compact: function(object) {\n return $.grep(object, function(value) {\n return !!value;\n });\n },\n all: function(array, callback) {\n var args, i;\n args = Array.prototype.slice.apply(arguments);\n callback = args.pop();\n array = args.pop() || this;\n i = 0;\n while (i < array.length) {\n if (callback(array[i])) {\n return false;\n }\n i++;\n }\n return true;\n },\n detect: function(array, callback) {\n var args, i;\n args = Array.prototype.slice.apply(arguments);\n callback = args.pop();\n array = args.pop() || this;\n i = 0;\n while (i < array.length) {\n if (callback(array[i])) {\n return array[i];\n }\n i++;\n }\n },\n select: function(array, callback) {\n var args, i, result;\n args = Array.prototype.slice.apply(arguments);\n callback = args.pop();\n array = args.pop() || this;\n result = [];\n i = 0;\n while (i < array.length) {\n if (callback(array[i])) {\n result.push(array[i]);\n }\n i++;\n }\n return result;\n },\n slice: function(object, key) {\n var keys, result;\n keys = Array.prototype.slice.apply(arguments);\n object = (typeof keys[0] === 'object' ? keys.shift() : this);\n result = {};\n for (key in object) {\n if (keys.indexOf(key) > -1) {\n result[key] = object[key];\n }\n }\n return result;\n },\n only: function(object) {\n var key, keys, result;\n keys = Array.prototype.slice.apply(arguments);\n object = (typeof keys[0] === 'object' ? keys.shift() : this);\n result = {};\n for (key in object) {\n if (keys.indexOf(key) !== -1) {\n result[key] = object[key];\n }\n }\n return result;\n },\n except: function(object) {\n var key, keys, result;\n keys = Array.prototype.slice.apply(arguments);\n object = (typeof keys[0] === 'object' ? keys.shift() : this);\n result = {};\n for (key in object) {\n if (keys.indexOf(key) === -1) {\n result[key] = object[key];\n }\n }\n return result;\n },\n intersect: function(array, other) {\n return array.filter(function(element) {\n return other.indexOf(element) !== -1;\n });\n },\n map: function(elems, callback, arg) {\n var i, isArray, key, length, ret, value;\n value = void 0;\n key = void 0;\n ret = [];\n i = 0;\n length = elems.length;\n isArray = elems instanceof jQuery || length !== void 0 && typeof length === 'number' && (length > 0 && elems[0] && elems[length - 1]) || length === 0 || jQuery.isArray(elems);\n if (isArray) {\n while (i < length) {\n value = callback(elems[i], i, arg);\n if (value != null) {\n ret[ret.length] = value;\n }\n i++;\n }\n } else {\n for (key in elems) {\n value = callback(elems[key], key, arg);\n if (value != null) {\n ret[ret.length] = value;\n }\n }\n }\n return ret.concat.apply([], ret);\n },\n shuffle: function(array) {\n var current, tmp, top;\n array = array.slice();\n top = array.length;\n while (top && --top) {\n current = Math.floor(Math.random() * (top + 1));\n tmp = array[current];\n array[current] = array[top];\n array[top] = tmp;\n }\n return array;\n },\n truncate: function(string, length) {\n if (string.length > length) {\n return string.trim().substring(0, length) + '...';\n } else {\n return string;\n }\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=ext/jquery"
),minispade.register("travis/ajax","(function() {(function() {\n\n jQuery.support.cors = true;\n\n this.Travis.Ajax = Ember.Mixin.create({\n DEFAULT_OPTIONS: {\n accepts: {\n json: 'application/vnd.travis-ci.2+json'\n }\n },\n post: function(url, data, callback) {\n return this.ajax(url, 'post', {\n data: data,\n success: callback\n });\n },\n ajax: function(url, method, options) {\n var accessToken, endpoint, _base, _ref;\n endpoint = Travis.config.api_endpoint || '';\n options = options || {};\n if (accessToken = (_ref = Travis.app) != null ? _ref.get('auth.accessToken') : void 0) {\n options.headers || (options.headers = {});\n (_base = options.headers)['Authorization'] || (_base['Authorization'] = \"token \" + accessToken);\n }\n options.url = \"\" + endpoint + url;\n options.type = method;\n options.dataType = 'json';\n options.contentType = 'application/json; charset=utf-8';\n options.context = this;\n if (options.data && method !== 'GET' && method !== 'get') {\n options.data = JSON.stringify(options.data);\n }\n return $.ajax($.extend(options, this.DEFAULT_OPTIONS));\n }\n });\n\n this.Travis.Ajax.instance = Em.Object.create(this.Travis.Ajax);\n\n $.extend(this.Travis, {\n get: function(url, callback) {\n return this.ajax(url, 'get', {\n success: callback\n });\n },\n post: function(url, data, callback) {\n return this.Ajax.instance.post(url, data, callback);\n },\n ajax: function(url, method, options) {\n return this.Ajax.instance.ajax(url, method, options);\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=travis/ajax"
),minispade.register("travis/expandable_record_array"
,"(function() {(function() {\n\n Travis.ExpandableRecordArray = DS.RecordArray.extend({\n isLoaded: false,\n isLoading: false,\n load: function(array) {\n var observer, self;\n this.set('isLoading', true);\n self = this;\n observer = function() {\n var content;\n if (this.get('isLoaded')) {\n content = self.get('content');\n array.removeObserver('isLoaded', observer);\n array.forEach(function(record) {\n return self.pushObject(record);\n });\n self.set('isLoading', false);\n return self.set('isLoaded', true);\n }\n };\n return array.addObserver('isLoaded', observer);\n },\n pushObject: function(record) {\n var clientId, id, ids;\n ids = this.get('content');\n id = record.get('id');\n clientId = record.get('clientId');\n if (ids.contains(clientId)) {\n return;\n }\n return ids.pushObject(clientId);\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=travis/expandable_record_array"
),minispade.register("travis/log","(function() {(function() {\n\n this.Travis.Log = {\n FOLDS: {\n schema: /(\\$ (?:bundle exec )?rake( db:create)? db:schema:load[\\s\\S]*?-- assume_migrated_upto_version[\\s\\S]*?<\\/p>\\n.*<\\/p>)/g,\n migrate: /(\\$ (?:bundle exec )?rake( db:create)? db:migrate[\\s\\S]*== +\\w+: migrated \\(.*\\) =+)/g,\n bundle: /(\\$ bundle install.*<\\/p>\\n((Updating|Using|Installing|Fetching|remote:|Receiving|Resolving).*?<\\/p>\\n|<\\/p>\\n)*)/g,\n exec: /([\\/\\w]*.rvm\\/rubies\\/[\\S]*?\\/(ruby|rbx|jruby) .*?<\\/p>)/g\n },\n filter: function(log) {\n log = this.escape(log);\n log = this.deansi(log);\n log = log.replace(/\\r/g, '');\n log = this.number(log);\n log = this.fold(log);\n log = log.replace(/\\n/g, '');\n return log;\n },\n stripPaths: function(log) {\n return log.replace(/\\/home\\/vagrant\\/builds(\\/[^\\/\\n]+){2}\\//g, '');\n },\n escape: function(log) {\n return Handlebars.Utils.escapeExpression(log);\n },\n escapeRuby: function(log) {\n return log.replace(/#<(\\w+.*?)>/, '#<$1>');\n },\n number: function(log) {\n var result;\n result = '';\n $.each(log.trim().split('\\n'), function(ix, line) {\n var number, path;\n number = ix + 1;\n path = Travis.Log.location().substr(1).replace(/\\/L\\d+/, '') + '/L' + number;\n return result += '%@%@
\\n'.fmt(path, path, number, number, line);\n });\n return result.trim();\n },\n deansi: function(log) {\n var ansi, text;\n log = log.replace(/\\r\\r/g, '\\r').replace(/\\033\\[K\\r/g, '\\r').replace(/^.*\\r(?!$)/gm, '').replace(/\\[2K/g, '').replace(/\\033\\(B/g, \"\");\n ansi = ansiparse(log);\n text = '';\n ansi.forEach(function(part) {\n var classes;\n classes = [];\n part.foreground && classes.push(part.foreground);\n part.background && classes.push('bg-' + part.background);\n part.bold && classes.push('bold');\n part.italic && classes.push('italic');\n return text += (classes.length ? '' + part.text + '' : part.text);\n });\n return text.replace(/\\033/g, '');\n },\n fold: function(log) {\n log = this.unfold(log);\n $.each(Travis.Log.FOLDS, function(name, pattern) {\n return log = log.replace(pattern, function() {\n return '' + arguments[1].trim() + '
';\n });\n });\n return log;\n },\n unfold: function(log) {\n return log.replace(/([\\s\\S]*?)<\\/div>/g, '$1\\n');\n },\n location: function() {\n return window.location.hash;\n }\n };\n\n}).call(this);\n\n})();\n//@ sourceURL=travis/log"
),minispade.register("travis/model","(function() {(function() {\n\n this.Travis.Model = DS.Model.extend({\n primaryKey: 'id',\n id: DS.attr('number'),\n refresh: function() {\n var id;\n id = this.get('id');\n if (id) {\n return Travis.app.store.adapter.find(Travis.app.store, this.constructor, id);\n }\n },\n update: function(attrs) {\n var _this = this;\n $.each(attrs, function(key, value) {\n if (key !== 'id') {\n return _this.set(key, value);\n }\n });\n return this;\n }\n });\n\n this.Travis.Model.reopenClass({\n find: function() {\n if (arguments.length === 0) {\n return Travis.app.store.findAll(this);\n } else {\n return this._super.apply(this, arguments);\n }\n },\n filter: function(callback) {\n return Travis.app.store.filter(this, callback);\n },\n load: function(attrs) {\n return Travis.app.store.load(this, attrs);\n },\n buildURL: function(suffix) {\n var base, url;\n base = this.url || this.pluralName();\n Ember.assert('Base URL (' + base + ') must not start with slash', !base || base.toString().charAt(0) !== '/');\n Ember.assert('URL suffix (' + suffix + ') must not start with slash', !suffix || suffix.toString().charAt(0) !== '/');\n url = [base];\n if (suffix !== void 0) {\n url.push(suffix);\n }\n return url.join('/');\n },\n singularName: function() {\n var name, parts;\n parts = this.toString().split('.');\n name = parts[parts.length - 1];\n return name.replace(/([A-Z])/g, '_$1').toLowerCase().slice(1);\n },\n pluralName: function() {\n return Travis.app.store.adapter.pluralize(this.singularName());\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=travis/model"
),minispade.register("travis/ticker","(function() {(function() {\n\n this.Travis.Ticker = Ember.Object.extend({\n init: function() {\n if (this.get('interval') !== -1) {\n return this.schedule();\n }\n },\n tick: function() {\n var context, target, targets, _i, _len;\n context = this.get('context');\n targets = this.get('targets') || [this.get('target')];\n for (_i = 0, _len = targets.length; _i < _len; _i++) {\n target = targets[_i];\n if (context) {\n target = context.get(target);\n }\n if (target) {\n target.tick();\n }\n }\n return this.schedule();\n },\n schedule: function() {\n var _this = this;\n return Ember.run.later((function() {\n return _this.tick();\n }), this.get('interval') || Travis.app.TICK_INTERVAL);\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=travis/ticker"
),minispade.register("travis","(function() {(function() {\nminispade.require('ext/jquery');\nminispade.require('ext/ember/namespace');\n\n this.Travis = Em.Namespace.create({\n config: {\n api_endpoint: $('meta[rel=\"travis.api_endpoint\"]').attr('href')\n },\n CONFIG_KEYS: ['rvm', 'gemfile', 'env', 'jdk', 'otp_release', 'php', 'node_js', 'perl', 'python', 'scala'],\n ROUTES: {\n 'profile/:login/me': ['profile', 'user'],\n 'profile/:login': ['profile', 'hooks'],\n 'profile': ['profile', 'hooks'],\n 'stats': ['stats', 'show'],\n ':owner/:name/jobs/:id/:line': ['home', 'job'],\n ':owner/:name/jobs/:id': ['home', 'job'],\n ':owner/:name/builds/:id': ['home', 'build'],\n ':owner/:name/builds': ['home', 'builds'],\n ':owner/:name/pull_requests': ['home', 'pullRequests'],\n ':owner/:name/branches': ['home', 'branches'],\n ':owner/:name': ['home', 'current'],\n '': ['home', 'index'],\n '#': ['home', 'index']\n },\n QUEUES: [\n {\n name: 'common',\n display: 'Common'\n }, {\n name: 'php',\n display: 'PHP, Perl and Python'\n }, {\n name: 'node_js',\n display: 'Node.js'\n }, {\n name: 'jvmotp',\n display: 'JVM and Erlang'\n }, {\n name: 'rails',\n display: 'Rails'\n }, {\n name: 'spree',\n display: 'Spree'\n }\n ],\n INTERVALS: {\n sponsors: -1,\n times: -1,\n updateTimes: 1000\n },\n run: function(attrs) {\n var _this = this;\n return $(function() {\n _this.redirectOnHashbang();\n return _this.loadConfig(function(config) {\n var app;\n app = Travis.App.create(attrs || {});\n $.each(Travis, function(key, value) {\n if (value && value.isClass && key !== 'constructor') {\n return app[key] = value;\n }\n });\n _this.app = app;\n _this.store = app.store;\n return app.initialize();\n });\n });\n },\n redirectOnHashbang: function() {\n if (location.hash.slice(0, 2) === '#!') {\n return location.href = location.href.replace('#!/', '');\n }\n },\n loadConfig: function(callback) {\n var _this = this;\n return this.get('/config', function(data) {\n $.extend(_this.config, data.config);\n console.log(\"Connecting to \" + data.config.api_endpoint);\n return callback(data.config);\n });\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=travis"
),minispade.register("templates",'(function() {\nEmber.TEMPLATES[\'application\'] = Ember.Handlebars.template(function anonymous(Handlebars,depth0,helpers,partials,data) {\nhelpers = helpers || Ember.Handlebars.helpers;\n var buffer = \'\', stack1, escapeExpression=this.escapeExpression;\n\n\n stack1 = helpers._triageMustache.call(depth0, "outlet", {hash:{},contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + "\\n\\n");\n return buffer;\n});\n\nEmber.TEMPLATES[\'builds/list\'] = Ember.Handlebars.template(function anonymous(Handlebars,depth0,helpers,partials,data) {\nhelpers = helpers || Ember.Handlebars.helpers;\n var buffer = \'\', stack1, escapeExpression=this.escapeExpression, self=this, helperMissing=helpers.helperMissing;\n\nfunction program1(depth0,data) {\n \n var buffer = \'\', stack1, foundHelper;\n data.buffer.push("\\n
\\n \\n \\n ");\n foundHelper = helpers[\'t\'];\n stack1 = foundHelper ? foundHelper.call(depth0, "builds.name", {hash:{},contexts:[depth0],data:data}) : helperMissing.call(depth0, "t", "builds.name", {hash:{},contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + " | \\n ");\n foundHelper = helpers[\'t\'];\n stack1 = foundHelper ? foundHelper.call(depth0, "builds.commit", {hash:{},contexts:[depth0],data:data}) : helperMissing.call(depth0, "t", "builds.commit", {hash:{},contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + " | \\n ");\n foundHelper = helpers[\'t\'];\n stack1 = foundHelper ? foundHelper.call(depth0, "builds.message", {hash:{},contexts:[depth0],data:data}) : helperMissing.call(depth0, "t", "builds.message", {hash:{},contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + " | \\n ");\n foundHelper = helpers[\'t\'];\n stack1 = foundHelper ? foundHelper.call(depth0, "builds.duration", {hash:{},contexts:[depth0],data:data}) : helperMissing.call(depth0, "t", "builds.duration", {hash:{},contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + " | \\n ");\n foundHelper = helpers[\'t\'];\n stack1 = foundHelper ? foundHelper.call(depth0, "builds.finished_at", {hash:{},contexts:[depth0],data:data}) : helperMissing.call(depth0, "t", "builds.finished_at", {hash:{},contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + " | \\n
\\n \\n\\n \\n ");\n stack1 = helpers.each.call(depth0, "build", "in", "builds", {hash:{},inverse:self.noop,fn:self.program(2, program2, data),contexts:[depth0,depth0,depth0],data:data});\n if(stack1 || stack1 === 0) { data.buffer.push(stack1); }\n data.buffer.push("\\n \\n
\\n
\\n ");\n stack1 = helpers.view.call(depth0, "view.ShowMoreButton", {hash:{},contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + "\\n
\\n");\n return buffer;}\nfunction program2(depth0,data) {\n \n var buffer = \'\', stack1;\n data.buffer.push("\\n ");\n stack1 = {};\n stack1[\'contextBinding\'] = "build";\n stack1 = helpers.view.call(depth0, "Travis.BuildsItemView", {hash:stack1,inverse:self.noop,fn:self.program(3, program3, data),contexts:[depth0],data:data});\n if(stack1 || stack1 === 0) { data.buffer.push(stack1); }\n data.buffer.push("\\n ");\n return buffer;}\nfunction program3(depth0,data) {\n \n var buffer = \'\', stack1, foundHelper;\n data.buffer.push("\\n
\\n \\n ");\n stack1 = helpers[\'if\'].call(depth0, "id", {hash:{},inverse:self.noop,fn:self.program(4, program4, data),contexts:[depth0],data:data});\n if(stack1 || stack1 === 0) { data.buffer.push(stack1); }\n data.buffer.push("\\n | \\n
\\n \\n ");\n foundHelper = helpers.formatCommit;\n stack1 = foundHelper ? foundHelper.call(depth0, "commit", {hash:{},contexts:[depth0],data:data}) : helperMissing.call(depth0, "formatCommit", "commit", {hash:{},contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + "\\n \\n | \\n
\\n ");\n stack1 = {};\n stack1[\'short\'] = "true";\n foundHelper = helpers.formatMessage;\n stack1 = foundHelper ? foundHelper.call(depth0, "commit.message", {hash:stack1,contexts:[depth0],data:data}) : helperMissing.call(depth0, "formatMessage", "commit.message", {hash:stack1,contexts:[depth0],data:data});\n if(stack1 || stack1 === 0) { data.buffer.push(stack1); }\n data.buffer.push("\\n | \\n
\\n ");\n foundHelper = helpers.formatDuration;\n stack1 = foundHelper ? foundHelper.call(depth0, "duration", {hash:{},contexts:[depth0],data:data}) : helperMissing.call(depth0, "formatDuration", "duration", {hash:{},contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + "\\n | \\n
\\n ");\n foundHelper = helpers.formatTime;\n stack1 = foundHelper ? foundHelper.call(depth0, "finishedAt", {hash:{},contexts:[depth0],data:data}) : helperMissing.call(depth0, "formatTime", "finishedAt", {hash:{},contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + "\\n | \\n ");\n return buffer;}\nfunction program4(depth0,data) {\n \n var buffer = \'\', stack1;\n data.buffer.push("\\n
\\n ");\n stack1 = helpers._triageMustache.call(depth0, "number", {hash:{},contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + "\\n \\n ");\n return buffer;}\n\nfunction program6(depth0,data) {\n \n \n data.buffer.push("\\n
Loading
\\n");}\n\n stack1 = helpers[\'if\'].call(depth0, "builds.isLoaded", {hash:{},inverse:self.program(6, program6, data),fn:self.program(1, program1, data),contexts:[depth0],data:data});\n if(stack1 || stack1 === 0) { data.buffer.push(stack1); }\n data.buffer.push("\\n\\n");\n return buffer;\n});\n\nEmber.TEMPLATES[\'builds/show\'] = Ember.Handlebars.template(function anonymous(Handlebars,depth0,helpers,partials,data) {\nhelpers = helpers || Ember.Handlebars.helpers;\n var buffer = \'\', stack1, escapeExpression=this.escapeExpression, helperMissing=helpers.helperMissing, self=this;\n\nfunction program1(depth0,data) {\n \n var buffer = \'\', stack1;\n data.buffer.push("\\n ");\n stack1 = helpers[\'if\'].call(depth0, "loading", {hash:{},inverse:self.program(4, program4, data),fn:self.program(2, program2, data),contexts:[depth0],data:data});\n if(stack1 || stack1 === 0) { data.buffer.push(stack1); }\n data.buffer.push("\\n");\n return buffer;}\nfunction program2(depth0,data) {\n \n \n data.buffer.push("\\n
Loading\\n ");}\n\nfunction program4(depth0,data) {\n \n var buffer = \'\', stack1, foundHelper;\n data.buffer.push("\\n
\\n \\n
- ");\n foundHelper = helpers[\'t\'];\n stack1 = foundHelper ? foundHelper.call(depth0, "builds.name", {hash:{},contexts:[depth0],data:data}) : helperMissing.call(depth0, "t", "builds.name", {hash:{},contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + "
\\n - \\n \\n ");\n stack1 = helpers[\'if\'].call(depth0, "build.id", {hash:{},inverse:self.noop,fn:self.program(5, program5, data),contexts:[depth0],data:data});\n if(stack1 || stack1 === 0) { data.buffer.push(stack1); }\n data.buffer.push("\\n
\\n - ");\n foundHelper = helpers[\'t\'];\n stack1 = foundHelper ? foundHelper.call(depth0, "builds.finished_at", {hash:{},contexts:[depth0],data:data}) : helperMissing.call(depth0, "t", "builds.finished_at", {hash:{},contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + "
\\n - ");\n foundHelper = helpers.formatTime;\n stack1 = foundHelper ? foundHelper.call(depth0, "build.finishedAt", {hash:{},contexts:[depth0],data:data}) : helperMissing.call(depth0, "formatTime", "build.finishedAt", {hash:{},contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + "
\\n - ");\n foundHelper = helpers[\'t\'];\n stack1 = foundHelper ? foundHelper.call(depth0, "builds.duration", {hash:{},contexts:[depth0],data:data}) : helperMissing.call(depth0, "t", "builds.duration", {hash:{},contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + "
\\n - ");\n foundHelper = helpers.formatDuration;\n stack1 = foundHelper ? foundHelper.call(depth0, "build.duration", {hash:{},contexts:[depth0],data:data}) : helperMissing.call(depth0, "formatDuration", "build.duration", {hash:{},contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + "
\\n \\n\\n \\n
- ");\n foundHelper = helpers[\'t\'];\n stack1 = foundHelper ? foundHelper.call(depth0, "builds.commit", {hash:{},contexts:[depth0],data:data}) : helperMissing.call(depth0, "t", "builds.commit", {hash:{},contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + "
\\n
- ");\n foundHelper = helpers.formatCommit;\n stack1 = foundHelper ? foundHelper.call(depth0, "build.commit", {hash:{},contexts:[depth0],data:data}) : helperMissing.call(depth0, "formatCommit", "build.commit", {hash:{},contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + "
\\n ");\n stack1 = helpers[\'if\'].call(depth0, "commit.compareUrl", {hash:{},inverse:self.noop,fn:self.program(7, program7, data),contexts:[depth0],data:data});\n if(stack1 || stack1 === 0) { data.buffer.push(stack1); }\n data.buffer.push("\\n ");\n stack1 = helpers[\'if\'].call(depth0, "commit.authorName", {hash:{},inverse:self.noop,fn:self.program(9, program9, data),contexts:[depth0],data:data});\n if(stack1 || stack1 === 0) { data.buffer.push(stack1); }\n data.buffer.push("\\n ");\n stack1 = helpers[\'if\'].call(depth0, "commit.committerName", {hash:{},inverse:self.noop,fn:self.program(11, program11, data),contexts:[depth0],data:data});\n if(stack1 || stack1 === 0) { data.buffer.push(stack1); }\n data.buffer.push("\\n
\\n\\n - ");\n foundHelper = helpers[\'t\'];\n stack1 = foundHelper ? foundHelper.call(depth0, "builds.message", {hash:{},contexts:[depth0],data:data}) : helperMissing.call(depth0, "t", "builds.message", {hash:{},contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + "
\\n - ");\n foundHelper = helpers.formatMessage;\n stack1 = foundHelper ? foundHelper.call(depth0, "build.commit.message", {hash:{},contexts:[depth0],data:data}) : helperMissing.call(depth0, "formatMessage", "build.commit.message", {hash:{},contexts:[depth0],data:data});\n if(stack1 || stack1 === 0) { data.buffer.push(stack1); }\n data.buffer.push("
\\n\\n ");\n stack1 = helpers.unless.call(depth0, "isMatrix", {hash:{},inverse:self.noop,fn:self.program(13, program13, data),contexts:[depth0],data:data});\n if(stack1 || stack1 === 0) { data.buffer.push(stack1); }\n data.buffer.push("\\n
\\n\\n ");\n stack1 = helpers[\'if\'].call(depth0, "build.isMatrix", {hash:{},inverse:self.program(17, program17, data),fn:self.program(15, program15, data),contexts:[depth0],data:data});\n if(stack1 || stack1 === 0) { data.buffer.push(stack1); }\n data.buffer.push("\\n ");\n return buffer;}\nfunction program5(depth0,data) {\n \n var buffer = \'\', stack1;\n data.buffer.push("\\n
");\n stack1 = helpers._triageMustache.call(depth0, "build.number", {hash:{},contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + "\\n ");\n return buffer;}\n\nfunction program7(depth0,data) {\n \n var buffer = \'\', stack1, foundHelper;\n data.buffer.push("\\n
");\n foundHelper = helpers[\'t\'];\n stack1 = foundHelper ? foundHelper.call(depth0, "builds.compare", {hash:{},contexts:[depth0],data:data}) : helperMissing.call(depth0, "t", "builds.compare", {hash:{},contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + "\\n
");\n foundHelper = helpers.pathFrom;\n stack1 = foundHelper ? foundHelper.call(depth0, "build.commit.compareUrl", {hash:{},contexts:[depth0],data:data}) : helperMissing.call(depth0, "pathFrom", "build.commit.compareUrl", {hash:{},contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + "\\n ");\n return buffer;}\n\nfunction program9(depth0,data) {\n \n var buffer = \'\', stack1, foundHelper;\n data.buffer.push("\\n
");\n foundHelper = helpers[\'t\'];\n stack1 = foundHelper ? foundHelper.call(depth0, "builds.author", {hash:{},contexts:[depth0],data:data}) : helperMissing.call(depth0, "t", "builds.author", {hash:{},contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + "\\n
");\n stack1 = helpers._triageMustache.call(depth0, "build.commit.authorName", {hash:{},contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + "\\n ");\n return buffer;}\n\nfunction program11(depth0,data) {\n \n var buffer = \'\', stack1, foundHelper;\n data.buffer.push("\\n
");\n foundHelper = helpers[\'t\'];\n stack1 = foundHelper ? foundHelper.call(depth0, "builds.committer", {hash:{},contexts:[depth0],data:data}) : helperMissing.call(depth0, "t", "builds.committer", {hash:{},contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + "\\n
");\n stack1 = helpers._triageMustache.call(depth0, "build.commit.committerName", {hash:{},contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + "\\n ");\n return buffer;}\n\nfunction program13(depth0,data) {\n \n var buffer = \'\', stack1, foundHelper;\n data.buffer.push("\\n
");\n foundHelper = helpers[\'t\'];\n stack1 = foundHelper ? foundHelper.call(depth0, "builds.config", {hash:{},contexts:[depth0],data:data}) : helperMissing.call(depth0, "t", "builds.config", {hash:{},contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + "\\n
");\n foundHelper = helpers.formatConfig;\n stack1 = foundHelper ? foundHelper.call(depth0, "build.config", {hash:{},contexts:[depth0],data:data}) : helperMissing.call(depth0, "formatConfig", "build.config", {hash:{},contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + "\\n ");\n return buffer;}\n\nfunction program15(depth0,data) {\n \n var buffer = \'\', stack1;\n data.buffer.push("\\n ");\n stack1 = {};\n stack1[\'jobsBinding\'] = "build.requiredJobs";\n stack1[\'required\'] = "true";\n stack1 = helpers.view.call(depth0, "Travis.JobsView", {hash:stack1,contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + "\\n ");\n stack1 = {};\n stack1[\'jobsBinding\'] = "build.allowedFailureJobs";\n stack1 = helpers.view.call(depth0, "Travis.JobsView", {hash:stack1,contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + "\\n ");\n return buffer;}\n\nfunction program17(depth0,data) {\n \n var buffer = \'\', stack1;\n data.buffer.push("\\n ");\n stack1 = {};\n stack1[\'contextBinding\'] = "build.jobs.firstObject";\n stack1 = helpers.view.call(depth0, "Travis.LogView", {hash:stack1,contexts:[depth0],data:data});\n data.buffer.push(escapeExpression(stack1) + "\\n ");\n return buffer;}\n\n stack1 = helpers[\'with\'].call(depth0, "view", {hash:{},inverse:self.noop,fn:self.program(1, program1, data),contexts:[depth0],data:data});\n if(stack1 || stack1 === 0) { data.buffer.push(stack1); }\n data.buffer.push("\\n\\n");\n return buffer;\n});\n\nEmber.TEMPLATES[\'jobs/list\'] = Ember.Handlebars.template(function anonymous(Handlebars,depth0,helpers,partials,data) {\nhelpers = helpers || Ember.Handlebars.helpers;\n var buffer = \'\', stack1, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, self=this;\n\nfunction program1(depth0,data) {\n \n var buffer = \'\', stack1;\n data.buffer.push("\\n ");\n stack1 = helpers[\'if\'].call(depth0, "view.required", {hash:{},inverse:self.program(4, program4, data),fn:self.program(2, program2, data),contexts:[depth0],data:data});\n if(stack1 || stack1 === 0) { data.buffer.push(stack1); }\n data.buffer.push("\\n
\\n \\n ");\n stack1 = helpers.each.call(depth0, "key", "in", "view.build.configKeys", {hash:{},inverse:self.noop,fn:self.program(6, program6, data),contexts:[depth0,depth0,depth0],data:data});\n if(stack1 || stack1 === 0) { data.buffer.push(stack1); }\n data.buffer.push("\\n
\\n \\n
\\n ");\n stack1 = helpers.each.call(depth0, "job", "in", "view.jobs", {hash:{},inverse:self.noop,fn:self.program(8, program8, data),contexts:[depth0,depth0,depth0],data:data});\n if(stack1 || stack1 === 0) { data.buffer.push(stack1); }\n data.buffer.push("\\n \\n