diff --git a/dist/css/perf.min-bc8dc410c505ea569cbde1797615c140.css b/dist/css/perf.min-6793d3025d5e4c0198d4ebbd6376da8c.css
similarity index 98%
rename from dist/css/perf.min-bc8dc410c505ea569cbde1797615c140.css
rename to dist/css/perf.min-6793d3025d5e4c0198d4ebbd6376da8c.css
index eea4d6b2b..3d49acf4a 100644
--- a/dist/css/perf.min-bc8dc410c505ea569cbde1797615c140.css
+++ b/dist/css/perf.min-6793d3025d5e4c0198d4ebbd6376da8c.css
@@ -2,7 +2,7 @@
* Bootstrap v3.2.0 (http://getbootstrap.com)
* Copyright 2011-2014 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */body,figure{margin:0}.img-thumbnail,.thumbnail{-o-transition:all .2s ease-in-out}.glyphicon,address,cite{font-style:normal}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.pre-scrollable{max-height:340px}.graph-legend,.graph-legend-table{table-layout:fixed}.fa,.glyphicon{-moz-osx-font-smoothing:grayscale}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;font-size:10px;-webkit-tap-highlight-color:transparent}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}b,optgroup,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{color:#000;background:#ff0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0;vertical-align:middle}svg:not(:root){overflow:hidden}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre,textarea{overflow:auto}code,kbd,pre,samp{font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}@media print{blockquote,img,pre,tr{page-break-inside:avoid}*{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href)")"}abbr[title]:after{content:" (" attr(title)")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999}thead{display:table-header-group}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}.img-thumbnail,body{background-color:#fff}.btn,.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-warning.active,.btn-warning:active,.btn.active,.btn:active,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover,.form-control,.navbar-toggle,.open>.dropdown-toggle.btn-danger,.open>.dropdown-toggle.btn-default,.open>.dropdown-toggle.btn-info,.open>.dropdown-toggle.btn-primary,.open>.dropdown-toggle.btn-warning{background-image:none}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix)format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff)format('woff'),url(../fonts/glyphicons-halflings-regular.ttf)format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular)format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-weight:400;line-height:1;-webkit-font-smoothing:antialiased}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:focus,a:hover{color:#2a6496;text-decoration:underline}a:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;width:100% \9;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;width:100% \9;max-width:100%;height:auto;padding:4px;line-height:1.42857143;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}code,pre{border-radius:4px}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}address,blockquote .small,blockquote footer,blockquote small,dd,dt,pre{line-height:1.42857143}dt,label{font-weight:700}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{list-style:none;padding-left:0}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}pre code,table{background-color:transparent}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}dl,ol,ul{margin-top:0}ol,ul{margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-inline{margin-left:-5px}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-bottom:20px}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}code,kbd{padding:2px 4px;font-size:90%}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}blockquote:after,blockquote:before{content:""}address{margin-bottom:20px}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{color:#c7254e;background-color:#f9f2f4}kbd{color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc}.container,.container-fluid{margin-right:auto;margin-left:auto}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;border-radius:0}.container,.container-fluid{padding-right:15px;padding-left:15px}.pre-scrollable{overflow-y:scroll}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.btn-group>.btn-group,.btn-toolbar .btn-group,.btn-toolbar .input-group,.dropdown-menu{float:left}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset,legend{padding:0;border:0}fieldset{min-width:0;margin:0}legend{display:block;width:100%;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal}.form-control,output{display:block;font-size:14px;line-height:1.42857143;color:#555}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}output{padding-top:7px}.form-control{width:100%;height:34px;padding:6px 12px;background-color:#fff;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#777;opacity:1}.form-control:-ms-input-placeholder{color:#777}.form-control::-webkit-input-placeholder{color:#777}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .form-control-feedback,.has-success .help-block,.has-success .radio,.has-success .radio-inline{color:#3c763d}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px;line-height:1.42857143 \0}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;min-height:20px;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px \9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.form-horizontal .form-group-sm .form-control,.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-horizontal .form-group-lg .form-control,.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:25px;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center}.collapsing,.dropdown{position:relative}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .form-control-feedback,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .form-control-feedback,.has-error .help-block,.has-error .radio,.has-error .radio-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .control-label,.form-inline .form-group{margin-bottom:0;vertical-align:middle}.form-inline .form-group{display:inline-block}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}.form-horizontal .form-group-lg .control-label{padding-top:14.3px}.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;border-radius:4px}.btn.active:focus,.btn:active:focus,.btn:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.active,.btn-default:active,.btn-default:focus,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary.active,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.active,.btn-success:active,.btn-success:focus,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.active,.btn-info:active,.btn-info:focus,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.active,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.active,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{height:0;overflow:hidden;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.input-group-addon:last-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.input-group-addon:first-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.btn-group-vertical>.btn:not(:first-child):not(:last-child),.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.dropdown-header,.dropdown-menu>li>a{white-space:nowrap;padding:3px 20px;line-height:1.42857143}.dropdown-menu-right,.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;clear:both;font-weight:400;color:#333}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;font-size:12px;color:#777}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.nav-justified>.dropdown .dropdown-menu,.nav-tabs.nav-justified>.dropdown .dropdown-menu{left:auto;top:auto}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group-vertical>.btn:focus,.btn-group>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn .caret,.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn-lg .caret{border-width:5px 5px 0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group,.input-group-btn>.btn+.btn{margin-left:-1px}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn>input[type=checkbox],[data-toggle=buttons]>.btn>input[type=radio]{position:absolute;z-index:-1;filter:alpha(opacity=0);opacity:0}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.nav>li,.nav>li>a{position:relative;display:block}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li>a{padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center;margin-right:0;border-radius:4px}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0;border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-justified>li,.nav-stacked>li{float:none}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#428bca}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.navbar,.navbar-toggle{border:1px solid transparent}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.navbar-form,.panel-heading{border-bottom:1px solid transparent}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar{border-radius:4px}.navbar-header{float:left}.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.embed-responsive,.modal,.modal-open,.progress{overflow:hidden}@media (max-width:480px)and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}.navbar-static-top{z-index:1000;border-width:0 0 1px}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-toggle{display:none}.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin:8px -15px}@media (min-width:768px){.navbar-form .control-label,.navbar-form .form-group{margin-bottom:0;vertical-align:middle}.navbar-form .form-group{display:inline-block}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}.btn .badge,.btn .label{position:relative;top:-1px}.breadcrumb>li,.pagination{display:inline-block}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-nav>li>a,.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#777}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>li>a,.navbar-inverse .navbar-text{color:#777}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#777}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#777}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{padding-left:0;margin:20px 0;border-radius:4px}.pager li,.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#428bca;text-decoration:none;background-color:#fff;border:1px solid #ddd}.badge,.label{text-align:center;font-weight:700;line-height:1;white-space:nowrap;vertical-align:baseline}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;color:#fff;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#428bca}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;color:#fff;background-color:#777;border-radius:10px}.badge:empty{display:none}.list-group-item,.media-object,.thumbnail{display:block}.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.nav-pills>.active>a>.badge,a.list-group-item.active>.badge{color:#428bca;background-color:#fff}.jumbotron,.jumbotron .h1,.jumbotron h1{color:inherit}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;background-color:#eee}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.alert .alert-link,.close{font-weight:700}.alert,.thumbnail{margin-bottom:20px}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron{border-radius:6px}.alert,.panel,.progress,.thumbnail{border-radius:4px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;border:1px solid transparent}.alert h4{margin-top:0;color:inherit}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;background-color:#f5f5f5;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.close,.list-group-item>.badge{float:right}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar[aria-valuenow="1"],.progress-bar[aria-valuenow="2"]{min-width:30px}.progress-bar[aria-valuenow="0"]{min-width:30px;color:#777;background-color:transparent;background-image:none;-webkit-box-shadow:none;box-shadow:none}.progress-striped .progress-bar-danger,.progress-striped .progress-bar-info,.progress-striped .progress-bar-success,.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.panel-heading>.dropdown .dropdown-toggle,.panel-title,.panel-title>a{color:inherit}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-title,.panel>.list-group,.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-top-left-radius:3px;border-top-right-radius:3px}.panel-group .panel-heading,.panel>.list-group:last-child .list-group-item:last-child,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel-title{margin-top:0;font-size:16px}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:last-child .list-group-item:last-child,.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.list-group+.panel-footer,.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#428bca}.panel-primary>.panel-heading .badge{color:#428bca;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{font-size:21px;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.carousel-caption,.carousel-control{text-shadow:0 1px 2px rgba(0,0,0,.6)}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate3d(0,-25%,0);-o-transform:translate3d(0,-25%,0);transform:translate3d(0,-25%,0)}.modal.in .modal-dialog{transform:translate3d(0,0,0)}.affix,.modal.in .modal-dialog{-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-content,.popover{-webkit-background-clip:padding-box}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.tooltip.bottom .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow{top:0;border-width:0 5px 5px;border-bottom-color:#000}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.tooltip.top .tooltip-arrow,.tooltip.top-left .tooltip-arrow,.tooltip.top-right .tooltip-arrow{bottom:0;border-width:5px 5px 0;border-top-color:#000}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.popover>.arrow,.popover>.arrow:after,.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip{position:absolute;z-index:1070;display:block;font-size:12px;line-height:1.4;visibility:visible;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip.top .tooltip-arrow{left:50%;margin-left:-5px}.tooltip.top-left .tooltip-arrow{left:5px}.tooltip.top-right .tooltip-arrow{right:5px}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{left:50%;margin-left:-5px}.tooltip.bottom-left .tooltip-arrow{left:5px}.tooltip.bottom-right .tooltip-arrow{right:5px}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.carousel-caption,.carousel-control,.carousel-indicators,.fa-fw,.fa-li{text-align:center}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{display:block}.carousel,.carousel-inner{position:relative}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.left>.arrow:after,.popover.right>.arrow:after{bottom:-10px;content:" "}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;border-right-width:0;border-left-color:#fff}.carousel-inner{width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:transparent;border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff}.carousel-caption .btn,.text-hide{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.hidden,.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;background-color:transparent;border:0}.hidden{visibility:hidden!important}.affix{position:fixed;transform:translate3d(0,0,0)}@-ms-viewport{width:device-width}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}.visible-xs-block{display:block!important}.visible-xs-inline{display:inline!important}.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px)and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}.visible-sm-block{display:block!important}.visible-sm-inline{display:inline!important}.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px)and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}.visible-md-block{display:block!important}.visible-md-inline{display:inline!important}.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}.visible-lg-block{display:block!important}.visible-lg-inline{display:inline!important}.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px)and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px)and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}.hidden-print{display:none!important}}.blink{animation:blink 1s ease-in-out infinite alternate;-webkit-animation:blink 1s ease-in-out infinite alternate}@keyframes blink{from{opacity:1}to{opacity:0}}@-webkit-keyframes blink{from{opacity:1}to{opacity:0}}.graph-legend .series-inactive{border-color:#D3D3D3;color:#D3D3D3}.ph-horizontal-layout{display:flex;flex-flow:row}#perf-logo{padding:15px;border:none;color:#555;background:#f8f8f8}#graph-chooser{flex:none;width:240px;padding:8px}#data-display{flex:auto}#graph{width:100%;height:300px;margin-bottom:30px}.graph-legend{padding:4px;text-overflow:ellipsis;font-size:12px}.graph-legend-table .show-hide-check{float:right;margin-top:-20px}.graph-right-padding{flex:none;width:200px}#graph-tooltip{position:absolute;visibility:hidden;pointer-events:none;width:280px}#unselect-test,.btn-group-vertical,.fa-ul>li{position:relative}#graph-tooltip.locked{pointer-events:auto}#graph-tooltip .body{display:block;background:rgba(0,0,0,.75);color:#fff;-moz-border-radius:5px;-webkit-border-radius:5px;padding:10px 15px}#graph-tooltip.locked .body{background:rgba(0,0,0,.9)}#graph-tooltip .body div,#graph-tooltip .body div:first-child{margin-top:.5em}#graph-tooltip .body p{margin:0}#graph-tooltip .body p.small{font-size:10px;color:silver}#graph-tooltip .body a{color:#c9e2f2}#graph-tooltip .tip{display:block;height:10px;background:url(../img/tip.png)center top no-repeat}#graph-tooltip.locked .tip{background-image:url(../img/tip-locked.png)}.reset-highlight-button{display:inline-block;margin-left:-20px;width:17px;cursor:pointer}#overview-plot{margin-top:5px;margin-bottom:10px;width:100%;height:100px;cursor:crosshair}.subtest-header{background-image:linear-gradient(to bottom,#6A7B86,#424F5A);color:#fff;font-weight:700}.subtest-improvement{background:green;color:#fff;font-weight:700}.subtest-regression{background:red;color:#fff;font-weight:700}.subtest-highlighted{font-weight:700}.subtest-empty,.subtest-result button{display:none}.subtest-result:hover button{display:inline-block}.graph-legend .signature{display:inline-block;max-width:100px;text-overflow:ellipsis;overflow:hidden}.modal-body{display:flex;justify-content:space-around;flex-flow:row;align-content:center}.test-chooser{flex:auto;width:280px}.btn-group-vertical{flex:none;top:245px;padding:3px}#unselect-test{bottom:4px}.test-list-container{flex:auto}.test-list-container .form-control{flex:none;height:273px;width:480px}.push-information{font-size:18px;color:#777}.vertical-box{display:flex;flex-flow:column}.spacer{flex:auto}.horizontal-box{display:flex;flex-flow:row}.centered-element{flex:none}.compare-form{align:center;display:flex;flex-flow:column}.compare-form .form-group{display:flex;flex-flow:row;flex:none}.fa,.fa-stack{display:inline-block}.compare-form .form-group .panel{flex:none;width:360px;height:250px;margin-right:15px;margin-bottom:0}.compare-form .button-container{width:740px;position:relative;left:-5px}.compare-form .form-group .input-group-btn{flex:none;width:10px}.compare-improvement{background-image:linear-gradient(to bottom,#80BB2E,#547D1C);color:#fff;font-weight:700}.compare-regression{background-image:linear-gradient(to bottom,#B20000,#940000);color:#fff;font-weight:700}.compare-notsure{background-image:linear-gradient(to bottom,#FF9500,#FFCB00)}.bar-improvement{background-color:green;margin-left:50%;height:1em;margin-bottom:5px}.bar-regression{background-color:red;margin-right:50%;height:1em;margin-bottom:5px}.run-detail{border-bottom:1px dotted #777;color:#999;cursor:default;vertical-align:top;font-size:80%}/*!
+ *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */body,figure{margin:0}.img-thumbnail,.thumbnail{-o-transition:all .2s ease-in-out}.glyphicon,address,cite{font-style:normal}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.pre-scrollable{max-height:340px}.graph-legend,.graph-legend-table{table-layout:fixed}.fa,.glyphicon{-moz-osx-font-smoothing:grayscale}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;font-size:10px;-webkit-tap-highlight-color:transparent}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}b,optgroup,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{color:#000;background:#ff0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0;vertical-align:middle}svg:not(:root){overflow:hidden}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre,textarea{overflow:auto}code,kbd,pre,samp{font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}@media print{blockquote,img,pre,tr{page-break-inside:avoid}*{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href)")"}abbr[title]:after{content:" (" attr(title)")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999}thead{display:table-header-group}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}.img-thumbnail,body{background-color:#fff}.btn,.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-warning.active,.btn-warning:active,.btn.active,.btn:active,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover,.form-control,.navbar-toggle,.open>.dropdown-toggle.btn-danger,.open>.dropdown-toggle.btn-default,.open>.dropdown-toggle.btn-info,.open>.dropdown-toggle.btn-primary,.open>.dropdown-toggle.btn-warning{background-image:none}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix)format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff)format('woff'),url(../fonts/glyphicons-halflings-regular.ttf)format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular)format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-weight:400;line-height:1;-webkit-font-smoothing:antialiased}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:focus,a:hover{color:#2a6496;text-decoration:underline}a:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;width:100% \9;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;width:100% \9;max-width:100%;height:auto;padding:4px;line-height:1.42857143;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}code,pre{border-radius:4px}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}address,blockquote .small,blockquote footer,blockquote small,dd,dt,pre{line-height:1.42857143}dt,label{font-weight:700}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{list-style:none;padding-left:0}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}pre code,table{background-color:transparent}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}dl,ol,ul{margin-top:0}ol,ul{margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-inline{margin-left:-5px}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-bottom:20px}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}code,kbd{padding:2px 4px;font-size:90%}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}blockquote:after,blockquote:before{content:""}address{margin-bottom:20px}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{color:#c7254e;background-color:#f9f2f4}kbd{color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc}.container,.container-fluid{margin-right:auto;margin-left:auto}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;border-radius:0}.container,.container-fluid{padding-right:15px;padding-left:15px}.pre-scrollable{overflow-y:scroll}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.btn-group>.btn-group,.btn-toolbar .btn-group,.btn-toolbar .input-group,.dropdown-menu{float:left}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset,legend{padding:0;border:0}fieldset{min-width:0;margin:0}legend{display:block;width:100%;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal}.form-control,output{display:block;font-size:14px;line-height:1.42857143;color:#555}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}output{padding-top:7px}.form-control{width:100%;height:34px;padding:6px 12px;background-color:#fff;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#777;opacity:1}.form-control:-ms-input-placeholder{color:#777}.form-control::-webkit-input-placeholder{color:#777}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .form-control-feedback,.has-success .help-block,.has-success .radio,.has-success .radio-inline{color:#3c763d}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px;line-height:1.42857143 \0}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;min-height:20px;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px \9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.form-horizontal .form-group-sm .form-control,.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-horizontal .form-group-lg .form-control,.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:25px;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center}.collapsing,.dropdown{position:relative}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .form-control-feedback,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .form-control-feedback,.has-error .help-block,.has-error .radio,.has-error .radio-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .control-label,.form-inline .form-group{margin-bottom:0;vertical-align:middle}.form-inline .form-group{display:inline-block}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}.form-horizontal .form-group-lg .control-label{padding-top:14.3px}.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;border-radius:4px}.btn.active:focus,.btn:active:focus,.btn:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.active,.btn-default:active,.btn-default:focus,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary.active,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.active,.btn-success:active,.btn-success:focus,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.active,.btn-info:active,.btn-info:focus,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.active,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.active,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{height:0;overflow:hidden;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.input-group-addon:last-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.input-group-addon:first-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.btn-group-vertical>.btn:not(:first-child):not(:last-child),.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.dropdown-header,.dropdown-menu>li>a{white-space:nowrap;padding:3px 20px;line-height:1.42857143}.dropdown-menu-right,.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;clear:both;font-weight:400;color:#333}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;font-size:12px;color:#777}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.nav-justified>.dropdown .dropdown-menu,.nav-tabs.nav-justified>.dropdown .dropdown-menu{left:auto;top:auto}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group-vertical>.btn:focus,.btn-group>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn .caret,.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn-lg .caret{border-width:5px 5px 0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group,.input-group-btn>.btn+.btn{margin-left:-1px}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn>input[type=checkbox],[data-toggle=buttons]>.btn>input[type=radio]{position:absolute;z-index:-1;filter:alpha(opacity=0);opacity:0}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.nav>li,.nav>li>a{position:relative;display:block}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li>a{padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center;margin-right:0;border-radius:4px}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0;border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-justified>li,.nav-stacked>li{float:none}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#428bca}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.navbar,.navbar-toggle{border:1px solid transparent}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.navbar-form,.panel-heading{border-bottom:1px solid transparent}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar{border-radius:4px}.navbar-header{float:left}.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.embed-responsive,.modal,.modal-open,.progress{overflow:hidden}@media (max-width:480px)and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}.navbar-static-top{z-index:1000;border-width:0 0 1px}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-toggle{display:none}.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin:8px -15px}@media (min-width:768px){.navbar-form .control-label,.navbar-form .form-group{margin-bottom:0;vertical-align:middle}.navbar-form .form-group{display:inline-block}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}.btn .badge,.btn .label{position:relative;top:-1px}.breadcrumb>li,.pagination{display:inline-block}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-nav>li>a,.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#777}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>li>a,.navbar-inverse .navbar-text{color:#777}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#777}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#777}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{padding-left:0;margin:20px 0;border-radius:4px}.pager li,.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#428bca;text-decoration:none;background-color:#fff;border:1px solid #ddd}.badge,.label{text-align:center;font-weight:700;line-height:1;white-space:nowrap;vertical-align:baseline}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;color:#fff;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#428bca}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;color:#fff;background-color:#777;border-radius:10px}.badge:empty{display:none}.list-group-item,.media-object,.thumbnail{display:block}.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.nav-pills>.active>a>.badge,a.list-group-item.active>.badge{color:#428bca;background-color:#fff}.jumbotron,.jumbotron .h1,.jumbotron h1{color:inherit}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;background-color:#eee}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.alert .alert-link,.close{font-weight:700}.alert,.thumbnail{margin-bottom:20px}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron{border-radius:6px}.alert,.panel,.progress,.thumbnail{border-radius:4px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;border:1px solid transparent}.alert h4{margin-top:0;color:inherit}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;background-color:#f5f5f5;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.close,.list-group-item>.badge{float:right}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar[aria-valuenow="1"],.progress-bar[aria-valuenow="2"]{min-width:30px}.progress-bar[aria-valuenow="0"]{min-width:30px;color:#777;background-color:transparent;background-image:none;-webkit-box-shadow:none;box-shadow:none}.progress-striped .progress-bar-danger,.progress-striped .progress-bar-info,.progress-striped .progress-bar-success,.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.panel-heading>.dropdown .dropdown-toggle,.panel-title,.panel-title>a{color:inherit}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-title,.panel>.list-group,.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-top-left-radius:3px;border-top-right-radius:3px}.panel-group .panel-heading,.panel>.list-group:last-child .list-group-item:last-child,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel-title{margin-top:0;font-size:16px}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:last-child .list-group-item:last-child,.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.list-group+.panel-footer,.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#428bca}.panel-primary>.panel-heading .badge{color:#428bca;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{font-size:21px;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.carousel-caption,.carousel-control{text-shadow:0 1px 2px rgba(0,0,0,.6)}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate3d(0,-25%,0);-o-transform:translate3d(0,-25%,0);transform:translate3d(0,-25%,0)}.modal.in .modal-dialog{transform:translate3d(0,0,0)}.affix,.modal.in .modal-dialog{-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-content,.popover{-webkit-background-clip:padding-box}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.tooltip.bottom .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow{top:0;border-width:0 5px 5px;border-bottom-color:#000}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.tooltip.top .tooltip-arrow,.tooltip.top-left .tooltip-arrow,.tooltip.top-right .tooltip-arrow{bottom:0;border-width:5px 5px 0;border-top-color:#000}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.popover>.arrow,.popover>.arrow:after,.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip{position:absolute;z-index:1070;display:block;font-size:12px;line-height:1.4;visibility:visible;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip.top .tooltip-arrow{left:50%;margin-left:-5px}.tooltip.top-left .tooltip-arrow{left:5px}.tooltip.top-right .tooltip-arrow{right:5px}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{left:50%;margin-left:-5px}.tooltip.bottom-left .tooltip-arrow{left:5px}.tooltip.bottom-right .tooltip-arrow{right:5px}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.carousel-caption,.carousel-control,.carousel-indicators,.fa-fw,.fa-li{text-align:center}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{display:block}.carousel,.carousel-inner{position:relative}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.left>.arrow:after,.popover.right>.arrow:after{bottom:-10px;content:" "}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;border-right-width:0;border-left-color:#fff}.carousel-inner{width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:transparent;border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff}.carousel-caption .btn,.text-hide{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.hidden,.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;background-color:transparent;border:0}.hidden{visibility:hidden!important}.affix{position:fixed;transform:translate3d(0,0,0)}@-ms-viewport{width:device-width}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}.visible-xs-block{display:block!important}.visible-xs-inline{display:inline!important}.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px)and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}.visible-sm-block{display:block!important}.visible-sm-inline{display:inline!important}.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px)and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}.visible-md-block{display:block!important}.visible-md-inline{display:inline!important}.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}.visible-lg-block{display:block!important}.visible-lg-inline{display:inline!important}.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px)and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px)and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}.hidden-print{display:none!important}}.blink{animation:blink 1s ease-in-out infinite alternate;-webkit-animation:blink 1s ease-in-out infinite alternate}@keyframes blink{from{opacity:1}to{opacity:0}}@-webkit-keyframes blink{from{opacity:1}to{opacity:0}}.graph-legend .series-inactive{border-color:#D3D3D3;color:#D3D3D3}.ph-horizontal-layout{display:flex;flex-flow:row}#perf-logo{padding:15px;border:none;color:#555;background:#f8f8f8}#graph-chooser{flex:none;width:240px;padding:8px}#data-display{flex:auto}#graph{width:100%;height:300px;margin-bottom:30px}.graph-legend{padding:4px;text-overflow:ellipsis;font-size:12px}.graph-legend-table .show-hide-check{float:right;margin-top:-20px}.graph-right-padding{flex:none;width:200px}#graph-tooltip{position:absolute;visibility:hidden;pointer-events:none;width:280px}#unselect-test,.btn-group-vertical,.fa-ul>li{position:relative}#graph-tooltip.locked{pointer-events:auto}#graph-tooltip .body{display:block;background:rgba(0,0,0,.75);color:#fff;-moz-border-radius:5px;-webkit-border-radius:5px;padding:10px 15px}#graph-tooltip.locked .body{background:rgba(0,0,0,.9)}#graph-tooltip .body div,#graph-tooltip .body div:first-child{margin-top:.5em}#graph-tooltip .body p{margin:0}#graph-tooltip .body p.small{font-size:10px;color:silver}#graph-tooltip .body a{color:#c9e2f2}.compare-improvement,.compare-regression,.subtest-header,.subtest-improvement,.subtest-regression{color:#fff;font-weight:700}#graph-tooltip .tip{display:block;height:10px;background:url(../img/tip.png)center top no-repeat}#graph-tooltip.locked .tip{background-image:url(../img/tip-locked.png)}.reset-highlight-button{display:inline-block;margin-left:-20px;width:17px;cursor:pointer}#overview-plot{margin-top:5px;margin-bottom:10px;width:100%;height:100px;cursor:crosshair}.subtest-header{background-image:linear-gradient(to bottom,#6A7B86,#424F5A)}.subtest-improvement{background:green}.subtest-regression{background:red}.subtest-highlighted{font-weight:700}.subtest-empty,.subtest-result button{display:none}.subtest-result:hover button{display:inline-block}.graph-legend .signature{display:inline-block;max-width:100px;text-overflow:ellipsis;overflow:hidden}.modal-body{display:flex;justify-content:space-around;flex-flow:row;align-content:center}.test-chooser{flex:auto;width:280px}.btn-group-vertical{flex:none;top:245px;padding:3px}#unselect-test{bottom:4px}.test-list-container{flex:auto}.test-list-container .form-control{flex:none;height:273px;width:480px}.vertical-box{display:flex;flex-flow:column}.spacer{flex:auto}.horizontal-box{display:flex;flex-flow:row}.centered-element{flex:none}.compare-form{align:center;display:flex;flex-flow:column}.compare-form .form-group{display:flex;flex-flow:row;flex:none}.fa,.fa-stack{display:inline-block}.compare-form .form-group .panel{flex:none;width:360px;height:250px;margin-right:15px;margin-bottom:0}.compare-form .button-container{width:740px;position:relative;left:-5px}.compare-form .form-group .input-group-btn{flex:none;width:10px}.compare-improvement{background-image:linear-gradient(to bottom,#80BB2E,#547D1C)}.compare-regression{background-image:linear-gradient(to bottom,#B20000,#940000)}.compare-notsure{background-image:linear-gradient(to bottom,#FF9500,#FFCB00)}.bar-improvement{background-color:green;margin-left:50%;height:1em;margin-bottom:5px}.bar-regression{background-color:red;margin-right:50%;height:1em;margin-bottom:5px}.run-detail{border-bottom:1px dotted #777;color:#999;cursor:default;vertical-align:top;font-size:80%}/*!
* Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
*/@font-face{font-family:FontAwesome;src:url(../fonts/fontawesome-webfont.eot?v=4.3.0);src:url(../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0)format('embedded-opentype'),url(../fonts/fontawesome-webfont.woff2?v=4.3.0)format('woff2'),url(../fonts/fontawesome-webfont.woff?v=4.3.0)format('woff'),url(../fonts/fontawesome-webfont.ttf?v=4.3.0)format('truetype'),url(../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular)format('svg');font-weight:400;font-style:normal}.fa{font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;transform:translate(0,0)}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before,.fa-genderless:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}
\ No newline at end of file
diff --git a/dist/index.html b/dist/index.html
index 1cd401f4c..4b2f2ecbd 100644
--- a/dist/index.html
+++ b/dist/index.html
@@ -31,7 +31,7 @@
-
+
diff --git a/dist/js/index.min-43642c525401be963f9f9f4d62d7cf56.js b/dist/js/index.min-d10428e9bc8a467758fe733d3c227357.js
similarity index 84%
rename from dist/js/index.min-43642c525401be963f9f9f4d62d7cf56.js
rename to dist/js/index.min-d10428e9bc8a467758fe733d3c227357.js
index 3943be4bd..566ae2052 100644
--- a/dist/js/index.min-43642c525401be963f9f9f4d62d7cf56.js
+++ b/dist/js/index.min-d10428e9bc8a467758fe733d3c227357.js
@@ -17,11 +17,11 @@ ngModelCtrl.$render())},$scope.enter=function(value){$scope.readonly||($scope.va
$templateCache.put("template/popover/popover.html",'
\n')}]),angular.module("template/progressbar/bar.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/progressbar/bar.html",'
\n')}]),angular.module("template/progressbar/progress.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/progressbar/progress.html",'
')}]),angular.module("template/progressbar/progressbar.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/progressbar/progressbar.html",'\n')}]),angular.module("template/rating/rating.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/rating/rating.html",'\n \n ({{ $index < value ? \'*\' : \' \' }}) \n \n ')}]),angular.module("template/tabs/tab.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/tabs/tab.html",'\n {{heading}} \n \n')}]),angular.module("template/tabs/tabset.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/tabs/tabset.html",'\n')}]),angular.module("template/timepicker/timepicker.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/timepicker/timepicker.html",'\n')}]),angular.module("template/typeahead/typeahead-match.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/typeahead/typeahead-match.html",' ')}]),angular.module("template/typeahead/typeahead-popup.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/typeahead/typeahead-popup.html",'\n')}]),!angular.$$csp()&&angular.element(document).find("head").prepend(''),"undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function($){"use strict";function transitionEnd(){var el=document.createElement("bootstrap"),transEndEventNames={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var name in transEndEventNames)if(void 0!==el.style[name])return{end:transEndEventNames[name]};return!1}$.fn.emulateTransitionEnd=function(duration){var called=!1,$el=this;$(this).one("bsTransitionEnd",function(){called=!0});var callback=function(){called||$($el).trigger($.support.transition.end)};return setTimeout(callback,duration),this},$(function(){$.support.transition=transitionEnd(),$.support.transition&&($.event.special.bsTransitionEnd={bindType:$.support.transition.end,delegateType:$.support.transition.end,handle:function(e){return $(e.target).is(this)?e.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.alert");data||$this.data("bs.alert",data=new Alert(this)),"string"==typeof option&&data[option].call($this)})}var dismiss='[data-dismiss="alert"]',Alert=function(el){$(el).on("click",dismiss,this.close)};Alert.VERSION="3.2.0",Alert.prototype.close=function(e){function removeElement(){$parent.detach().trigger("closed.bs.alert").remove()}var $this=$(this),selector=$this.attr("data-target");selector||(selector=$this.attr("href"),selector=selector&&selector.replace(/.*(?=#[^\s]*$)/,""));var $parent=$(selector);e&&e.preventDefault(),$parent.length||($parent=$this.hasClass("alert")?$this:$this.parent()),$parent.trigger(e=$.Event("close.bs.alert")),e.isDefaultPrevented()||($parent.removeClass("in"),$.support.transition&&$parent.hasClass("fade")?$parent.one("bsTransitionEnd",removeElement).emulateTransitionEnd(150):removeElement())};var old=$.fn.alert;$.fn.alert=Plugin,$.fn.alert.Constructor=Alert,$.fn.alert.noConflict=function(){return $.fn.alert=old,this},$(document).on("click.bs.alert.data-api",dismiss,Alert.prototype.close)}(jQuery),+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.button"),options="object"==typeof option&&option;data||$this.data("bs.button",data=new Button(this,options)),"toggle"==option?data.toggle():option&&data.setState(option)})}var Button=function(element,options){this.$element=$(element),this.options=$.extend({},Button.DEFAULTS,options),this.isLoading=!1};Button.VERSION="3.2.0",Button.DEFAULTS={loadingText:"loading..."},Button.prototype.setState=function(state){var d="disabled",$el=this.$element,val=$el.is("input")?"val":"html",data=$el.data();state+="Text",null==data.resetText&&$el.data("resetText",$el[val]()),$el[val](null==data[state]?this.options[state]:data[state]),setTimeout($.proxy(function(){"loadingText"==state?(this.isLoading=!0,$el.addClass(d).attr(d,d)):this.isLoading&&(this.isLoading=!1,$el.removeClass(d).removeAttr(d))},this),0)},Button.prototype.toggle=function(){var changed=!0,$parent=this.$element.closest('[data-toggle="buttons"]');if($parent.length){var $input=this.$element.find("input");"radio"==$input.prop("type")&&($input.prop("checked")&&this.$element.hasClass("active")?changed=!1:$parent.find(".active").removeClass("active")),changed&&$input.prop("checked",!this.$element.hasClass("active")).trigger("change")}changed&&this.$element.toggleClass("active")};var old=$.fn.button;$.fn.button=Plugin,$.fn.button.Constructor=Button,$.fn.button.noConflict=function(){return $.fn.button=old,this},$(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(e){var $btn=$(e.target);$btn.hasClass("btn")||($btn=$btn.closest(".btn")),Plugin.call($btn,"toggle"),e.preventDefault()})}(jQuery),+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.carousel"),options=$.extend({},Carousel.DEFAULTS,$this.data(),"object"==typeof option&&option),action="string"==typeof option?option:options.slide;data||$this.data("bs.carousel",data=new Carousel(this,options)),"number"==typeof option?data.to(option):action?data[action]():options.interval&&data.pause().cycle()})}var Carousel=function(element,options){this.$element=$(element).on("keydown.bs.carousel",$.proxy(this.keydown,this)),this.$indicators=this.$element.find(".carousel-indicators"),this.options=options,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter.bs.carousel",$.proxy(this.pause,this)).on("mouseleave.bs.carousel",$.proxy(this.cycle,this))};Carousel.VERSION="3.2.0",Carousel.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},Carousel.prototype.keydown=function(e){switch(e.which){case 37:this.prev();break;case 39:this.next();break;default:return}e.preventDefault()},Carousel.prototype.cycle=function(e){return e||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval($.proxy(this.next,this),this.options.interval)),this},Carousel.prototype.getItemIndex=function(item){return this.$items=item.parent().children(".item"),this.$items.index(item||this.$active)},Carousel.prototype.to=function(pos){var that=this,activeIndex=this.getItemIndex(this.$active=this.$element.find(".item.active"));return pos>this.$items.length-1||0>pos?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){that.to(pos)}):activeIndex==pos?this.pause().cycle():this.slide(pos>activeIndex?"next":"prev",$(this.$items[pos]))},Carousel.prototype.pause=function(e){return e||(this.paused=!0),this.$element.find(".next, .prev").length&&$.support.transition&&(this.$element.trigger($.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},Carousel.prototype.next=function(){return this.sliding?void 0:this.slide("next")},Carousel.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},Carousel.prototype.slide=function(type,next){var $active=this.$element.find(".item.active"),$next=next||$active[type](),isCycling=this.interval,direction="next"==type?"left":"right",fallback="next"==type?"first":"last",that=this;if(!$next.length){if(!this.options.wrap)return;$next=this.$element.find(".item")[fallback]()}if($next.hasClass("active"))return this.sliding=!1;var relatedTarget=$next[0],slideEvent=$.Event("slide.bs.carousel",{relatedTarget:relatedTarget,direction:direction});if(this.$element.trigger(slideEvent),!slideEvent.isDefaultPrevented()){if(this.sliding=!0,isCycling&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var $nextIndicator=$(this.$indicators.children()[this.getItemIndex($next)]);$nextIndicator&&$nextIndicator.addClass("active")}var slidEvent=$.Event("slid.bs.carousel",{relatedTarget:relatedTarget,direction:direction});return $.support.transition&&this.$element.hasClass("slide")?($next.addClass(type),$next[0].offsetWidth,$active.addClass(direction),$next.addClass(direction),$active.one("bsTransitionEnd",function(){$next.removeClass([type,direction].join(" ")).addClass("active"),$active.removeClass(["active",direction].join(" ")),that.sliding=!1,setTimeout(function(){that.$element.trigger(slidEvent)},0)}).emulateTransitionEnd(1e3*$active.css("transition-duration").slice(0,-1))):($active.removeClass("active"),$next.addClass("active"),this.sliding=!1,this.$element.trigger(slidEvent)),isCycling&&this.cycle(),this}};var old=$.fn.carousel;$.fn.carousel=Plugin,$.fn.carousel.Constructor=Carousel,$.fn.carousel.noConflict=function(){return $.fn.carousel=old,this},$(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(e){var href,$this=$(this),$target=$($this.attr("data-target")||(href=$this.attr("href"))&&href.replace(/.*(?=#[^\s]+$)/,""));if($target.hasClass("carousel")){var options=$.extend({},$target.data(),$this.data()),slideIndex=$this.attr("data-slide-to");slideIndex&&(options.interval=!1),Plugin.call($target,options),slideIndex&&$target.data("bs.carousel").to(slideIndex),e.preventDefault()}}),$(window).on("load",function(){$('[data-ride="carousel"]').each(function(){var $carousel=$(this);Plugin.call($carousel,$carousel.data())})})}(jQuery),+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.collapse"),options=$.extend({},Collapse.DEFAULTS,$this.data(),"object"==typeof option&&option);!data&&options.toggle&&"show"==option&&(option=!option),data||$this.data("bs.collapse",data=new Collapse(this,options)),"string"==typeof option&&data[option]()})}var Collapse=function(element,options){this.$element=$(element),this.options=$.extend({},Collapse.DEFAULTS,options),this.transitioning=null,this.options.parent&&(this.$parent=$(this.options.parent)),this.options.toggle&&this.toggle()};Collapse.VERSION="3.2.0",Collapse.DEFAULTS={toggle:!0},Collapse.prototype.dimension=function(){var hasWidth=this.$element.hasClass("width");return hasWidth?"width":"height"},Collapse.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var startEvent=$.Event("show.bs.collapse");if(this.$element.trigger(startEvent),!startEvent.isDefaultPrevented()){var actives=this.$parent&&this.$parent.find("> .panel > .in");if(actives&&actives.length){var hasData=actives.data("bs.collapse");if(hasData&&hasData.transitioning)return;Plugin.call(actives,"hide"),hasData||actives.data("bs.collapse",null)}var dimension=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[dimension](0),this.transitioning=1;var complete=function(){this.$element.removeClass("collapsing").addClass("collapse in")[dimension](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!$.support.transition)return complete.call(this);var scrollSize=$.camelCase(["scroll",dimension].join("-"));this.$element.one("bsTransitionEnd",$.proxy(complete,this)).emulateTransitionEnd(350)[dimension](this.$element[0][scrollSize])}}},Collapse.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var startEvent=$.Event("hide.bs.collapse");if(this.$element.trigger(startEvent),!startEvent.isDefaultPrevented()){var dimension=this.dimension();this.$element[dimension](this.$element[dimension]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var complete=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return $.support.transition?void this.$element[dimension](0).one("bsTransitionEnd",$.proxy(complete,this)).emulateTransitionEnd(350):complete.call(this)}}},Collapse.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var old=$.fn.collapse;$.fn.collapse=Plugin,$.fn.collapse.Constructor=Collapse,$.fn.collapse.noConflict=function(){return $.fn.collapse=old,this},$(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(e){var href,$this=$(this),target=$this.attr("data-target")||e.preventDefault()||(href=$this.attr("href"))&&href.replace(/.*(?=#[^\s]+$)/,""),$target=$(target),data=$target.data("bs.collapse"),option=data?"toggle":$this.data(),parent=$this.attr("data-parent"),$parent=parent&&$(parent);data&&data.transitioning||($parent&&$parent.find('[data-toggle="collapse"][data-parent="'+parent+'"]').not($this).addClass("collapsed"),$this[$target.hasClass("in")?"addClass":"removeClass"]("collapsed")),Plugin.call($target,option)})}(jQuery),+function($){"use strict";function clearMenus(e){e&&3===e.which||($(backdrop).remove(),$(toggle).each(function(){var $parent=getParent($(this)),relatedTarget={relatedTarget:this};$parent.hasClass("open")&&($parent.trigger(e=$.Event("hide.bs.dropdown",relatedTarget)),e.isDefaultPrevented()||$parent.removeClass("open").trigger("hidden.bs.dropdown",relatedTarget))}))}function getParent($this){var selector=$this.attr("data-target");selector||(selector=$this.attr("href"),selector=selector&&/#[A-Za-z]/.test(selector)&&selector.replace(/.*(?=#[^\s]*$)/,""));var $parent=selector&&$(selector);return $parent&&$parent.length?$parent:$this.parent()}function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.dropdown");data||$this.data("bs.dropdown",data=new Dropdown(this)),"string"==typeof option&&data[option].call($this)})}var backdrop=".dropdown-backdrop",toggle='[data-toggle="dropdown"]',Dropdown=function(element){$(element).on("click.bs.dropdown",this.toggle)};Dropdown.VERSION="3.2.0",Dropdown.prototype.toggle=function(e){var $this=$(this);if(!$this.is(".disabled, :disabled")){var $parent=getParent($this),isActive=$parent.hasClass("open");if(clearMenus(),!isActive){"ontouchstart"in document.documentElement&&!$parent.closest(".navbar-nav").length&&$('
').insertAfter($(this)).on("click",clearMenus);var relatedTarget={relatedTarget:this};if($parent.trigger(e=$.Event("show.bs.dropdown",relatedTarget)),e.isDefaultPrevented())return;$this.trigger("focus"),$parent.toggleClass("open").trigger("shown.bs.dropdown",relatedTarget)}return!1}},Dropdown.prototype.keydown=function(e){if(/(38|40|27)/.test(e.keyCode)){var $this=$(this);if(e.preventDefault(),e.stopPropagation(),!$this.is(".disabled, :disabled")){var $parent=getParent($this),isActive=$parent.hasClass("open");if(!isActive||isActive&&27==e.keyCode)return 27==e.which&&$parent.find(toggle).trigger("focus"),$this.trigger("click");var desc=" li:not(.divider):visible a",$items=$parent.find('[role="menu"]'+desc+', [role="listbox"]'+desc);if($items.length){var index=$items.index($items.filter(":focus"));38==e.keyCode&&index>0&&index--,40==e.keyCode&&index<$items.length-1&&index++,~index||(index=0),$items.eq(index).trigger("focus")}}}};var old=$.fn.dropdown;$.fn.dropdown=Plugin,$.fn.dropdown.Constructor=Dropdown,$.fn.dropdown.noConflict=function(){return $.fn.dropdown=old,this},$(document).on("click.bs.dropdown.data-api",clearMenus).on("click.bs.dropdown.data-api",".dropdown form",function(e){e.stopPropagation()}).on("click.bs.dropdown.data-api",toggle,Dropdown.prototype.toggle).on("keydown.bs.dropdown.data-api",toggle+', [role="menu"], [role="listbox"]',Dropdown.prototype.keydown)}(jQuery),+function($){"use strict";function Plugin(option,_relatedTarget){return this.each(function(){var $this=$(this),data=$this.data("bs.modal"),options=$.extend({},Modal.DEFAULTS,$this.data(),"object"==typeof option&&option);data||$this.data("bs.modal",data=new Modal(this,options)),"string"==typeof option?data[option](_relatedTarget):options.show&&data.show(_relatedTarget)})}var Modal=function(element,options){this.options=options,this.$body=$(document.body),this.$element=$(element),this.$backdrop=this.isShown=null,this.scrollbarWidth=0,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,$.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};Modal.VERSION="3.2.0",Modal.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},Modal.prototype.toggle=function(_relatedTarget){return this.isShown?this.hide():this.show(_relatedTarget)},Modal.prototype.show=function(_relatedTarget){var that=this,e=$.Event("show.bs.modal",{relatedTarget:_relatedTarget});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.$body.addClass("modal-open"),this.setScrollbar(),this.escape(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',$.proxy(this.hide,this)),this.backdrop(function(){var transition=$.support.transition&&that.$element.hasClass("fade");that.$element.parent().length||that.$element.appendTo(that.$body),that.$element.show().scrollTop(0),transition&&that.$element[0].offsetWidth,that.$element.addClass("in").attr("aria-hidden",!1),that.enforceFocus();var e=$.Event("shown.bs.modal",{relatedTarget:_relatedTarget});transition?that.$element.find(".modal-dialog").one("bsTransitionEnd",function(){that.$element.trigger("focus").trigger(e)}).emulateTransitionEnd(300):that.$element.trigger("focus").trigger(e)}))},Modal.prototype.hide=function(e){e&&e.preventDefault(),e=$.Event("hide.bs.modal"),this.$element.trigger(e),this.isShown&&!e.isDefaultPrevented()&&(this.isShown=!1,this.$body.removeClass("modal-open"),this.resetScrollbar(),this.escape(),$(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),$.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",$.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},Modal.prototype.enforceFocus=function(){$(document).off("focusin.bs.modal").on("focusin.bs.modal",$.proxy(function(e){this.$element[0]===e.target||this.$element.has(e.target).length||this.$element.trigger("focus")},this))},Modal.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",$.proxy(function(e){27==e.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},Modal.prototype.hideModal=function(){var that=this;this.$element.hide(),this.backdrop(function(){that.$element.trigger("hidden.bs.modal")})},Modal.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},Modal.prototype.backdrop=function(callback){var that=this,animate=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var doAnimate=$.support.transition&&animate;if(this.$backdrop=$('
').appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",$.proxy(function(e){e.target===e.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),doAnimate&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!callback)return;doAnimate?this.$backdrop.one("bsTransitionEnd",callback).emulateTransitionEnd(150):callback()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var callbackRemove=function(){that.removeBackdrop(),callback&&callback()};$.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",callbackRemove).emulateTransitionEnd(150):callbackRemove()}else callback&&callback()},Modal.prototype.checkScrollbar=function(){document.body.clientWidth>=window.innerWidth||(this.scrollbarWidth=this.scrollbarWidth||this.measureScrollbar())},Modal.prototype.setScrollbar=function(){var bodyPad=parseInt(this.$body.css("padding-right")||0,10);this.scrollbarWidth&&this.$body.css("padding-right",bodyPad+this.scrollbarWidth)},Modal.prototype.resetScrollbar=function(){this.$body.css("padding-right","")},Modal.prototype.measureScrollbar=function(){var scrollDiv=document.createElement("div");scrollDiv.className="modal-scrollbar-measure",this.$body.append(scrollDiv);var scrollbarWidth=scrollDiv.offsetWidth-scrollDiv.clientWidth;return this.$body[0].removeChild(scrollDiv),scrollbarWidth};var old=$.fn.modal;$.fn.modal=Plugin,$.fn.modal.Constructor=Modal,$.fn.modal.noConflict=function(){return $.fn.modal=old,this},$(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(e){var $this=$(this),href=$this.attr("href"),$target=$($this.attr("data-target")||href&&href.replace(/.*(?=#[^\s]+$)/,"")),option=$target.data("bs.modal")?"toggle":$.extend({remote:!/#/.test(href)&&href},$target.data(),$this.data());$this.is("a")&&e.preventDefault(),$target.one("show.bs.modal",function(showEvent){showEvent.isDefaultPrevented()||$target.one("hidden.bs.modal",function(){$this.is(":visible")&&$this.trigger("focus")})}),Plugin.call($target,option,this)})}(jQuery),+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.tooltip"),options="object"==typeof option&&option;(data||"destroy"!=option)&&(data||$this.data("bs.tooltip",data=new Tooltip(this,options)),"string"==typeof option&&data[option]())})}var Tooltip=function(element,options){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",element,options)};Tooltip.VERSION="3.2.0",Tooltip.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},Tooltip.prototype.init=function(type,element,options){this.enabled=!0,this.type=type,this.$element=$(element),this.options=this.getOptions(options),this.$viewport=this.options.viewport&&$(this.options.viewport.selector||this.options.viewport);for(var triggers=this.options.trigger.split(" "),i=triggers.length;i--;){var trigger=triggers[i];if("click"==trigger)this.$element.on("click."+this.type,this.options.selector,$.proxy(this.toggle,this));else if("manual"!=trigger){var eventIn="hover"==trigger?"mouseenter":"focusin",eventOut="hover"==trigger?"mouseleave":"focusout";this.$element.on(eventIn+"."+this.type,this.options.selector,$.proxy(this.enter,this)),this.$element.on(eventOut+"."+this.type,this.options.selector,$.proxy(this.leave,this))}}this.options.selector?this._options=$.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},Tooltip.prototype.getDefaults=function(){return Tooltip.DEFAULTS},Tooltip.prototype.getOptions=function(options){return options=$.extend({},this.getDefaults(),this.$element.data(),options),options.delay&&"number"==typeof options.delay&&(options.delay={show:options.delay,hide:options.delay}),options},Tooltip.prototype.getDelegateOptions=function(){var options={},defaults=this.getDefaults();return this._options&&$.each(this._options,function(key,value){defaults[key]!=value&&(options[key]=value)}),options},Tooltip.prototype.enter=function(obj){var self=obj instanceof this.constructor?obj:$(obj.currentTarget).data("bs."+this.type);return self||(self=new this.constructor(obj.currentTarget,this.getDelegateOptions()),$(obj.currentTarget).data("bs."+this.type,self)),clearTimeout(self.timeout),self.hoverState="in",self.options.delay&&self.options.delay.show?void(self.timeout=setTimeout(function(){"in"==self.hoverState&&self.show()},self.options.delay.show)):self.show()},Tooltip.prototype.leave=function(obj){var self=obj instanceof this.constructor?obj:$(obj.currentTarget).data("bs."+this.type);return self||(self=new this.constructor(obj.currentTarget,this.getDelegateOptions()),$(obj.currentTarget).data("bs."+this.type,self)),clearTimeout(self.timeout),self.hoverState="out",self.options.delay&&self.options.delay.hide?void(self.timeout=setTimeout(function(){"out"==self.hoverState&&self.hide()},self.options.delay.hide)):self.hide()},Tooltip.prototype.show=function(){var e=$.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(e);var inDom=$.contains(document.documentElement,this.$element[0]);if(e.isDefaultPrevented()||!inDom)return;var that=this,$tip=this.tip(),tipId=this.getUID(this.type);this.setContent(),$tip.attr("id",tipId),this.$element.attr("aria-describedby",tipId),this.options.animation&&$tip.addClass("fade");var placement="function"==typeof this.options.placement?this.options.placement.call(this,$tip[0],this.$element[0]):this.options.placement,autoToken=/\s?auto?\s?/i,autoPlace=autoToken.test(placement);autoPlace&&(placement=placement.replace(autoToken,"")||"top"),$tip.detach().css({top:0,left:0,display:"block"}).addClass(placement).data("bs."+this.type,this),this.options.container?$tip.appendTo(this.options.container):$tip.insertAfter(this.$element);var pos=this.getPosition(),actualWidth=$tip[0].offsetWidth,actualHeight=$tip[0].offsetHeight;if(autoPlace){var orgPlacement=placement,$parent=this.$element.parent(),parentDim=this.getPosition($parent);placement="bottom"==placement&&pos.top+pos.height+actualHeight-parentDim.scroll>parentDim.height?"top":"top"==placement&&pos.top-parentDim.scroll-actualHeight<0?"bottom":"right"==placement&&pos.right+actualWidth>parentDim.width?"left":"left"==placement&&pos.left-actualWidthviewportDimensions.top+viewportDimensions.height&&(delta.top=viewportDimensions.top+viewportDimensions.height-bottomEdgeOffset)}else{var leftEdgeOffset=pos.left-viewportPadding,rightEdgeOffset=pos.left+viewportPadding+actualWidth;leftEdgeOffsetviewportDimensions.width&&(delta.left=viewportDimensions.left+viewportDimensions.width-rightEdgeOffset)}return delta},Tooltip.prototype.getTitle=function(){var title,$e=this.$element,o=this.options;return title=$e.attr("data-original-title")||("function"==typeof o.title?o.title.call($e[0]):o.title)},Tooltip.prototype.getUID=function(prefix){do prefix+=~~(1e6*Math.random());while(document.getElementById(prefix));return prefix},Tooltip.prototype.tip=function(){return this.$tip=this.$tip||$(this.options.template)},Tooltip.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},Tooltip.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},Tooltip.prototype.enable=function(){this.enabled=!0},Tooltip.prototype.disable=function(){this.enabled=!1},Tooltip.prototype.toggleEnabled=function(){this.enabled=!this.enabled},Tooltip.prototype.toggle=function(e){var self=this;e&&(self=$(e.currentTarget).data("bs."+this.type),self||(self=new this.constructor(e.currentTarget,this.getDelegateOptions()),$(e.currentTarget).data("bs."+this.type,self))),self.tip().hasClass("in")?self.leave(self):self.enter(self)},Tooltip.prototype.destroy=function(){clearTimeout(this.timeout),this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var old=$.fn.tooltip;$.fn.tooltip=Plugin,$.fn.tooltip.Constructor=Tooltip,$.fn.tooltip.noConflict=function(){return $.fn.tooltip=old,this}}(jQuery),+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.popover"),options="object"==typeof option&&option;(data||"destroy"!=option)&&(data||$this.data("bs.popover",data=new Popover(this,options)),"string"==typeof option&&data[option]())})}var Popover=function(element,options){this.init("popover",element,options)};if(!$.fn.tooltip)throw new Error("Popover requires tooltip.js");Popover.VERSION="3.2.0",Popover.DEFAULTS=$.extend({},$.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),Popover.prototype=$.extend({},$.fn.tooltip.Constructor.prototype),Popover.prototype.constructor=Popover,Popover.prototype.getDefaults=function(){return Popover.DEFAULTS},Popover.prototype.setContent=function(){var $tip=this.tip(),title=this.getTitle(),content=this.getContent();$tip.find(".popover-title")[this.options.html?"html":"text"](title),$tip.find(".popover-content").empty()[this.options.html?"string"==typeof content?"html":"append":"text"](content),$tip.removeClass("fade top bottom left right in"),$tip.find(".popover-title").html()||$tip.find(".popover-title").hide()},Popover.prototype.hasContent=function(){return this.getTitle()||this.getContent()},Popover.prototype.getContent=function(){var $e=this.$element,o=this.options;return $e.attr("data-content")||("function"==typeof o.content?o.content.call($e[0]):o.content)},Popover.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},Popover.prototype.tip=function(){return this.$tip||(this.$tip=$(this.options.template)),this.$tip};var old=$.fn.popover;$.fn.popover=Plugin,$.fn.popover.Constructor=Popover,$.fn.popover.noConflict=function(){return $.fn.popover=old,this}}(jQuery),+function($){"use strict";function ScrollSpy(element,options){var process=$.proxy(this.process,this);this.$body=$("body"),this.$scrollElement=$($(element).is("body")?window:element),this.options=$.extend({},ScrollSpy.DEFAULTS,options),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",process),this.refresh(),this.process()}function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.scrollspy"),options="object"==typeof option&&option;data||$this.data("bs.scrollspy",data=new ScrollSpy(this,options)),"string"==typeof option&&data[option]()})}ScrollSpy.VERSION="3.2.0",ScrollSpy.DEFAULTS={offset:10},ScrollSpy.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},ScrollSpy.prototype.refresh=function(){var offsetMethod="offset",offsetBase=0;$.isWindow(this.$scrollElement[0])||(offsetMethod="position",offsetBase=this.$scrollElement.scrollTop()),this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight();var self=this;this.$body.find(this.selector).map(function(){var $el=$(this),href=$el.data("target")||$el.attr("href"),$href=/^#./.test(href)&&$(href);return $href&&$href.length&&$href.is(":visible")&&[[$href[offsetMethod]().top+offsetBase,href]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){self.offsets.push(this[0]),self.targets.push(this[1])})},ScrollSpy.prototype.process=function(){var i,scrollTop=this.$scrollElement.scrollTop()+this.options.offset,scrollHeight=this.getScrollHeight(),maxScroll=this.options.offset+scrollHeight-this.$scrollElement.height(),offsets=this.offsets,targets=this.targets,activeTarget=this.activeTarget;if(this.scrollHeight!=scrollHeight&&this.refresh(),scrollTop>=maxScroll)return activeTarget!=(i=targets[targets.length-1])&&this.activate(i);if(activeTarget&&scrollTop<=offsets[0])return activeTarget!=(i=targets[0])&&this.activate(i);for(i=offsets.length;i--;)activeTarget!=targets[i]&&scrollTop>=offsets[i]&&(!offsets[i+1]||scrollTop<=offsets[i+1])&&this.activate(targets[i])},ScrollSpy.prototype.activate=function(target){this.activeTarget=target,$(this.selector).parentsUntil(this.options.target,".active").removeClass("active");var selector=this.selector+'[data-target="'+target+'"],'+this.selector+'[href="'+target+'"]',active=$(selector).parents("li").addClass("active");active.parent(".dropdown-menu").length&&(active=active.closest("li.dropdown").addClass("active")),active.trigger("activate.bs.scrollspy")};var old=$.fn.scrollspy;$.fn.scrollspy=Plugin,$.fn.scrollspy.Constructor=ScrollSpy,$.fn.scrollspy.noConflict=function(){return $.fn.scrollspy=old,this},$(window).on("load.bs.scrollspy.data-api",function(){$('[data-spy="scroll"]').each(function(){var $spy=$(this);Plugin.call($spy,$spy.data())})})}(jQuery),+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.tab");data||$this.data("bs.tab",data=new Tab(this)),"string"==typeof option&&data[option]()})}var Tab=function(element){this.element=$(element)};Tab.VERSION="3.2.0",Tab.prototype.show=function(){var $this=this.element,$ul=$this.closest("ul:not(.dropdown-menu)"),selector=$this.data("target");if(selector||(selector=$this.attr("href"),selector=selector&&selector.replace(/.*(?=#[^\s]*$)/,"")),!$this.parent("li").hasClass("active")){var previous=$ul.find(".active:last a")[0],e=$.Event("show.bs.tab",{relatedTarget:previous});if($this.trigger(e),!e.isDefaultPrevented()){var $target=$(selector);this.activate($this.closest("li"),$ul),this.activate($target,$target.parent(),function(){$this.trigger({type:"shown.bs.tab",relatedTarget:previous})})}}},Tab.prototype.activate=function(element,container,callback){function next(){$active.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),element.addClass("active"),transition?(element[0].offsetWidth,element.addClass("in")):element.removeClass("fade"),element.parent(".dropdown-menu")&&element.closest("li.dropdown").addClass("active"),callback&&callback()}var $active=container.find("> .active"),transition=callback&&$.support.transition&&$active.hasClass("fade");transition?$active.one("bsTransitionEnd",next).emulateTransitionEnd(150):next(),$active.removeClass("in")};var old=$.fn.tab;$.fn.tab=Plugin,$.fn.tab.Constructor=Tab,$.fn.tab.noConflict=function(){return $.fn.tab=old,this},$(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(e){e.preventDefault(),Plugin.call($(this),"show")})}(jQuery),+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.affix"),options="object"==typeof option&&option;data||$this.data("bs.affix",data=new Affix(this,options)),"string"==typeof option&&data[option]()})}var Affix=function(element,options){this.options=$.extend({},Affix.DEFAULTS,options),this.$target=$(this.options.target).on("scroll.bs.affix.data-api",$.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",$.proxy(this.checkPositionWithEventLoop,this)),this.$element=$(element),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};Affix.VERSION="3.2.0",Affix.RESET="affix affix-top affix-bottom",Affix.DEFAULTS={offset:0,target:window},Affix.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(Affix.RESET).addClass("affix");var scrollTop=this.$target.scrollTop(),position=this.$element.offset();return this.pinnedOffset=position.top-scrollTop},Affix.prototype.checkPositionWithEventLoop=function(){setTimeout($.proxy(this.checkPosition,this),1)},Affix.prototype.checkPosition=function(){if(this.$element.is(":visible")){var scrollHeight=$(document).height(),scrollTop=this.$target.scrollTop(),position=this.$element.offset(),offset=this.options.offset,offsetTop=offset.top,offsetBottom=offset.bottom;"object"!=typeof offset&&(offsetBottom=offsetTop=offset),"function"==typeof offsetTop&&(offsetTop=offset.top(this.$element)),"function"==typeof offsetBottom&&(offsetBottom=offset.bottom(this.$element));var affix=null!=this.unpin&&scrollTop+this.unpin<=position.top?!1:null!=offsetBottom&&position.top+this.$element.height()>=scrollHeight-offsetBottom?"bottom":null!=offsetTop&&offsetTop>=scrollTop?"top":!1;if(this.affixed!==affix){null!=this.unpin&&this.$element.css("top","");var affixType="affix"+(affix?"-"+affix:""),e=$.Event(affixType+".bs.affix");this.$element.trigger(e),e.isDefaultPrevented()||(this.affixed=affix,this.unpin="bottom"==affix?this.getPinnedOffset():null,this.$element.removeClass(Affix.RESET).addClass(affixType).trigger($.Event(affixType.replace("affix","affixed"))),"bottom"==affix&&this.$element.offset({top:scrollHeight-this.$element.height()-offsetBottom}))}}};var old=$.fn.affix;$.fn.affix=Plugin,$.fn.affix.Constructor=Affix,$.fn.affix.noConflict=function(){return $.fn.affix=old,this},$(window).on("load",function(){$('[data-spy="affix"]').each(function(){var $spy=$(this),data=$spy.data();data.offset=data.offset||{},data.offsetBottom&&(data.offset.bottom=data.offsetBottom),data.offsetTop&&(data.offset.top=data.offsetTop),Plugin.call($spy,data)})})}(jQuery),function(){var a=angular.module("LocalStorageModule",[]);a.provider("localStorageService",function(){this.prefix="ls",this.cookie={expiry:30,path:"/"},this.notify={setItem:!0,removeItem:!1},this.setPrefix=function(b){this.prefix=b},this.setStorageCookie=function(c,b){this.cookie={expiry:c,path:b}},this.setNotify=function(b,c){this.notify={setItem:b,removeItem:c}},this.$get=["$rootScope",function(m){var h=this.prefix,c=this.cookie,p=this.notify;"."!==h.substr(-1)&&(h=h?h+".":"");var e=function(){try{var q="localStorage"in window&&null!==window.localStorage,r=h+"__"+Math.round(1e7*Math.random());return q&&(localStorage.setItem(r,""),localStorage.removeItem(r)),!0}catch(s){return m.$broadcast("LocalStorageModule.notification.error",s.message),!1}}(),i=function(q,r){if(!e)return m.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),p.setItem&&m.$broadcast("LocalStorageModule.notification.setitem",{key:q,newvalue:r,storageType:"cookie"}),j(q,r);"undefined"==typeof r&&(r=null);try{(angular.isObject(r)||angular.isArray(r))&&(r=angular.toJson(r)),localStorage.setItem(h+q,r),p.setItem&&m.$broadcast("LocalStorageModule.notification.setitem",{key:q,newvalue:r,storageType:"localStorage"})}catch(s){return m.$broadcast("LocalStorageModule.notification.error",s.message),j(q,r)}return!0},l=function(q){if(!e)return m.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),f(q);var r=localStorage.getItem(h+q);return r&&"null"!==r?"{"===r.charAt(0)||"["===r.charAt(0)?angular.fromJson(r):r:null},g=function(q){if(!e)return m.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),p.removeItem&&m.$broadcast("LocalStorageModule.notification.removeitem",{key:q,storageType:"cookie"}),n(q);try{localStorage.removeItem(h+q),p.removeItem&&m.$broadcast("LocalStorageModule.notification.removeitem",{key:q,storageType:"localStorage"})}catch(r){return m.$broadcast("LocalStorageModule.notification.error",r.message),n(q)}return!0},k=function(){if(!e)return m.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),!1;var q=h.length,s=[];for(var r in localStorage)if(r.substr(0,q)===h)try{s.push(r.substr(q))}catch(t){return m.$broadcast("LocalStorageModule.notification.error",t.Description),[]}return s},b=function(q){var q=q||"",v=h.slice(0,-1)+".",t=RegExp(v+q);if(!e)return m.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),d();var r=h.length;for(var s in localStorage)if(t.test(s))try{g(s.substr(r))}catch(u){return m.$broadcast("LocalStorageModule.notification.error",u.message),d()}return!0},o=function(){try{return navigator.cookieEnabled||"cookie"in document&&(document.cookie.length>0||(document.cookie="test").indexOf.call(document.cookie,"test")>-1)}catch(q){return m.$broadcast("LocalStorageModule.notification.error",q.message),!1}},j=function(s,t){if("undefined"==typeof t)return!1;if(!o())return m.$broadcast("LocalStorageModule.notification.error","COOKIES_NOT_SUPPORTED"),!1;try{var r="",q=new Date;null===t?(q.setTime(q.getTime()+-864e5),r="; expires="+q.toGMTString(),t=""):0!==c.expiry&&(q.setTime(q.getTime()+24*c.expiry*60*60*1e3),r="; expires="+q.toGMTString()),s&&(document.cookie=h+s+"="+encodeURIComponent(t)+r+"; path="+c.path)}catch(u){return m.$broadcast("LocalStorageModule.notification.error",u.message),!1}return!0},f=function(s){if(!o())return m.$broadcast("LocalStorageModule.notification.error","COOKIES_NOT_SUPPORTED"),!1;for(var t=document.cookie.split(";"),r=0;r95&&112>g||h.hasOwnProperty(g)&&(p[h[g]]=g)}e=p[d]?"keydown":"keypress"}return"keypress"==e&&f.length&&(e="keydown"),{key:c,modifiers:f,action:e}}function F(a,b,d,c,e){q[a+":"+d]=b,a=a.replace(/\s+/g," ");var f=a.split(" ");1":".","?":"/","|":"\\"},G={option:"alt",command:"meta","return":"enter",escape:"esc",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"meta":"ctrl"},l={},q={},n={},z=!1,I=!1,u=!1;for(f=1;20>f;++f)h[111+f]="f"+f;for(f=0;9>=f;++f)h[f+96]=f;s(r,"keypress",y),s(r,"keydown",y),s(r,"keyup",y);var m={bind:function(a,b,d){a=a instanceof Array?a:[a];for(var c=0;c1;return queue&&(duration/=2),settings.offset=both(settings.offset),settings.over=both(settings.over),this.each(function(){function animate(callback){var opts=$.extend({},settings,{queue:!0,duration:duration,complete:callback&&function(){callback.call(elem,targ,settings)}});$elem.animate(attr,opts)}if(null!==target){var toff,win=isWin(this),elem=win?this.contentWindow||window:this,$elem=$(elem),targ=target,attr={};switch(typeof targ){case"number":case"string":if(/^([+-]=?)?\d+(\.\d+)?(px|%)?$/.test(targ)){targ=both(targ);break}if(targ=win?$(targ):$(targ,elem),!targ.length)return;case"object":(targ.is||targ.style)&&(toff=(targ=$(targ)).offset())}var offset=$.isFunction(settings.offset)&&settings.offset(elem,targ)||settings.offset;$.each(settings.axis.split(""),function(i,axis){var Pos="x"===axis?"Left":"Top",pos=Pos.toLowerCase(),key="scroll"+Pos,prev=$elem[key](),max=$scrollTo.max(elem,axis);if(toff)attr[key]=toff[pos]+(win?0:prev-$elem.offset()[pos]),settings.margin&&(attr[key]-=parseInt(targ.css("margin"+Pos),10)||0,attr[key]-=parseInt(targ.css("border"+Pos+"Width"),10)||0),attr[key]+=offset[pos]||0,settings.over[pos]&&(attr[key]+=targ["x"===axis?"width":"height"]()*settings.over[pos]);else{var val=targ[pos];attr[key]=val.slice&&"%"===val.slice(-1)?parseFloat(val)/100*max:val}settings.limit&&/^\d+$/.test(attr[key])&&(attr[key]=attr[key]<=0?0:Math.min(attr[key],max)),!i&&settings.axis.length>1&&(prev===attr[key]?attr={}:queue&&(animate(settings.onAfterFirst),attr={}))}),animate(settings.onAfter)}})},$scrollTo.max=function(elem,axis){var Dim="x"===axis?"Width":"Height",scroll="scroll"+Dim;if(!isWin(elem))return elem[scroll]-$(elem)[Dim.toLowerCase()]();var size="client"+Dim,doc=elem.ownerDocument||elem.document,html=doc.documentElement,body=doc.body;return Math.max(html[scroll],body[scroll])-Math.min(html[size],body[size])},$.Tween.propHooks.scrollLeft=$.Tween.propHooks.scrollTop={get:function(t){return $(t.elem)[t.prop]()},set:function(t){var curr=this.get(t);if(t.options.interrupt&&t._last&&t._last!==curr)return $(t.elem).stop();var next=Math.round(t.now);curr!==next&&($(t.elem)[t.prop](next),t._last=this.get(t))}},$scrollTo})}("function"==typeof define&&define.amd?define:function(deps,factory){"use strict";"undefined"!=typeof module&&module.exports?module.exports=factory(require("jquery")):factory(jQuery)}),function(){function n(n,t){if(n!==t){var r=n===n,e=t===t;if(n>t||!r||n===w&&e)return 1;if(t>n||!e||t===w&&r)return-1}return 0}function t(n,t,r){for(var e=n.length,u=r?e:-1;r?u--:++u=n&&n>=9&&13>=n||32==n||160==n||5760==n||6158==n||n>=8192&&(8202>=n||8232==n||8233==n||8239==n||8287==n||12288==n||65279==n)}function v(n,t){for(var r=-1,e=n.length,u=-1,o=[];++re&&(e=u)}return e}function Hn(n,t){for(var r=-1,e=n.length;++ri(t,a,0)&&u.push(a);return u}function at(n,t){var r=!0;return Nu(n,function(n,e,u){return r=!!t(n,e,u)}),r}function ct(n,t){var r=[];return Nu(n,function(n,e,u){t(n,e,u)&&r.push(n)}),r}function lt(n,t,r,e){var u;return r(n,function(n,r,o){return t(n,r,o)?(u=e?r:n,!1):void 0}),u}function st(n,t,r){for(var e=-1,u=n.length,o=-1,i=[];++et&&(t=-t>u?0:u+t),r=r===w||r>u?u:+r||0,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=Ce(u);++eu?c*(e[u]?1:-1):c;break n}}u=t.b-r.b}return u})}function Wt(n,t){var r=0;return Nu(n,function(n,e,u){r+=+t(n,e,u)||0}),r}function Tt(n,t){var e=-1,u=dr(),o=n.length,i=u==r,f=i&&o>=200,a=f?zu():null,c=[];a?(u=Pn,i=!1):(f=!1,a=t?[]:c);n:for(;++eu(a,s,0)&&((t||f)&&a.push(s),c.push(l))}return c}function Ut(n,t){for(var r=-1,e=t.length,u=Ce(e);++r=u){for(;u>e;){var o=e+u>>>1,i=n[o];(r?t>=i:t>i)?e=o+1:u=o}return u}return Lt(n,t,Oe,r)}function Lt(n,t,r,e){t=r(t);for(var u=0,o=n?n.length:0,i=t!==t,f=t===w;o>u;){var a=nu((u+o)/2),c=r(n[a]),l=c===c;(i?l||e:f?l&&(e||c!==w):e?t>=c:t>c)?u=a+1:o=a}return du(o,Ou)}function Bt(n,t,r){if("function"!=typeof n)return Oe;if(t===w)return n;switch(r){case 1:return function(r){return n.call(t,r)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,o){return n.call(t,r,e,u,o)};case 5:return function(r,e,u,o,i){return n.call(t,r,e,u,o,i)}}return function(){return n.apply(t,arguments)}}function zt(n){return Xe.call(n,0)}function Mt(n,t,r){for(var e=r.length,u=-1,o=yu(n.length-e,0),i=-1,f=t.length,a=Ce(o+f);++i2&&r[u-2],i=u>2&&r[2],f=u>1&&r[u-1];for("function"==typeof o?(o=Bt(o,f,5),u-=2):(o="function"==typeof f?f:null,u-=o?1:0),i&&jr(r[0],r[1],i)&&(o=3>u?null:o,u=1);++e-1?e[u]:w):lt(e,u,n)}}function Qt(n){return function(r,e,u){return r&&r.length?(e=yr(e,u,3),t(r,e,n)):-1}}function nr(n){return function(t,r,e){return r=yr(r,e,3),lt(t,r,n,!0)}}function tr(n){return function(){var t=arguments.length;if(!t)return function(){return arguments[0]};for(var r,e=n?t:-1,u=0,o=Ce(t);n?e--:++earguments.length;return"function"==typeof e&&o===w&&Io(r)?n(r,e,u,i):Et(r,yr(e,o,4),u,i,t)}}function ar(n,t,r,e,u,o,i,f,a,c){function l(){for(var b=arguments.length,j=b,k=Ce(b);j--;)k[j]=arguments[j];if(e&&(k=Mt(k,e,u)),o&&(k=Dt(k,o,i)),_||y){var j=l.placeholder,O=v(k,j),b=b-O.length;if(c>b){var R=f?qn(f):null,b=yu(c-b,0),C=_?O:null,O=_?null:O,S=_?k:null,k=_?null:k;return t|=_?E:I,t&=~(_?I:E),g||(t&=~(x|A)),k=[n,t,r,S,C,k,O,R,a,b],R=ar.apply(w,k),Or(n)&&Ku(R,k),R.placeholder=j,R}}if(j=p?r:this,h&&(n=j[m]),f)for(R=k.length,b=du(f.length,R),C=qn(k);b--;)O=f[b],k[b]=Ar(O,R)?C[O]:w;return s&&an&&vu(t)?(t-=n,r=null==r?" ":r+"",be(r,He(t/r.length)).slice(0,t)):""}function lr(n,t,r,e){function u(){for(var t=-1,f=arguments.length,a=-1,c=e.length,l=Ce(f+c);++af||u)&&(t&x&&(r[2]=p[2],f|=e&x?0:j),(e=p[3])&&(u=r[3],r[3]=u?Mt(u,e,p[4]):qn(e),r[4]=u?v(r[3],B):qn(p[4])),(e=p[5])&&(u=r[5],r[5]=u?Dt(u,e,p[6]):qn(e),r[6]=u?v(r[5],B):qn(p[6])),(e=p[7])&&(r[7]=qn(e)),t&R&&(r[8]=null==r[8]?p[8]:du(r[8],p[8])),null==r[9]&&(r[9]=p[9]),r[0]=p[0],r[1]=f),t=r[1],f=r[9]),r[9]=null==f?a?0:n.length:yu(f-c,0)||0,(p?Bu:Ku)(t==x?Yt(r[0],r[2]):t!=E&&t!=(x|E)||r[4].length?ar.apply(w,r):lr.apply(w,r),r)}function hr(n,t,r,e,u,o,i){var f=-1,a=n.length,c=t.length,l=!0;if(a!=c&&(!u||a>=c))return!1;for(;l&&++fi:i>u)||i===e&&i===o)&&(u=i,o=n)}),o}function yr(n,t,r){var e=$n.callback||je,e=e===je?ut:e;return r?e(n,t,r):e}function dr(n,t,e){var u=$n.indexOf||zr,u=u===zr?r:u;return n?u(n,t,e):u}function mr(n){var t=n.length,r=new n.constructor(t);return t&&"string"==typeof n[0]&&Ke.call(n,"index")&&(r.index=n.index,r.input=n.input),r}function wr(n){return n=n.constructor,"function"==typeof n&&n instanceof n||(n=Fe),new n}function br(n,t,r){var e=n.constructor;switch(t){case J:return zt(n);case D:case P:return new e(+n);case X:case H:case Q:case nn:case tn:case rn:case en:case un:case on:return t=n.buffer,new e(r?zt(t):t,n.byteOffset,n.length);case V:case G:return new e(n);case Z:var u=new e(n.source,kn.exec(n));u.lastIndex=n.lastIndex}return u}function xr(n,t,r){return null==n||kr(t,n)||(t=Nr(t),n=1==t.length?n:gt(n,It(t,0,-1)),t=Mr(t)),t=null==n?n:n[t],null==t?w:t.apply(n,r)}function Ar(n,t){return n=+n,t=null==t?Ru:t,n>-1&&0==n%1&&t>n}function jr(n,t,r){if(!ae(r))return!1;var e=typeof t;return"number"==e?(e=Pu(r),e=Er(e)&&Ar(t,e)):e="string"==e&&t in r,e?(t=r[t],n===n?n===t:t!==t):!1}function kr(n,t){var r=typeof n;return"string"==r&&dn.test(n)||"number"==r?!0:Io(n)?!1:!yn.test(n)||null!=t&&n in Ur(t)}function Or(n){var t=Du(n);return!!t&&n===$n[t]&&t in zn.prototype}function Er(n){return"number"==typeof n&&n>-1&&0==n%1&&Ru>=n}function Ir(n){return n===n&&(0===n?1/n>0:!ae(n))}function Rr(n,t){n=Ur(n);for(var r=-1,e=t.length,u={};++rt?0:t)):[]}function Lr(n,t,r){var e=n?n.length:0;return e?((r?jr(n,t,r):null==t)&&(t=1),t=e-(+t||0),It(n,0,0>t?0:t)):[]}function Br(n){return n?n[0]:w}function zr(n,t,e){var u=n?n.length:0;if(!u)return-1;if("number"==typeof e)e=0>e?yu(u+e,0):e;else if(e)return e=$t(n,t),n=n[e],(t===t?t===n:n!==n)?e:-1;return r(n,t,e||0)}function Mr(n){var t=n?n.length:0;return t?n[t-1]:w}function Dr(n){return $r(n,1)}function Pr(n,t,e,u){if(!n||!n.length)return[];null!=t&&"boolean"!=typeof t&&(u=e,e=jr(n,t,u)?null:t,t=!1);var o=yr();if((o!==ut||null!=e)&&(e=o(e,u,3)),t&&dr()==r){t=e;var i;e=-1,u=n.length;for(var o=-1,f=[];++e>>0,e=Ce(r);++tr?yu(u+r,0):r||0,"string"==typeof n||!Io(n)&&pe(n)?u>r&&-10?n[Ot(0,t-1)]:w):(n=Qr(n),n.length=du(0>t?0:+t||0,n.length),n)}function Qr(n){n=Tr(n);for(var t=-1,r=n.length,e=Ce(r);++t=n&&(t=null),r}}function re(n,t,r){function e(){var r=t-(_o()-c);0>=r||r>t?(f&&Qe(f),r=p,f=s=p=w,r&&(h=_o(),a=n.apply(l,i),s||f||(i=l=null))):s=fu(e,r)}function u(){s&&Qe(s),f=s=p=w,(v||_!==t)&&(h=_o(),a=n.apply(l,i),s||f||(i=l=null))}function o(){if(i=arguments,c=_o(),l=this,p=v&&(s||!g),!1===_)var r=g&&!s;else{f||g||(h=c);var o=_-(c-h),y=0>=o||o>_;y?(f&&(f=Qe(f)),h=c,a=n.apply(l,i)):f||(f=fu(u,o))}return y&&s?s=Qe(s):s||t===_||(s=fu(e,t)),r&&(y=!0,a=n.apply(l,i)),!y||s||f||(i=l=null),a}var i,f,a,c,l,s,p,h=0,_=!1,v=!0;if("function"!=typeof n)throw new Be(L);if(t=0>t?0:+t||0,!0===r)var g=!0,v=!1;else ae(r)&&(g=r.leading,_="maxWait"in r&&yu(+r.maxWait||0,t),v="trailing"in r?r.trailing:v);return o.cancel=function(){s&&Qe(s),f&&Qe(f),f=s=p=w},o}function ee(n,t){function r(){var e=arguments,u=r.cache,o=t?t.apply(this,e):e[0];return u.has(o)?u.get(o):(e=n.apply(this,e),u.set(o,e),e)}if("function"!=typeof n||t&&"function"!=typeof t)throw new Be(L);return r.cache=new ee.Cache,r}function ue(n,t){if("function"!=typeof n)throw new Be(L);return t=yu(t===w?n.length-1:+t||0,0),function(){for(var r=arguments,e=-1,u=yu(r.length-t,0),o=Ce(u);++e0;++et||!n||!vu(t))return r;do t%2&&(r+=n),t=nu(t/2),n+=n;while(t);return r}function xe(n,t,r){var e=n;return(n=u(n))?(r?jr(e,t,r):null==t)?n.slice(g(n),y(n)+1):(t+="",n.slice(i(n,t),f(n,t)+1)):n}function Ae(n,t,r){return r&&jr(n,t,r)&&(t=null),n=u(n),n.match(t||Sn)||[]}function je(n,t,r){return r&&jr(n,t,r)&&(t=null),ut(n,t)}function ke(n){return function(){return n}}function Oe(n){return n}function Ee(n,t,r){if(null==r){var e=ae(t),u=e&&zo(t);((u=u&&u.length&&vt(t,u))?u.length:e)||(u=!1,r=t,t=n,n=this)}u||(u=vt(t,zo(t)));var o=!0,e=-1,i=Co(n),f=u.length;!1===r?o=!1:ae(r)&&"chain"in r&&(o=r.chain);for(;++e>>1,Iu=su?su.BYTES_PER_ELEMENT:0,Ru=Ue.pow(2,53)-1,Cu=lu&&new lu,Su={},Wu=$n.support={};!function(n){function t(){this.x=n}var r=[];t.prototype={valueOf:n,y:n};for(var e in new t)r.push(e);Wu.funcDecomp=/\bthis\b/.test(function(){return this}),Wu.funcNames="string"==typeof Te.name;try{Wu.dom=11===Pe.createDocumentFragment().nodeType}catch(u){Wu.dom=!1}try{Wu.nonEnumArgs=!ou.call(arguments,1)}catch(o){Wu.nonEnumArgs=!0}}(1,0),$n.templateSettings={escape:_n,evaluate:vn,interpolate:gn,variable:"",imports:{_:$n}};var Tu=pu||function(n,t){return null==t?n:et(t,qu(t),et(t,zo(t),n))},Uu=function(){function n(){}return function(t){if(ae(t)){n.prototype=t;var r=new n;n.prototype=null}return r||_.Object()}}(),Nu=Kt(ht),Fu=Kt(_t,!0),$u=Vt(),Lu=Vt(!0),Bu=Cu?function(n,t){return Cu.set(n,t),n}:Oe;Xe||(zt=Je&&cu?function(n){var t=n.byteLength,r=su?nu(t/Iu):0,e=r*Iu,u=new Je(t);if(r){var o=new su(u,0,r);o.set(new su(n,0,r))}return t!=e&&(o=new cu(u,e),o.set(new cu(n,e))),u}:ke(null));var zu=_u&&iu?function(n){return new Dn(n)}:ke(null),Mu=Cu?function(n){return Cu.get(n)}:Ie,Du=function(){return Wu.funcNames?"constant"==ke.name?At("name"):function(n){for(var t=n.name,r=Su[t],e=r?r.length:0;e--;){var u=r[e],o=u.func;if(null==o||o==n)return u.name}return t}:ke("")}(),Pu=At("length"),qu=tu?function(n){return tu(Ur(n))}:ke([]),Ku=function(){var n=0,t=0;return function(r,e){var u=_o(),o=U-(u-t);if(t=u,o>0){if(++n>=T)return r}else n=0;return Bu(r,e)}}(),Vu=ue(function(n,t){return Io(n)||oe(n)?ft(n,st(t,!1,!0)):[]}),Yu=Qt(),Zu=Qt(!0),Gu=ue(function(t,r){t||(t=[]),r=st(r);var e=rt(t,r);return kt(t,r.sort(n)),e}),Ju=sr(),Xu=sr(!0),Hu=ue(function(n){return Tt(st(n,!1,!0))}),Qu=ue(function(n,t){return Io(n)||oe(n)?ft(n,t):[]}),no=ue(qr),to=ue(function(n,t){var r=n?Pu(n):0;return Er(r)&&(n=Tr(n)),rt(n,st(t))}),ro=Pt(function(n,t,r){Ke.call(n,r)?++n[r]:n[r]=1}),eo=Ht(Nu),uo=Ht(Fu,!0),oo=rr(Kn,Nu),io=rr(function(n,t){for(var r=n.length;r--&&!1!==t(n[r],r,n););return n},Fu),fo=Pt(function(n,t,r){Ke.call(n,r)?n[r].push(t):n[r]=[t]}),ao=Pt(function(n,t,r){n[r]=t}),co=ue(function(n,t,r){var e=-1,u="function"==typeof t,o=kr(t),i=Pu(n),f=Er(i)?Ce(i):[];return Nu(n,function(n){var i=u?t:o&&null!=n&&n[t];f[++e]=i?i.apply(n,r):xr(n,t,r)}),f}),lo=Pt(function(n,t,r){n[r?0:1].push(t)},function(){return[[],[]]}),so=fr(function(n,t,r,e){var u=-1,o=n.length;for(e&&o&&(r=n[++u]);++uu&&(e=u)}return e},!0);return $n.prototype=Ln.prototype,Bn.prototype=Uu(Ln.prototype),Bn.prototype.constructor=Bn,zn.prototype=Uu(Ln.prototype),zn.prototype.constructor=zn,Mn.prototype["delete"]=function(n){return this.has(n)&&delete this.__data__[n]},Mn.prototype.get=function(n){return"__proto__"==n?w:this.__data__[n]},Mn.prototype.has=function(n){return"__proto__"!=n&&Ke.call(this.__data__,n)},Mn.prototype.set=function(n,t){return"__proto__"!=n&&(this.__data__[n]=t),this},Dn.prototype.push=function(n){var t=this.data;"string"==typeof n||ae(n)?t.set.add(n):t.hash[n]=!0},ee.Cache=Mn,$n.after=function(n,t){if("function"!=typeof t){if("function"!=typeof n)throw new Be(L);var r=n;n=t,t=r}return n=vu(n=+n)?n:0,function(){return 1>--n?t.apply(this,arguments):void 0}},$n.ary=function(n,t,r){return r&&jr(n,t,r)&&(t=null),t=n&&null==t?n.length:yu(+t||0,0),pr(n,R,null,null,null,null,t)},$n.assign=Wo,$n.at=to,$n.before=te,$n.bind=vo,$n.bindAll=go,$n.bindKey=yo,$n.callback=je,$n.chain=Vr,$n.chunk=function(n,t,r){t=(r?jr(n,t,r):null==t)?1:yu(+t||1,1),r=0;for(var e=n?n.length:0,u=-1,o=Ce(He(e/t));e>r;)o[++u]=It(n,r,r+=t);return o},$n.compact=function(n){for(var t=-1,r=n?n.length:0,e=-1,u=[];++tr&&(r=-r>u?0:u+r),e=e===w||e>u?u:+e||0,0>e&&(e+=u),u=r>e?0:e>>>0,r>>>=0;u>r;)n[r++]=t;return n},$n.filter=Gr,$n.flatten=function(n,t,r){var e=n?n.length:0;return r&&jr(n,t,r)&&(t=!1),e?st(n,t):[]},$n.flattenDeep=function(n){return n&&n.length?st(n,!0):[]},$n.flow=Ao,$n.flowRight=jo,$n.forEach=oo,$n.forEachRight=io,$n.forIn=Fo,$n.forInRight=$o,$n.forOwn=Lo,$n.forOwnRight=Bo,$n.functions=ve,$n.groupBy=fo,$n.indexBy=ao,$n.initial=function(n){return Lr(n,1)},$n.intersection=function(){for(var n=[],t=-1,e=arguments.length,u=[],o=dr(),i=o==r,f=[];++te)return f;var i=n[0],c=-1,l=i?i.length:0,s=u[0];n:for(;++c(s?Pn(s,a):o(f,a,0))){for(t=e;--t;){var p=u[t];if(0>(p?Pn(p,a):o(n[t],a,0)))continue n}s&&s.push(a),f.push(a)}return f},$n.invert=function(n,t,r){r&&jr(n,t,r)&&(t=null),r=-1;for(var e=zo(n),u=e.length,o={};++rt?0:t)):[]},$n.takeRight=function(n,t,r){var e=n?n.length:0;return e?((r?jr(n,t,r):null==t)&&(t=1),t=e-(+t||0),It(n,0>t?0:t)):[]},$n.takeRightWhile=function(n,t,r){return n&&n.length?Nt(n,yr(t,r,3),!1,!0):[]},$n.takeWhile=function(n,t,r){return n&&n.length?Nt(n,yr(t,r,3)):[]},$n.tap=function(n,t,r){return t.call(r,n),n},$n.throttle=function(n,t,r){var e=!0,u=!0;if("function"!=typeof n)throw new Be(L);return!1===r?e=!1:ae(r)&&(e="leading"in r?!!r.leading:e,u="trailing"in r?!!r.trailing:u),Fn.leading=e,Fn.maxWait=+t,Fn.trailing=u,re(n,t,Fn)},$n.thru=Yr,$n.times=function(n,t,r){if(n=nu(n),1>n||!vu(n))return[];var e=-1,u=Ce(du(n,ku));for(t=Bt(t,r,1);++ee?u[e]=t(e):t(e);return u},$n.toArray=function(n){var t=n?Pu(n):0;return Er(t)?t?qn(n):[]:ye(n)},$n.toPlainObject=_e,$n.transform=function(n,t,r,e){var u=Io(n)||he(n);return t=yr(t,e,4),null==r&&(u||ae(n)?(e=n.constructor,r=u?Io(n)?new e:[]:Uu(Co(e)&&e.prototype)):r={}),(u?Kn:ht)(n,function(n,e,u){return t(r,n,e,u)}),r},$n.union=Hu,$n.uniq=Pr,$n.unzip=qr,$n.values=ye,$n.valuesIn=function(n){return Ut(n,ge(n))},$n.where=function(n,t){return Gr(n,wt(t))},$n.without=Qu,$n.wrap=function(n,t){return t=null==t?Oe:t,pr(t,E,null,[n],[])},$n.xor=function(){for(var n=-1,t=arguments.length;++nr?0:+r||0,e),r-=t.length,r>=0&&n.indexOf(t,r)==r},$n.escape=function(n){return(n=u(n))&&hn.test(n)?n.replace(sn,l):n},$n.escapeRegExp=me,$n.every=Zr,$n.find=eo,$n.findIndex=Yu,$n.findKey=Uo,$n.findLast=uo,$n.findLastIndex=Zu,$n.findLastKey=No,$n.findWhere=function(n,t){return eo(n,wt(t))},$n.first=Br,$n.get=function(n,t,r){return n=null==n?w:gt(n,Nr(t),t+""),n===w?r:n},$n.has=function(n,t){if(null==n)return!1;var r=Ke.call(n,t);return r||kr(t)||(t=Nr(t),n=1==t.length?n:gt(n,It(t,0,-1)),t=Mr(t),r=null!=n&&Ke.call(n,t)),r},$n.identity=Oe,$n.includes=Jr,$n.indexOf=zr,$n.inRange=function(n,t,r){return t=+t||0,"undefined"==typeof r?(r=t,t=0):r=+r||0,n>=du(t,r)&&nr?yu(e+r,0):du(r||0,e-1))+1;else if(r)return u=$t(n,t,!0)-1,n=n[u],(t===t?t===n:n!==n)?u:-1;if(t!==t)return p(n,u,!0);for(;u--;)if(n[u]===t)return u;return-1},$n.max=Qo,$n.min=ni,$n.noConflict=function(){return _._=Ze,this},$n.noop=Ie,$n.now=_o,$n.pad=function(n,t,r){n=u(n),t=+t;var e=n.length;return t>e&&vu(t)?(e=(t-e)/2,t=nu(e),e=He(e),r=cr("",e,r),r.slice(0,t)+n+r):n},$n.padLeft=Vo,$n.padRight=Yo,$n.parseInt=we,$n.random=function(n,t,r){r&&jr(n,t,r)&&(t=r=null);var e=null==n,u=null==t;return null==r&&(u&&"boolean"==typeof n?(r=n,n=1):"boolean"==typeof t&&(r=t,u=!0)),e&&u&&(t=1,u=!1),n=+n||0,u?(t=n,n=0):t=+t||0,r||n%1||t%1?(r=xu(),du(n+r*(t-n+parseFloat("1e-"+((r+"").length-1))),t)):Ot(n,t)},$n.reduce=so,$n.reduceRight=po,$n.repeat=be,$n.result=function(n,t,r){var e=null==n?w:n[t];return e===w&&(null==n||kr(t,n)||(t=Nr(t),n=1==t.length?n:gt(n,It(t,0,-1)),e=null==n?w:n[Mr(t)]),e=e===w?r:e),Co(e)?e.call(n):e},$n.runInContext=m,$n.size=function(n){var t=n?Pu(n):0;return Er(t)?t:zo(n).length},$n.snakeCase=Zo,$n.some=ne,$n.sortedIndex=Ju,$n.sortedLastIndex=Xu,$n.startCase=Go,$n.startsWith=function(n,t,r){return n=u(n),r=null==r?0:du(0>r?0:+r||0,n.length),n.lastIndexOf(t,r)==r},$n.sum=function(n,t,r){r&&jr(n,t,r)&&(t=null);var e=yr(),u=null==t;if(e===ut&&u||(u=!1,t=e(t,r,3)),u){for(n=Io(n)?n:Tr(n),t=n.length,r=0;t--;)r+=+n[t]||0;n=r}else n=Wt(n,t);return n},$n.template=function(n,t,r){var e=$n.templateSettings;r&&jr(n,t,r)&&(t=r=null),n=u(n),t=tt(Tu({},r||t),e,nt),r=tt(Tu({},t.imports),e.imports,nt);var o,i,f=zo(r),a=Ut(r,f),c=0;r=t.interpolate||Rn;var l="__p+='";r=$e((t.escape||Rn).source+"|"+r.source+"|"+(r===gn?jn:Rn).source+"|"+(t.evaluate||Rn).source+"|$","g");var p="sourceURL"in t?"//# sourceURL="+t.sourceURL+"\n":"";if(n.replace(r,function(t,r,e,u,f,a){return e||(e=u),l+=n.slice(c,a).replace(Cn,s),r&&(o=!0,l+="'+__e("+r+")+'"),f&&(i=!0,l+="';"+f+";\n__p+='"),e&&(l+="'+((__t=("+e+"))==null?'':__t)+'"),c=a+t.length,t}),l+="';",(t=t.variable)||(l="with(obj){"+l+"}"),l=(i?l.replace(fn,""):l).replace(an,"$1").replace(cn,"$1;"),l="function("+(t||"obj")+"){"+(t?"":"obj||(obj={});")+"var __t,__p=''"+(o?",__e=_.escape":"")+(i?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+l+"return __p}",
-t=Jo(function(){return Te(f,p+"return "+l).apply(w,a)}),t.source=l,fe(t))throw t;return t},$n.trim=xe,$n.trimLeft=function(n,t,r){var e=n;return(n=u(n))?n.slice((r?jr(e,t,r):null==t)?g(n):i(n,t+"")):n},$n.trimRight=function(n,t,r){var e=n;return(n=u(n))?(r?jr(e,t,r):null==t)?n.slice(0,y(n)+1):n.slice(0,f(n,t+"")+1):n},$n.trunc=function(n,t,r){r&&jr(n,t,r)&&(t=null);var e=S;if(r=W,null!=t)if(ae(t)){var o="separator"in t?t.separator:o,e="length"in t?+t.length||0:e;r="omission"in t?u(t.omission):r}else e=+t||0;if(n=u(n),e>=n.length)return n;if(e-=r.length,1>e)return r;if(t=n.slice(0,e),null==o)return t+r;if(se(o)){if(n.slice(e).search(o)){var i,f=n.slice(0,e);for(o.global||(o=$e(o.source,(kn.exec(o)||"")+"g")),o.lastIndex=0;n=o.exec(f);)i=n.index;t=t.slice(0,null==i?e:i)}}else n.indexOf(o,e)!=e&&(o=t.lastIndexOf(o),o>-1&&(t=t.slice(0,o)));return t+r},$n.unescape=function(n){return(n=u(n))&&pn.test(n)?n.replace(ln,d):n},$n.uniqueId=function(n){var t=++Ve;return u(n)+t},$n.words=Ae,$n.all=Zr,$n.any=ne,$n.contains=Jr,$n.detect=eo,$n.foldl=so,$n.foldr=po,$n.head=Br,$n.include=Jr,$n.inject=so,Ee($n,function(){var n={};return ht($n,function(t,r){$n.prototype[r]||(n[r]=t)}),n}(),!1),$n.sample=Hr,$n.prototype.sample=function(n){return this.__chain__||null!=n?this.thru(function(t){return Hr(t,n)}):Hr(this.value())},$n.VERSION=b,Kn("bind bindKey curry curryRight partial partialRight".split(" "),function(n){$n[n].placeholder=$n}),Kn(["dropWhile","filter","map","takeWhile"],function(n,t){var r=t!=$,e=t==N;zn.prototype[n]=function(n,u){var o=this.__filtered__,i=o&&e?new zn(this):this.clone();return(i.__iteratees__||(i.__iteratees__=[])).push({done:!1,count:0,index:0,iteratee:yr(n,u,1),limit:-1,type:t}),i.__filtered__=o||r,i}}),Kn(["drop","take"],function(n,t){var r=n+"While";zn.prototype[n]=function(r){var e=this.__filtered__,u=e&&!t?this.dropWhile():this.clone();return r=null==r?1:yu(nu(r)||0,0),e?t?u.__takeCount__=du(u.__takeCount__,r):Mr(u.__iteratees__).limit=r:(u.__views__||(u.__views__=[])).push({size:r,type:n+(0>u.__dir__?"Right":"")}),u},zn.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse()},zn.prototype[n+"RightWhile"]=function(n,t){return this.reverse()[r](n,t).reverse()}}),Kn(["first","last"],function(n,t){var r="take"+(t?"Right":"");zn.prototype[n]=function(){return this[r](1).value()[0]}}),Kn(["initial","rest"],function(n,t){var r="drop"+(t?"":"Right");zn.prototype[n]=function(){return this[r](1)}}),Kn(["pluck","where"],function(n,t){var r=t?"filter":"map",e=t?wt:Re;zn.prototype[n]=function(n){return this[r](e(n))}}),zn.prototype.compact=function(){return this.filter(Oe)},zn.prototype.reject=function(n,t){return n=yr(n,t,1),this.filter(function(t){return!n(t)})},zn.prototype.slice=function(n,t){n=null==n?0:+n||0;var r=0>n?this.takeRight(-n):this.drop(n);return t!==w&&(t=+t||0,r=0>t?r.dropRight(-t):r.take(t-n)),r},zn.prototype.toArray=function(){return this.drop(0)},ht(zn.prototype,function(n,t){var r=$n[t];if(r){var e=/^(?:filter|map|reject)|While$/.test(t),u=/^(?:first|last)$/.test(t);$n.prototype[t]=function(){function t(n){return n=[n],eu.apply(n,o),r.apply($n,n)}var o=arguments,i=this.__chain__,f=this.__wrapped__,a=!!this.__actions__.length,c=f instanceof zn,l=o[0],s=c||Io(f);return s&&e&&"function"==typeof l&&1!=l.length&&(c=s=!1),c=c&&!a,u&&!i?c?n.call(f):r.call($n,this.value()):s?(f=n.apply(c?f:new zn(this),o),u||!a&&!f.__actions__||(f.__actions__||(f.__actions__=[])).push({func:Yr,args:[t],thisArg:$n}),new Bn(f,i)):this.thru(t)}}}),Kn("concat join pop push replace shift sort splice split unshift".split(" "),function(n){var t=(/^(?:replace|split)$/.test(n)?De:ze)[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:join|pop|replace|shift)$/.test(n);$n.prototype[n]=function(){var n=arguments;return e&&!this.__chain__?t.apply(this.value(),n):this[r](function(r){return t.apply(r,n)})}}),ht(zn.prototype,function(n,t){var r=$n[t];if(r){var e=r.name;(Su[e]||(Su[e]=[])).push({name:t,func:r})}}),Su[ar(null,A).name]=[{name:"wrapper",func:null}],zn.prototype.clone=function(){var n=this.__actions__,t=this.__iteratees__,r=this.__views__,e=new zn(this.__wrapped__);return e.__actions__=n?qn(n):null,e.__dir__=this.__dir__,e.__filtered__=this.__filtered__,e.__iteratees__=t?qn(t):null,e.__takeCount__=this.__takeCount__,e.__views__=r?qn(r):null,e},zn.prototype.reverse=function(){if(this.__filtered__){var n=new zn(this);n.__dir__=-1,n.__filtered__=!0}else n=this.clone(),n.__dir__*=-1;return n},zn.prototype.value=function(){var n=this.__wrapped__.value();if(!Io(n))return Ft(n,this.__actions__);var t,r=this.__dir__,e=0>r;t=n.length;for(var u=this.__views__,o=0,i=-1,f=u?u.length:0;++ia;){for(var u=u+r,l=-1,s=n[u];++lp.index:u-1?p.count++>=_:!h(s))))continue n}else if(p=h(s),_==$)s=p;else if(!p){if(_==F)continue n;break n}}c[a++]=s}return c},$n.prototype.chain=function(){return Vr(this)},$n.prototype.commit=function(){return new Bn(this.value(),this.__chain__)},$n.prototype.plant=function(n){for(var t,r=this;r instanceof Ln;){var e=Fr(r);t?u.__wrapped__=e:t=e;var u=e,r=r.__wrapped__}return u.__wrapped__=n,t},$n.prototype.reverse=function(){var n=this.__wrapped__;return n instanceof zn?(this.__actions__.length&&(n=new zn(this)),new Bn(n.reverse(),this.__chain__)):this.thru(function(n){return n.reverse()})},$n.prototype.toString=function(){return this.value()+""},$n.prototype.run=$n.prototype.toJSON=$n.prototype.valueOf=$n.prototype.value=function(){return Ft(this.__wrapped__,this.__actions__)},$n.prototype.collect=$n.prototype.map,$n.prototype.head=$n.prototype.first,$n.prototype.select=$n.prototype.filter,$n.prototype.tail=$n.prototype.rest,$n}var w,b="3.7.0",x=1,A=2,j=4,k=8,O=16,E=32,I=64,R=128,C=256,S=30,W="...",T=150,U=16,N=0,F=1,$=2,L="Expected a function",B="__lodash_placeholder__",z="[object Arguments]",M="[object Array]",D="[object Boolean]",P="[object Date]",q="[object Error]",K="[object Function]",V="[object Number]",Y="[object Object]",Z="[object RegExp]",G="[object String]",J="[object ArrayBuffer]",X="[object Float32Array]",H="[object Float64Array]",Q="[object Int8Array]",nn="[object Int16Array]",tn="[object Int32Array]",rn="[object Uint8Array]",en="[object Uint8ClampedArray]",un="[object Uint16Array]",on="[object Uint32Array]",fn=/\b__p\+='';/g,an=/\b(__p\+=)''\+/g,cn=/(__e\(.*?\)|\b__t\))\+'';/g,ln=/&(?:amp|lt|gt|quot|#39|#96);/g,sn=/[&<>"'`]/g,pn=RegExp(ln.source),hn=RegExp(sn.source),_n=/<%-([\s\S]+?)%>/g,vn=/<%([\s\S]+?)%>/g,gn=/<%=([\s\S]+?)%>/g,yn=/\.|\[(?:[^[\]]+|(["'])(?:(?!\1)[^\n\\]|\\.)*?)\1\]/,dn=/^\w*$/,mn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g,wn=/[.*+?^${}()|[\]\/\\]/g,bn=RegExp(wn.source),xn=/[\u0300-\u036f\ufe20-\ufe23]/g,An=/\\(\\)?/g,jn=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,kn=/\w*$/,On=/^0[xX]/,En=/^\[object .+?Constructor\]$/,In=/[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g,Rn=/($^)/,Cn=/['\n\r\u2028\u2029\\]/g,Sn=RegExp("[A-Z\\xc0-\\xd6\\xd8-\\xde]+(?=[A-Z\\xc0-\\xd6\\xd8-\\xde][a-z\\xdf-\\xf6\\xf8-\\xff]+)|[A-Z\\xc0-\\xd6\\xd8-\\xde]?[a-z\\xdf-\\xf6\\xf8-\\xff]+|[A-Z\\xc0-\\xd6\\xd8-\\xde]+|[0-9]+","g"),Wn=" \f \ufeff\n\r\u2028\u2029 ",Tn="Array ArrayBuffer Date Error Float32Array Float64Array Function Int8Array Int16Array Int32Array Math Number Object RegExp Set String _ clearTimeout document isFinite parseInt setTimeout TypeError Uint8Array Uint8ClampedArray Uint16Array Uint32Array WeakMap window".split(" "),Un={};Un[X]=Un[H]=Un[Q]=Un[nn]=Un[tn]=Un[rn]=Un[en]=Un[un]=Un[on]=!0,Un[z]=Un[M]=Un[J]=Un[D]=Un[P]=Un[q]=Un[K]=Un["[object Map]"]=Un[V]=Un[Y]=Un[Z]=Un["[object Set]"]=Un[G]=Un["[object WeakMap]"]=!1;var Nn={};Nn[z]=Nn[M]=Nn[J]=Nn[D]=Nn[P]=Nn[X]=Nn[H]=Nn[Q]=Nn[nn]=Nn[tn]=Nn[V]=Nn[Y]=Nn[Z]=Nn[G]=Nn[rn]=Nn[en]=Nn[un]=Nn[on]=!0,Nn[q]=Nn[K]=Nn["[object Map]"]=Nn["[object Set]"]=Nn["[object WeakMap]"]=!1;var Fn={leading:!1,maxWait:0,trailing:!1},$n={"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss"},Ln={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},Bn={"&":"&","<":"<",">":">",""":'"',"'":"'","`":"`"},zn={"function":!0,object:!0},Mn={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Dn=zn[typeof exports]&&exports&&!exports.nodeType&&exports,Pn=zn[typeof module]&&module&&!module.nodeType&&module,qn=zn[typeof self]&&self&&self.Object&&self,Kn=zn[typeof window]&&window&&window.Object&&window,Vn=Pn&&Pn.exports===Dn&&Dn,Yn=Dn&&Pn&&"object"==typeof global&&global&&global.Object&&global||Kn!==(this&&this.window)&&Kn||qn||this,Zn=m();"function"==typeof define&&"object"==typeof define.amd&&define.amd?(Yn._=Zn,define(function(){return Zn})):Dn&&Pn?Vn?(Pn.exports=Zn)._=Zn:Dn._=Zn:Yn._=Zn}.call(this),angular.module("mc.resizer",[]).directive("resizer",function($document){return function($scope,$element,$attrs){function mousemove(event){if("vertical"==$attrs.resizer){var x=event.pageX;$attrs.resizerMax&&x>$attrs.resizerMax&&(x=parseInt($attrs.resizerMax)),$element.css({left:x+"px"}),$($attrs.resizerLeft).css({width:x+"px"}),$($attrs.resizerRight).css({left:x+parseInt($attrs.resizerWidth)+"px"})}else{var y=window.innerHeight-event.pageY;$element.css({bottom:y+"px"}),$($attrs.resizerTop).css({bottom:y+parseInt($attrs.resizerHeight)+"px"}),$($attrs.resizerBottom).css({height:y+"px"})}}function mouseup(){$document.unbind("mousemove",mousemove),$document.unbind("mouseup",mouseup)}$element.on("mousedown",function(event){event.preventDefault(),$document.on("mousemove",mousemove),$document.on("mouseup",mouseup)})}});var treeherder=angular.module("treeherder",["ngResource","ngSanitize","ngCookies","LocalStorageModule"]),treeherderApp=angular.module("treeherder.app",["treeherder","ui.bootstrap","ngRoute","mc.resizer","angular-toArrayFilter"]);treeherderApp.config(function($compileProvider,$routeProvider,$httpProvider,$logProvider){$compileProvider.debugInfoEnabled(!1),$logProvider.debugEnabled(!1),$httpProvider.defaults.useXDomain=!0,delete $httpProvider.defaults.headers.common["X-Requested-With"],$httpProvider.defaults.xsrfHeaderName="X-CSRFToken",$httpProvider.defaults.xsrfCookieName="csrftoken",$httpProvider.useApplyAsync(!0),$routeProvider.when("/jobs",{controller:"JobsCtrl",templateUrl:"partials/main/jobs.html",reloadOnSearch:!1}).when("/jobs/:tree",{controller:"JobsCtrl",templateUrl:"partials/main/jobs.html",reloadOnSearch:!1}).when("/timeline",{controller:"TimelineCtrl",templateUrl:"partials/main/timeline.html"}).when("/machines",{controller:"MachinesCtrl",templateUrl:"partials/main/machines.html"}).otherwise({redirectTo:"/jobs"})}),treeherder.factory("ThLog",["$log","ThLogConfig",function($log,ThLogConfig){var ThLog=function(name){this.name=name},whitelist=ThLogConfig.whitelist,blacklist=ThLogConfig.blacklist;ThLog.prototype.getClassName=function(){return this.name},ThLog.prototype.debug=function(){logIt(this,$log.debug,arguments)},ThLog.prototype.log=function(){logIt(this,$log.log,arguments)},ThLog.prototype.warn=function(){logIt(this,$log.warn,arguments)},ThLog.prototype.info=function(){logIt(this,$log.info,arguments)},ThLog.prototype.error=function(){logIt(this,$log.error,arguments)};var logIt=function(self,func,args){if(whitelist.length&&_.contains(whitelist,self.getClassName())||blacklist.length&&!_.contains(blacklist,self.getClassName())||!whitelist.length&&!blacklist.length){var newArgs=Array.prototype.slice.call(args);newArgs.unshift(self.getClassName()),func.apply(null,newArgs)}};return ThLog}]),treeherder.provider("ThLogConfig",function(){this.whitelist=[],this.blacklist=[],this.setBlacklist=function(bl){this.blacklist=bl},this.setWhitelist=function(wl){this.whitelist=wl},this.$get=function(){var self=this;return{whitelist:self.whitelist,blacklist:self.blacklist}}}),treeherder.provider("thServiceDomain",function(){this.$get=function(){return window.thServiceDomain?window.thServiceDomain:""}}),treeherder.provider("thResultStatusList",function(){var all=function(){return["success","testfailed","busted","exception","retry","usercancel","running","pending","coalesced"]},defaultFilters=function(){return["success","testfailed","busted","exception","retry","usercancel","running","pending"]};this.$get=function(){return{all:all,defaultFilters:defaultFilters}}}),treeherder.provider("thResultStatus",function(){this.$get=function(){return function(job){return"completed"===job.state?job.result:null!==job.job_coalesced_to_guid?"coalesced":job.state}}}),treeherder.provider("thResultStatusObject",function(){var getResultStatusObject=function(){return{running:0,pending:0,completed:0}};this.$get=function(){return{getResultStatusObject:getResultStatusObject}}}),treeherder.provider("thResultStatusInfo",function(){this.$get=function(){return function(resultState){var resultStatusInfo={severity:100,btnClass:"btn-default",jobButtonIcon:""};switch(resultState){case"busted":resultStatusInfo={severity:1,btnClass:"btn-red",btnClassClassified:"btn-red-classified",jobButtonIcon:"glyphicon glyphicon-fire",countText:"busted"};break;case"exception":resultStatusInfo={severity:2,btnClass:"btn-purple",btnClassClassified:"btn-purple-classified",jobButtonIcon:"glyphicon glyphicon-fire",countText:"exception"};break;case"testfailed":resultStatusInfo={severity:3,btnClass:"btn-orange",btnClassClassified:"btn-orange-classified",jobButtonIcon:"glyphicon glyphicon-warning-sign",countText:"failed"};break;case"unknown":resultStatusInfo={severity:4,btnClass:"btn-black",btnClassClassified:"btn-black-classified",jobButtonIcon:"",countText:"unknown"};break;case"usercancel":resultStatusInfo={severity:5,btnClass:"btn-pink",jobButtonIcon:"",countText:"cancel"};break;case"retry":resultStatusInfo={severity:6,btnClass:"btn-dkblue",jobButtonIcon:"",countText:"retry"};break;case"success":resultStatusInfo={severity:7,btnClass:"btn-green",jobButtonIcon:"",countText:"success"};break;case"running":resultStatusInfo={severity:8,btnClass:"btn-dkgray",jobButtonIcon:"",countText:"running"};break;case"pending":resultStatusInfo={severity:100,btnClass:"btn-ltgray",jobButtonIcon:"",countText:"pending"};break;case"coalesced":resultStatusInfo={severity:101,btnClass:"btn-yellow",jobButtonIcon:"",countText:"coalesced"}}return resultStatusInfo}}}),treeherder.provider("thEvents",function(){this.$get=function(){return{revisionsLoaded:"revisions-loaded-EVT",jobClick:"job-click-EVT",jobDetailLoaded:"job-detail-loaded-EVT",jobPin:"job-pin-EVT",jobRetrigger:"job-retrigger-EVT",jobContextMenu:"job-context-menu-EVT",jobsClassified:"jobs-classified-EVT",bugsAssociated:"bugs-associated-EVT",jobsLoaded:"jobs-loaded-EVT",clearSelectedJob:"clear-selected-job-EVT",globalFilterChanged:"status-filter-changed-EVT",toggleRevisions:"toggle-revisions-EVT",toggleAllRevisions:"toggle-all-revisions-EVT",toggleUnclassifiedFailures:"toggle-unclassified-failures-EVT",changeSelection:"next-previous-job-EVT",addRelatedBug:"add-related-bug-EVT",saveClassification:"save-classification-EVT",deleteClassification:"delete-classification-EVT",clearPinboard:"clear-pinboard-EVT",searchPage:"search-page-EVT",selectJob:"select-job-EVT",mapResultSetJobs:"map-result-set-jobs-EVT",applyNewJobs:"apply-new-jobs-EVT",initSheriffPanel:"init-sheriff-panel-EVT",openLogviewer:"open-logviewer-EVT"}}}),treeherder.provider("thAggregateIds",function(){var escape=function(id){return id.replace(/(:|\[|\]|\?|,|\.|\s+)/g,"-")},getPlatformRowId=function(repoName,resultsetId,platformName,platformOptions){return escape(repoName+resultsetId+platformName+platformOptions)},getResultsetTableId=function(repoName,resultsetId,revision){return escape(repoName+resultsetId+revision)};this.$get=function(){return{getPlatformRowId:getPlatformRowId,getResultsetTableId:getResultsetTableId}}}),treeherder.provider("thReftestStatus",function(){this.$get=function(){return function(job){return job.job_group_name?-1!==job.job_group_name.toLowerCase().indexOf("reftest"):void 0}}}),treeherder.value("thPlatformNameMap",{linux32:"Linux",linux64:"Linux x64","osx-10-6":"OS X 10.6","osx-10-7":"OS X 10.7","osx-10-8":"OS X 10.8","osx-10-9":"OS X 10.9","osx-10-10":"OS X 10.10",windowsxp:"Windows XP","windows7-32":"Windows 7","windows7-64":"Windows 7 x64","windows8-32":"Windows 8","windows8-64":"Windows 8 x64","windows2012-64":"Windows 2012 x64","android-2-2-armv6":"Android 2.2 Armv6","android-2-2":"Android 2.2","android-2-3-armv6":"Android 2.3 Armv6","android-2-3":"Android 2.3","android-2-3-armv7-api9":"Android 2.3 API9","android-4-0":"Android 4.0","android-4-0-armv7-api10":"Android 4.0 API10+","android-4-0-armv7-api11":"Android 4.0 API11+","android-4-2-x86":"Android 4.2 x86","android-4-2":"Android 4.2","android-4-2-armv7-api11":"Android 4.2 API11+","android-4-3":"Android 4.3","android-4-3-armv7-api11":"Android 4.3 API11+","android-4-4":"Android 4.4","android-4-4-armv7-api11":"Android 4.4 API11+","android-5-0-armv7-api11":"Android 5.0 API11+","b2g-linux32":"B2G Desktop Linux","b2g-linux64":"B2G Desktop Linux x64","b2g-osx":"B2G Desktop OS X","b2g-win32":"B2G Desktop Windows","b2g-emu-ics":"B2G ICS Emulator","b2g-emu-jb":"B2G JB Emulator","b2g-emu-kk":"B2G KK Emulator","b2g-emu-l":"B2G L Emulator","b2g-device-image":"B2G Device Image","mulet-linux32":"Mulet Linux","mulet-linux64":"Mulet Linux x64","mulet-osx":"Mulet OS X","mulet-win32":"Mulet Windows","graphene-linux64":"Graphene Linux x64","graphene-osx":"Graphene OS X","graphene-win64":"Graphene Windows x64","horizon-linux64":"Horizon Linux x64","horizon-osx":"Horizon OS X","horizon-win64":"Horizon Windows x64",other:"Other"}),treeherder.value("thPlatformOrder",{linux32:0,linux64:1,"osx-10-6":10,"osx-10-7":11,"osx-10-8":12,"osx-10-9":13,"osx-10-10":14,windowsxp:20,"windows7-32":21,"windows7-64":22,"windows8-32":23,"windows8-64":24,"windows2012-64":25,"android-2-2-armv6":30,"android-2-2":31,"android-2-3-armv6":32,"android-2-3":33,"android-2-3-armv7-api9":34,"android-4-0":35,"android-4-0-armv7-api10":36,"android-4-0-armv7-api11":37,"android-4-2-x86":38,"android-4-2":39,"android-4-2-armv7-api11":40,"android-4-3":41,"android-4-3-armv7-api11":42,"android-4-4":43,"android-4-4-armv7-api11":44,"android-5-0-armv7-api11":45,"b2g-linux32":50,"b2g-linux64":51,"b2g-osx":52,"b2g-win32":53,"b2g-emu-ics":54,"b2g-emu-jb":55,"b2g-emu-kk":56,"b2g-emu-l":57,"b2g-device-image":58,"mulet-linux32":60,"mulet-linux64":61,"mulet-osx":62,"mulet-win32":63,"graphene-linux64":71,"graphene-osx":72,"graphene-win64":73,"horizon-linux64":74,"horizon-osx":75,"horizon-win64":76,other:99}),treeherder.value("thOptionOrder",{opt:0,pgo:1,asan:2,debug:3,cc:4}),treeherder.value("thFailureResults",["testfailed","busted","exception"]),treeherder.value("thFavicons",{closed:"img/tree_closed.png",open:"img/tree_open.png","approval required":"img/tree_open.png",unavailable:"img/tree_open.png"}),treeherder.value("thRepoGroupOrder",{development:1,"project repositories":2,"try":3,"release-stabilization":4,taskcluster:5,"qa automation tests":6}),treeherder.value("thDefaultRepo","mozilla-inbound"),treeherder.value("thDateFormat","EEE MMM d, H:mm:ss"),treeherder.value("phTimeRanges",[{value:86400,text:"Last day"},{value:604800,text:"Last 7 days"},{value:1209600,text:"Last 14 days"},{value:2592e3,text:"Last 30 days"},{value:5184e3,text:"Last 60 days"},{value:7776e3,text:"Last 90 days"},{value:31536e3,text:"Last year"}]),treeherder.value("thJobNavSelectors",{ALL_JOBS:{name:"jobs",selector:".job-btn"},UNCLASSIFIED_FAILURES:{name:"unclassified failures",selector:".selected-job, .job-btn.btn-red, .job-btn.btn-orange, .job-btn.btn-purple"}}),treeherder.directive("ngRightClick",["$parse",function($parse){return function(scope,element,attrs){var fn=$parse(attrs.ngRightClick);element.bind("contextmenu",function(event){scope.$apply(function(){event.preventDefault(),fn(scope,{$event:event})})})}}]),treeherder.directive("focusThis",["$timeout",function($timeout){return function(scope,elem,attr){scope.$on("focus-this",function(event,id){attr.id==id&&$timeout(function(){elem[0].focus()},0)})}}]),treeherder.directive("blurThis",["$timeout",function($timeout){return function(scope,elem,attr){scope.$on("blur-this",function(event,id){attr.id==id&&$timeout(function(){elem[0].blur()},0)})}}]),treeherder.directive("focusMe",["$timeout",function($timeout){return{link:function(scope,element,attrs){scope.$watch(attrs.focusMe,function(value){value?$timeout(function(){element[0].focus()},0):$timeout(function(){element[0].blur()},0)})}}}]),treeherder.directive("copyValue",[function(){return{restrict:"A",link:function(scope,element,attrs){var cont=document.getElementById("clipboard-container"),clip=document.getElementById("clipboard");element.on("mouseenter",function(){cont.style.display="block",clip.value=attrs.copyValue,clip.focus(),clip.select()}),element.on("mouseleave",function(){cont.style.display="none",clip.value=""})}}}]),treeherder.directive("preventDefaultOnLeftClick",[function(){return{restrict:"A",link:function(scope,element,attrs){element.on("click",function(event){1===event.which&&event.preventDefault()})}}}]),treeherder.directive("thNotificationBox",["thNotify",function(thNotify){return{restrict:"E",templateUrl:"partials/main/thNotificationsBox.html",link:function(scope,element,attr){scope.notifier=thNotify,scope.alert_class_prefix="alert-"}}}]),treeherder.directive("thFaviconLink",["ThRepositoryModel","thFavicons",function(ThRepositoryModel,thFavicons){return{restrict:"E",link:function(scope,element,attr){scope.currentTreeStatus=ThRepositoryModel.getCurrentTreeStatus,scope.$watch("currentTreeStatus()",function(newVal){newVal&&(scope.favicon=thFavicons[ThRepositoryModel.getCurrentTreeStatus()])})},template:' '}}]),treeherder.directive("bugInput",function(){return{restrict:"A",link:function(scope,elem,attrs,ctrl){elem.on("invalid",function(event){event.target.setCustomValidity("Please enter a bug number")}),elem.on("input",function(event){event.target.setCustomValidity(""),event.target.value=event.target.value.trim()}),elem.attr("type","text"),elem.attr("pattern","\\s*\\d+\\s*")}}}),treeherder.directive("numbersOnly",function(){return{require:"ngModel",link:function(scope,element,attrs,modelCtrl){modelCtrl.$parsers.push(function(inputValue){if(void 0==inputValue)return"";var transformedInput=inputValue.replace(/[^0-9]/g,"");return transformedInput!=inputValue&&(modelCtrl.$setViewValue(transformedInput),modelCtrl.$render()),transformedInput})}}}),treeherder.directive("thMultiSelect",["$log",function($log){return{restrict:"E",templateUrl:"partials/main/thMultiSelect.html",scope:{leftList:"=",rightList:"="},link:function(scope,element,attrs){scope.leftSelected=[],scope.rightSelected=[];var move_options=function(what,from,to){for(var found,i=0;i0&&$(element[0]).append($(" ").attr("title",elem_list_clone.join(", ")).text(" and "+elem_list_clone.length+" others").tooltip())}})}}}]),treeherder.directive("thCloneJobs",["$rootScope","$http","ThLog","thUrl","thCloneHtml","thServiceDomain","thResultStatusInfo","thEvents","thAggregateIds","thJobFilters","thResultStatusObject","ThResultSetStore","ThJobModel","linkifyBugsFilter","thResultStatus","thPlatformName","thJobSearchStr","thNotify","$timeout",function($rootScope,$http,ThLog,thUrl,thCloneHtml,thServiceDomain,thResultStatusInfo,thEvents,thAggregateIds,thJobFilters,thResultStatusObject,ThResultSetStore,ThJobModel,linkifyBugsFilter,thResultStatus,thPlatformName,thJobSearchStr,thNotify,$timeout){var $log=new ThLog("thCloneJobs"),btnCls="btn-xs",selectedBtnCls="selected-job",largeBtnCls="btn-lg-xform",col5Cls="col-xs-5",col7Cls="col-xs-7",col12Cls="col-xs-12",jobListNoPadCls="job-list-nopad",jobListPadCls="job-list-pad",jobKeyAttr="data-jmkey",tableInterpolator=thCloneHtml.get("resultsetClone").interpolator,platformInterpolator=thCloneHtml.get("platformClone").interpolator,jobGroupInterpolator=thCloneHtml.get("jobGroupBeginClone").interpolator,jobBtnInterpolator=thCloneHtml.get("jobBtnClone").interpolator,getJobMapKey=function(job){return"key"+job.id},getHoverText=function(job){var hoverText=job.job_type_name+" - "+thResultStatus(job);if("completed"===job.state){var duration=Math.round((job.end_timestamp-job.start_timestamp)/60);hoverText+=" ("+duration+" mins)"}return hoverText};$rootScope.$on(thEvents.changeSelection,function(ev,direction,jobNavSelector){var el,key,jobs,getIndex,jobMap=ThResultSetStore.getJobMap($rootScope.repoName);if("next"===direction?getIndex=function(idx,jobs){return idx+1>_.size(jobs)-1?0:idx+1}:"previous"===direction&&(getIndex=function(idx,jobs){return 0>idx-1?_.size(jobs)-1:idx-1}),jobs=$(".th-view-content").filter(jobNavSelector.selector).filter(":visible, .selected-job"),jobs.length){var selIdx=jobs.index(jobs.filter(".selected-job")),idx=getIndex(selIdx,jobs);if(el=$(jobs[idx]),key=el.attr(jobKeyAttr),jobMap&&jobMap[key]&&selIdx!==idx)return void selectJob(jobMap[key].job_obj)}$timeout(function(){"none"===$(".selected-job").css("display")&&$rootScope.closeJob(),thNotify.send("No more "+jobNavSelector.name+" to select","warning")},0)}),$rootScope.$on(thEvents.selectJob,function(ev,job,job_selection_type){selectJob(job,job_selection_type)}),$rootScope.$on(thEvents.clearSelectedJob,function(ev,job){clearSelectJobStyles()});var selectJob=function(job,job_selection_type){var jobKey=getJobMapKey(job),jobEl=$("."+jobKey);clickJobCb({},jobEl,job,job_selection_type),scrollToElement(jobEl),ThResultSetStore.setSelectedJob($rootScope.repoName,jobEl,job)},setSelectJobStyles=function(el){var lastJobSelected=ThResultSetStore.getSelectedJob($rootScope.repoName);_.isEmpty(lastJobSelected.el)||(lastJobSelected.el.removeClass(selectedBtnCls),lastJobSelected.el.removeClass(largeBtnCls),lastJobSelected.el.addClass(btnCls)),el.removeClass(btnCls),el.addClass(largeBtnCls),el.addClass(selectedBtnCls)},clearSelectJobStyles=function(){var lastJobSelected=ThResultSetStore.getSelectedJob($rootScope.repoName);_.isEmpty(lastJobSelected.el)||(lastJobSelected.el.removeClass(selectedBtnCls),lastJobSelected.el.removeClass(largeBtnCls),lastJobSelected.el.addClass(btnCls))},broadcastJobChangedTimeout=null,clickJobCb=function(ev,el,job,job_selection_type){setSelectJobStyles(el),broadcastJobChangedTimeout&&window.clearTimeout(broadcastJobChangedTimeout),broadcastJobChangedTimeout=window.setTimeout(function(){$rootScope.$emit(thEvents.jobClick,job,job_selection_type)},200)},togglePinJobCb=function(ev,el,job){$rootScope.$emit(thEvents.jobPin,job)},addJobBtnEls=function(jgObj,jobBtnInterpolator,jobTdEl){var hText,key,resultState,job,jobStatus,jobBtn,l,jobsShown=0,lastJobSelected=ThResultSetStore.getSelectedJob($rootScope.repoName),jobBtnArray=[];for(l=0;l1?(jobStatus.value=job.job_type_symbol+"*",jobStatus.btnClassClassified&&(jobStatus.btnClass=jobStatus.btnClassClassified)):jobStatus.value=job.job_type_symbol,jobStatus.title=hText,jobBtn=$(jobBtnInterpolator(jobStatus)),jobBtnArray.push(jobBtn),jobBtnArray.push(" "),showHideJob(jobBtn,job.visible),_.isEmpty(lastJobSelected.job)||lastJobSelected.job.id!==job.id||(setSelectJobStyles(jobBtn),ThResultSetStore.setSelectedJob($rootScope.repoName,jobBtn,job));return jobTdEl.append(jobBtnArray),jobsShown},jobMouseDown=function(ev){var el=$(ev.target),key=el.attr(jobKeyAttr);if(key&&!_.isEmpty(this.job_map[key])){var job=this.job_map[key].job_obj;switch(ev.which){case 1:ev.ctrlKey||ev.metaKey?_.bind(togglePinJobCb,this,ev,el,job)():_.bind(clickJobCb,this,ev,el,job)();break;case 2:ev.preventDefault(),ThJobModel.get(this.repoName,job.id).then(function(data){data.logs.length>0&&window.open(data.logs[0].url,"Log")});break;case 3:break;default:_.bind(clickJobCb,this,ev,el,job)()}ThResultSetStore.setSelectedJob($rootScope.repoName,el,job)}},addRevisions=function(resultset,element){if(resultset.revisions.length>0){var revisionInterpolator=thCloneHtml.get("revisionsClone").interpolator,ulEl=element.find("ul");$(ulEl).empty();var revision,revisionHtml,userTokens,i;for(i=0;i]+/),userTokens.length>1&&(revision.email=userTokens[1]),revision.name=userTokens[0].trim(),revision.escaped_comment=_.escape(revision.comments.split("\n")[0]),revision.escaped_comment_linkified=linkifyBugsFilter(revision.escaped_comment),revisionHtml=revisionInterpolator(revision),ulEl.append(revisionHtml);if(resultset.revision_count>resultset.revisions.length){var pushlogInterpolator=thCloneHtml.get("pushlogRevisionsClone").interpolator;ulEl.append(pushlogInterpolator({currentRepo:$rootScope.currentRepo,revision:resultset.revision}))}}},toggleRevisions=function(element,expand){var revisionsEl=element.find("ul").parent(),jobsEl=element.find("table").parent(),revElDisplayState=revisionsEl.css("display")||"block",jobsElDisplayState=jobsEl.css("display")||"block",on="block"!==revElDisplayState;_.isUndefined(expand)||(on=expand);var rowEl=revisionsEl.parent();rowEl.css("display","block"),on?(ThResultSetStore.loadRevisions($rootScope.repoName,this.resultset.id),"block"===jobsElDisplayState&&(toggleRevisionsSpanOnWithJobs(revisionsEl),toggleJobsSpanOnWithRevisions(jobsEl))):(toggleRevisionsSpanOff(revisionsEl),toggleJobsSpanOnWithoutRevisions(jobsEl))},toggleRevisionsSpanOnWithJobs=function(el){el.css("display","block"),el.addClass(col5Cls)},toggleRevisionsSpanOff=function(el){el.css("display","none"),el.removeClass(col5Cls)},toggleJobsSpanOnWithRevisions=function(el){el.css("display","block"),el.removeClass(jobListNoPadCls),el.removeClass(col12Cls),el.addClass(col7Cls),el.addClass(jobListPadCls)},toggleJobsSpanOnWithoutRevisions=function(el){el.css("display","block"),el.removeClass(col7Cls),el.removeClass(jobListPadCls),el.addClass(jobListNoPadCls),el.addClass(col12Cls);
-},renderJobTableRow=function(row,jobTdEl,jobGroups){jobTdEl.empty();var jgObj,jobGroup,jobsShown,i;for(i=0;i0){var orderedPlatforms=[];orderedPlatforms.push(platformName);var td,platformSpan,spanPlatformName,r,p;for(r=0;r");var tableEl=document.getElementById(value.resultsetAggregateId);rowEl.prop("id",platformId),option=value.platformOption,platformTdEl=$(platformInterpolator({name:platformName,option:option,id:platformId})),rowEl.append(platformTdEl),jobTdEl=$(thCloneHtml.get("jobTdClone").text),renderJobTableRow(rowEl,jobTdEl,value.jobGroups),appendPlatformRow(tableEl,rowEl,platformName)}}},this)},scrollToElement=function(el){void 0!==el.position()&&$(".th-global-content").scrollTo(el,100,{offset:-40})},registerCustomEventCallbacks=function(scope,element,attrs){$rootScope.$on(thEvents.revisionsLoaded,function(ev,rs){rs.id===scope.resultset.id&&_.bind(addRevisions,scope,rs,element)()}),$rootScope.$on(thEvents.toggleRevisions,function(ev,rs,expand){rs.id===scope.resultset.id&&_.bind(toggleRevisions,scope,element,expand)()}),$rootScope.$on(thEvents.globalFilterChanged,function(ev,filterData){_.bind(filterJobs,scope,element)()}),$rootScope.$on(thEvents.searchPage,function(ev,searchData){_.bind(filterJobs,scope,element)()}),$rootScope.$on(thEvents.jobsLoaded,function(ev,platformData){_.bind(updateJobs,scope,platformData)()}),$rootScope.$on(thEvents.jobsClassified,function(ev,pinnedJobs){var jid,platformData={};for(jid in pinnedJobs.jobs)pinnedJobs.jobs.hasOwnProperty(jid)&&pinnedJobs.jobs[jid].result_set_id===scope.resultset.id&&ThResultSetStore.aggregateJobPlatform($rootScope.repoName,pinnedJobs.jobs[jid],platformData);_.isEmpty(platformData)||_.bind(updateJobs,scope,platformData)()}),$rootScope.$on(thEvents.applyNewJobs,function(ev,resultSetId){if(scope.resultset.id===resultSetId){var rsMap=ThResultSetStore.getResultSetsMap($rootScope.repoName),resultsetAggregateId=thAggregateIds.getResultsetTableId($rootScope.repoName,scope.resultset.id,scope.resultset.revision);_.defer(generateJobElements,resultsetAggregateId,rsMap[resultSetId].rs_obj)}})},generateJobElements=function(resultsetAggregateId,resultset){var tableEl=$("#"+resultsetAggregateId),waitSpanEl=$(tableEl).prev();$(waitSpanEl).css("display","none");var name,option,platformId,platformKey,row,platformTd,jobTdEl,j;for(j=0;j"),row.prop("id",platformId)):$(row).empty(),name=thPlatformName(resultset.platforms[j].name),option=resultset.platforms[j].option,platformTd=platformInterpolator({name:name,option:option,id:thAggregateIds.getPlatformRowId(resultset.id,resultset.platforms[j].name,resultset.platforms[j].option)}),row.append(platformTd),jobTdEl=$(thCloneHtml.get("jobTdClone").text),platformKey=ThResultSetStore.getPlatformKey(resultset.platforms[j].name,resultset.platforms[j].option),renderJobTableRow(row,jobTdEl,resultset.platforms[j].groups),tableEl.append(row)},linker=function(scope,element,attrs){element.off(),element.on("mousedown",_.bind(jobMouseDown,scope)),registerCustomEventCallbacks(scope,element);var resultsetAggregateId=thAggregateIds.getResultsetTableId($rootScope.repoName,scope.resultset.id,scope.resultset.revision),targetEl=$(tableInterpolator({aggregateId:resultsetAggregateId}));if(addRevisions(scope.resultset,targetEl),element.append(targetEl),void 0!==scope.resultset.platforms)generateJobElements(resultsetAggregateId,scope.resultset);else{var tableEl=$("#"+resultsetAggregateId),waitSpanEl=$(tableEl).prev();$(waitSpanEl).css("display","none")}return{link:linker,replace:!0}};return{link:linker,replace:!0}}]),treeherder.directive("personaButtons",["$http","$q","$log","$rootScope","thServiceDomain","BrowserId","ThUserModel",function($http,$q,$log,$rootScope,thServiceDomain,BrowserId,ThUserModel){return{restrict:"E",link:function(scope,element,attrs){BrowserId.info.then(function(response){$rootScope.user={},$rootScope.user.email=response.data.userEmail||null,$rootScope.user.loggedin=null!==$rootScope.user.email,$rootScope.user.loggedin&&ThUserModel.get().then(function(user){angular.extend($rootScope.user,user)},null)}).then(function(){navigator.id.watch({loggedInUser:$rootScope.user.email,onlogin:function(assertion){BrowserId.requestDeferred&&BrowserId.requestDeferred.resolve(assertion)},onlogout:function(){BrowserId.logoutDeferred&&BrowserId.logoutDeferred.resolve()}})}),scope.login=function(){BrowserId.login().then(function(response){$rootScope.user.loggedin=!0,$rootScope.user.email=response.data.email,ThUserModel.get().then(function(user){angular.extend($rootScope.user,user)},null)},function(){scope.logout()})},scope.logout=function(){BrowserId.logout().then(function(response){$rootScope.user={loggedin:!1,email:null}})}},templateUrl:"partials/main/persona_buttons.html"}}]),treeherder.directive("thActionButton",["$compile","thCloneHtml","ThResultSetStore",function($compile,thCloneHtml,ThResultSetStore){return{restrict:"E",templateUrl:"partials/main/thActionButton.html",link:function(scope,element,attrs){var openRevisions=function(){var interpolator=thCloneHtml.get("revisionUrlClone").interpolator,htmlStr="";_.forEach(scope.resultset.revisions,function(revision){htmlStr=interpolator({revisionUrl:scope.currentRepo.getRevisionHref(revision.revision)})+htmlStr});$compile(interpolator(scope))(scope,function(el,scope){var wnd=window.open("",scope.repoName,"outerHeight=250,outerWidth=500,toolbar=no,location=no,menubar=no");wnd.document.write(htmlStr)})};scope.openRevisionListWindow=function(){scope.resultset.revisions.length?openRevisions():ThResultSetStore.loadRevisions(scope.repoName,scope.resultset.id).then(function(){openRevisions()})}}}}]),treeherder.directive("thResultCounts",["thEvents","$rootScope",function(thEvents,$rootScope){return{restrict:"E",link:function(scope,element,attrs){var setTotalCount=function(){if(scope.resultset.job_counts){scope.inProgress=scope.resultset.job_counts.pending+scope.resultset.job_counts.running;var total=scope.resultset.job_counts.completed+scope.inProgress;scope.percentComplete=(scope.resultset.job_counts.completed/total*100).toFixed(0)}};$rootScope.$on(thEvents.applyNewJobs,function(evt,resultSetId){resultSetId===scope.resultset.id&&setTotalCount()})},templateUrl:"partials/main/thResultCounts.html"}}]),treeherder.directive("thAuthor",function(){return{restrict:"E",link:function(scope,element,attrs){var userTokens=attrs.author.split(/[<>]+/),email="";userTokens.length>1&&(email=userTokens[1]),scope.authorName=userTokens[0].trim(),scope.authorEmail=email},template:'{{authorName}} '}}),treeherder.directive("thFilterCheckbox",["thResultStatusInfo",function(thResultStatusInfo){return{restrict:"E",link:function(scope,element,attrs){scope.checkClass=thResultStatusInfo(scope.filterName).btnClass+"-count-classified"},templateUrl:"partials/main/thFilterCheckbox.html"}}]),treeherder.directive("thWatchedRepo",["ThLog",function(ThLog){var $log=new ThLog("thWatchedRepo"),statusInfo={open:{icon:"fa-circle-o",color:"treeOpen",btnClass:"btn-view-nav"},"approval required":{icon:"fa-lock",color:"treeApproval",btnClass:"btn-view-nav"},closed:{icon:"fa-times-circle",color:"treeClosed",btnClass:"btn-view-nav-closed"},unsupported:{icon:"fa-question",color:"treeUnavailable",btnClass:"btn-view-nav"},"not retrieved yet":{icon:"fa-spinner",color:"treeUnavailable",btnClass:"btn-view-nav"},error:{icon:"fa-question",color:"treeUnavailable",btnClass:"btn-view-nav"}};return{restrict:"E",link:function(scope,element,attrs){scope.updateTitleText=function(){scope.repoData.treeStatus&&(scope.titleText=scope.repoData.treeStatus.status,scope.repoData.treeStatus.reason&&(scope.titleText=scope.titleText+" - "+scope.repoData.treeStatus.reason),scope.repoData.treeStatus.message_of_the_day&&(scope.titleText=scope.titleText+" - "+scope.repoData.treeStatus.message_of_the_day))},scope.btnClass="btn-view-nav",scope.$watch("repoData.treeStatus.status",function(newVal){if(newVal){$log.debug("updated treeStatus",newVal);var si=statusInfo[newVal];scope.statusIcon=si.icon,scope.statusColor=si.color,scope.btnClass=si.btnClass,scope.updateTitleText()}})},templateUrl:"partials/main/thWatchedRepo.html"}}]),treeherder.directive("thWatchedRepoInfoDropDown",["ThLog","ThRepositoryModel","treeStatus",function(ThLog,ThRepositoryModel,treeStatus){return{restrict:"E",replace:!0,link:function(scope,element,attrs){scope.name=attrs.name,scope.treeStatus=treeStatus.getTreeStatusName(attrs.name);var repo_obj=ThRepositoryModel.getRepo(attrs.name);scope.pushlog=repo_obj.pushlogURL,scope.$watch("repoData.treeStatus",function(newVal){newVal&&(scope.reason=newVal.reason,scope.message_of_the_day=newVal.message_of_the_day)},!0)},templateUrl:"partials/main/thWatchedRepoInfoDropDown.html"}}]),treeherder.directive("thRepoDropdownContainer",["ThLog","$rootScope","thEvents",function(ThLog,$rootScope,thEvents){var $log=new ThLog("thRepoDropdownContainer");return{restrict:"A",link:function(scope,element,attrs){scope.closeable=!0,$(element).on({"hide.bs.dropdown":function(ev){$log.debug("repo menu container","hide.bs.dropdown",scope.closeable,ev.target.className);var closeable=scope.closeable;return scope.closeable=!0,closeable}}),$(".repo-dropdown-menu").on({click:function(ev){($(ev.target).hasClass(".repo-link")||$(ev.target).hasClass(".repo-checkbox"))&&(scope.closeable=!1),$log.debug("repo menu dropdown","click",scope.closeable,ev.target.className)},mouseup:function(ev){scope.closeable=!1,$log.debug("repo menu dropdown","mouseup",scope.closeable,ev.target.className)}})}}}]),treeherder.directive("thRepoMenuItem",["ThLog",function(ThLog){new ThLog("thRepoMenuItem");return{restrict:"E",replace:!0,link:function(scope,element,attrs){var elem=$(element);elem.find(".repo-link").prop("href",scope.urlBasePath+"?repo="+scope.repo.name),scope.repo.name===scope.repoName&&elem.find(".repo-checkbox").prop("disabled","disabled")},templateUrl:"partials/main/thRepoMenuItem.html"}}]),treeherder.directive("thExclusionState",function(){return{restrict:"A",link:function(scope,element,attrs){scope.exclusionStateClass="fa-square-o",scope.isSkippingExclusionProfiles&&(scope.exclusionStateClass="fa-square")}}}),treeherder.directive("thPinnedJob",["thResultStatusInfo","thResultStatus",function(thResultStatusInfo,thResultStatus){var getHoverText=function(job){var duration=Math.round((job.end_timestamp-job.start_timestamp)/60),status=thResultStatus(job);return job.job_type_name+" - "+status+" - "+duration+"mins"};return{restrict:"E",link:function(scope,element,attrs){var unbindWatcher=scope.$watch("job",function(newValue){var resultState=thResultStatus(scope.job);scope.job.display=thResultStatusInfo(resultState),scope.hoverText=getHoverText(scope.job),"completed"===scope.job.state&&unbindWatcher()},!0)},templateUrl:"partials/main/thPinnedJob.html"}}]),treeherder.directive("thRelatedBugSaved",function(){return{restrict:"E",templateUrl:"partials/main/thRelatedBugSaved.html"}}),treeherder.directive("thRelatedBugQueued",function(){return{restrict:"E",templateUrl:"partials/main/thRelatedBugQueued.html"}}),treeherder.directive("thFailureClassification",["$parse","thClassificationTypes",function($parse,thClassificationTypes){return{scope:{failureId:"="},link:function(scope,element,attrs){scope.$watch("failureId",function(newVal){newVal&&(scope.classification=thClassificationTypes.classifications[newVal],scope.badgeColorClass=scope.classification.star,scope.hoverText=scope.classification.name)})},template:' {{hoverText}}'}}]),treeherder.directive("thSimilarJobs",["ThJobModel","ThLog",function(ThJobModel,ThLog){return{restrict:"E",templateUrl:"partials/main/similar_jobs.html",link:function(scope,element,attr){scope.$watch("job",function(newVal,oldVal){newVal&&scope.update_similar_jobs(newVal)}),scope.similar_jobs=[],scope.similar_jobs_filters={machine_id:!0,job_type_id:!0,build_platform_id:!0},scope.update_similar_jobs=function(job){var options={result_set_id__ne:job.result_set_id};angular.forEach(scope.similar_jobs_filters,function(elem,key){elem&&(options[key]=job[key])}),ThJobModel.get_list(scope.repoName,options).then(function(data){scope.similar_jobs=data})}}}}]),treeherder.directive("thPinboardPanel",function(){return{restrict:"E",templateUrl:"partials/main/thPinboardPanel.html"}}),treeherder.factory("thUrl",["$rootScope","thServiceDomain","ThLog",function($rootScope,thServiceDomain,ThLog){var thUrl={getRootUrl:function(uri){return thServiceDomain+"/api"+uri},getProjectUrl:function(uri,repoName){return _.isUndefined(repoName)&&(repoName=$rootScope.repoName),thServiceDomain+"/api/project/"+repoName+uri},getLogViewerUrl:function(job_id){return"logviewer.html#?job_id="+job_id+"&repo="+$rootScope.repoName}};return thUrl}]),treeherder.factory("thCloneHtml",["$interpolate",function($interpolate){var templateId,templateName,templateTxt,i,cloneTemplateIds=["revisionsClone.html","resultsetClone.html","platformClone.html","jobTdClone.html","jobGroupBeginClone.html","jobBtnClone.html","revisionUrlClone.html","pushlogRevisionsClone.html"],cloneHtmlObjs={};for(i=0;imaxNsNotifications)return void $timeout(thNotify.shift);$timeout(thNotify.shift,4e3,!0)}},shift:function(){for(var i=0;i=0)return!0;return!1},_containsAllSubstr=function(arr,val){for(var i=0;i0&&(job.failure_classification_id=classification.failure_classification_id,ThResultSetStore.updateUnclassifiedFailureMap($rootScope.repoName,job),classification.job_id=job.id,classification.create().success(function(data){thNotify.send("Classification saved for "+job.platform+": "+job.job_type_name,"success")}).error(function(data){thNotify.send("Error saving classification for "+job.platform+": "+job.job_type_name,"danger"),$log.debug("classification failed",data)}))},saveBugs=function(job){_.forEach(relatedBugs,function(bug){var bjm=new ThBugJobMapModel({bug_id:bug.id,job_id:job.id,type:"annotation"});bjm.create().success(function(data){thNotify.send("Bug association saved for "+job.platform+": "+job.job_type_name,"success")}).error(function(data){thNotify.send("Error saving bug association for "+job.platform+": "+job.job_type_name,"danger")})})},api={pinJob:function(job){api.spaceRemaining()>0?(pinnedJobs[job.id]=job,api.count.numPinnedJobs=_.size(pinnedJobs)):thNotify.send("Pinboard is already at maximum size of "+api.maxNumPinned,"danger")},pinJobs:function(jobsToPin){_.forEach(jobsToPin,api.pinJob)},unPinJob:function(id){
-delete pinnedJobs[id],api.count.numPinnedJobs=_.size(pinnedJobs)},unPinAll:function(){for(var jid in pinnedJobs)pinnedJobs.hasOwnProperty(jid)&&delete pinnedJobs[jid];for(var bid in relatedBugs)relatedBugs.hasOwnProperty(bid)&&delete relatedBugs[bid];api.count.numPinnedJobs=_.size(pinnedJobs)},addBug:function(bug,job){$log.debug("adding bug ",bug),relatedBugs[bug.id]=bug,api.count.numRelatedBugs=_.size(relatedBugs),$log.debug("related bugs",relatedBugs),job&&api.pinJob(job)},removeBug:function(id){delete relatedBugs[id],api.count.numRelatedBugs=_.size(relatedBugs)},createNewClassification:function(){return new ThJobClassificationModel({note:"",who:null,failure_classification_id:4})},save:function(classification){var jid,pinnedJobsClone={};for(jid in pinnedJobs)pinnedJobs.hasOwnProperty(jid)&&(pinnedJobsClone[jid]=pinnedJobs[jid]);_.each(pinnedJobs,saveClassification,classification),$rootScope.$emit(thEvents.jobsClassified,{jobs:pinnedJobsClone}),_.each(pinnedJobs,saveBugs),$rootScope.$emit(thEvents.bugsAssociated,{jobs:pinnedJobsClone}),api.unPinAll()},saveClassificationOnly:function(classification){_.each(pinnedJobs,saveClassification,classification),$rootScope.$emit(thEvents.jobsClassified,{jobs:pinnedJobs})},saveBugsOnly:function(){_.each(pinnedJobs,saveBugs),$rootScope.$emit(thEvents.bugsAssociated,{jobs:pinnedJobs})},hasPinnedJobs:function(){return!_.isEmpty(pinnedJobs)},hasRelatedBugs:function(){return!_.isEmpty(relatedBugs)},spaceRemaining:function(){return api.maxNumPinned-api.count.numPinnedJobs},pinnedJobs:pinnedJobs,relatedBugs:relatedBugs,count:{numPinnedJobs:0,numRelatedBugs:0},maxNumPinned:500};return api}]),treeherder.factory("treeStatus",["$http","$q",function($http,$q){var urlBase="https://treestatus.mozilla.org/",getTreeStatusName=function(name){return name.indexOf("comm-")>=0&&"try-comm-central"!==name?name+"-thunderbird":name},getRepoName=function(name){return name.replace("-thunderbird","")},get=function(repoName){var url=urlBase+getTreeStatusName(repoName);return $http.get(url,{params:{format:"json"}})};return{get:get,getTreeStatusName:getTreeStatusName,getRepoName:getRepoName}}]),treeherder.factory("ThResultSetModel",["$rootScope","$http","$location","$q","thUrl","thResultStatusObject","thEvents","thServiceDomain","ThLog","thNotify","ThJobModel","thPlatformOrder","thOptionOrder",function($rootScope,$http,$location,$q,thUrl,thResultStatusObject,thEvents,thServiceDomain,ThLog,thNotify,ThJobModel,thPlatformOrder,thOptionOrder){var $log=new ThLog("ThResultSetModel"),MAX_RESULTSET_FETCH_SIZE=100,convertDates=function(locationParams){return $log.debug("locationParams",locationParams),_.has(locationParams,"startdate")&&(locationParams.push_timestamp__gte=Date.parse(locationParams.startdate)/1e3,delete locationParams.startdate),_.has(locationParams,"enddate")&&(locationParams.push_timestamp__lt=Date.parse(locationParams.enddate)/1e3+84600,delete locationParams.enddate),locationParams},hasLowerRange=function(locationParams){return locationParams.fromchange||locationParams.startdate};return{getResultSetsFromChange:function(repoName,revision,locationParams){return locationParams=convertDates(locationParams),_.extend(locationParams,{fromchange:revision}),$http.get(thUrl.getProjectUrl("/resultset/",repoName),{params:locationParams})},getResultSets:function(repoName,rsOffsetTimestamp,count,resultsetlist,full,keep_filters){rsOffsetTimestamp="undefined"==typeof rsOffsetTimestamp?0:rsOffsetTimestamp,full=_.isUndefined(full)?!0:full,keep_filters=_.isUndefined(keep_filters)?!0:keep_filters;var params={full:full};if(params.count=count?Math.min(count,MAX_RESULTSET_FETCH_SIZE):10,rsOffsetTimestamp&&(params.push_timestamp__lte=rsOffsetTimestamp,params.count++),keep_filters){var locationParams=_.clone($location.search());delete locationParams.repo,rsOffsetTimestamp?(delete locationParams.tochange,delete locationParams.fromchange):hasLowerRange(locationParams)&&(params.count=MAX_RESULTSET_FETCH_SIZE),locationParams=convertDates(locationParams),$log.debug("updated params",params),_.extend(params,locationParams)}return resultsetlist&&_.extend(params,{offset:0,count:resultsetlist.length,id__in:resultsetlist.join()}),$http.get(thUrl.getProjectUrl("/resultset/",repoName),{params:params})},getResultSet:function(repoName,pk){return $http.get(thUrl.getProjectUrl("/resultset/"+pk+"/",repoName))},get:function(uri){return $http.get(thServiceDomain+uri)},getResultSetJobsUpdates:function(resultSetIdList,repoName,exclusionProfile,lastModified){angular.isDate(lastModified)&&(lastModified=lastModified.toISOString().replace("Z",""));var params={result_set_id__in:resultSetIdList.join(","),count:2e3,last_modified__gt:lastModified,return_type:"list"};return exclusionProfile&&(params.exclusion_profile=exclusionProfile),ThJobModel.get_list(repoName,params,{fetch_all:!0})},getResultSetJobs:function(resultSets,repoName,exclusionProfile){var jobsPromiseList=[];return _.each(resultSets.results,function(rs,index){var params={return_type:"list",result_set_id:rs.id,count:2e3};exclusionProfile&&(params.exclusion_profile=exclusionProfile),jobsPromiseList.push(ThJobModel.get_list(repoName,params,{fetch_all:!0}))}),jobsPromiseList},getRevisions:function(projectName,resultSetId){return $http.get(thUrl.getProjectUrl("/resultset/"+resultSetId+"/",projectName),{cache:!0}).then(function(response){return response.data.revisions.length>0?_.map(response.data.revisions,function(r){return r.revision}):$q.reject("No revisions found for result set "+resultSetId+" in project "+projectName)})},getResultSetsFromRevision:function(projectName,revision){return $http.get(thUrl.getProjectUrl("/resultset/?revision="+revision,projectName),{cache:!0}).then(function(response){return response.data.results.length>0?response.data.results:$q.reject("No results found for revision "+revision+" on project "+projectName)})},cancelAll:function(resultset_id,repoName){var uri=resultset_id+"/cancel_all/";return $http.post(thUrl.getProjectUrl("/resultset/",repoName)+uri)},triggerMissingJobs:function(resultset_id,repoName){var uri=resultset_id+"/trigger_missing_jobs/";return $http.post(thUrl.getProjectUrl("/resultset/",repoName)+uri)}}}]),treeherder.factory("ThResultSetStore",["$rootScope","$q","$location","$interval","thPlatformOrder","ThResultSetModel","ThJobModel","thEvents","thResultStatusObject","thAggregateIds","ThLog","thNotify","thJobFilters","thOptionOrder","ThRepositoryModel","$timeout","ThJobTypeModel","ThJobGroupModel",function($rootScope,$q,$location,$interval,thPlatformOrder,ThResultSetModel,ThJobModel,thEvents,thResultStatusObject,thAggregateIds,ThLog,thNotify,thJobFilters,thOptionOrder,ThRepositoryModel,$timeout,ThJobTypeModel,ThJobGroupModel){var $log=new ThLog("ThResultSetStore"),defaultResultSetCount=10,repositories={},resultSetPollInterval=6e4,jobPollInterval=6e4,lastJobUpdate=null,rsPollingKeys=["tochange","enddate","revision","author"],reloadOnChangeParameters=["repo","revision","author","fromchange","tochange","startdate","enddate","exclusion_profile","nojobs"],registerResultSetPollers=function(){var rsPollingParams=_.pick($location.search(),rsPollingKeys),resultSetPoller=$interval(function(){var rsData=repositories[$rootScope.repoName];rsData.resultSets.length>0&&!rsData.loadingStatus.prepending?doResultSetPolling(rsPollingParams)?ThResultSetModel.getResultSetsFromChange($rootScope.repoName,rsData.resultSets[0].revision,rsPollingParams).then(function(data){prependResultSets($rootScope.repoName,data.data)}):$interval.cancel(resultSetPoller):0===rsData.resultSets.length&&rsData.loadingStatus.prepending===!1&&fetchResultSets($rootScope.repoName,defaultResultSetCount)},resultSetPollInterval)},doResultSetPolling=function(rsParams){return _.has(rsParams,"revision")?!1:_.has(rsParams,"tochange")&&rsParams.tochange===repositories[$rootScope.repoName].resultSets[0].revision?!1:!0},pollJobs=function(){var resultSetIdList=_.pluck(repositories[$rootScope.repoName].resultSets,"id"),exclusionProfile=$location.search().exclusion_profile;ThResultSetModel.getResultSetJobsUpdates(resultSetIdList,$rootScope.repoName,exclusionProfile,lastJobUpdate).then(function(jobList){if(jobList.length>0){var lastModifiedJob=getLastModifiedJob(jobList);null!==lastModifiedJob&&(lastJobUpdate=new Date(lastModifiedJob.last_modified+"Z"));var jobListByResultSet=_.values(_.groupBy(jobList,"result_set_id"));_.each(jobListByResultSet,function(singleResultSetJobList){mapResultSetJobs($rootScope.repoName,singleResultSetJobList)})}})},registerJobsPoller=function(){$interval(pollJobs,jobPollInterval)},mapResultSetJobs=function(repoName,jobList){if(jobList.length>0){var resultSetId=jobList[0].result_set_id,resultSet=_.findWhere(repositories[repoName].resultSets,{id:resultSetId});if(_.isUndefined(resultSet))return $q.defer().resolve();if(_.has(resultSet,"jobList")){var jobIds=_.pluck(jobList,"id");resultSet.jobList=_.filter(resultSet.jobList,function(job){return-1===_.indexOf(jobIds,job.id)}),resultSet.jobList=resultSet.jobList.concat(jobList)}else resultSet.jobList=jobList;var sortAndGroupJobs=_.compose(sortGroupedJobs,groupJobByPlatform);return sortAndGroupJobs(resultSet.jobList).then(function(groupedJobs){_.extend(resultSet,groupedJobs),mapPlatforms(repoName,resultSet),$rootScope.$emit(thEvents.applyNewJobs,resultSetId)})}return $q.defer().resolve()},addRepository=function(repoName){var locationSearch=thJobFilters.stripFiltersFromQueryString(_.clone($location.search()));$log.debug("locationSearch",locationSearch),(_.isEmpty(repositories[repoName])||!_.isEqual(locationSearch,repositories[repoName].search))&&($log.debug("fetching new resultset list with parameters:",locationSearch),repositories[repoName]={name:repoName,lastJobElSelected:{},lastJobObjSelected:{},rsMap:{},jobMap:{},unclassifiedFailureMap:{},rsMapOldestTimestamp:null,resultSets:[],loadingStatus:{appending:!1,prepending:!1},search:locationSearch})},getAllShownJobs=function(repoName,spaceRemaining,maxSize,resultsetId){var shownJobs=[],addIfShown=function(jMap){return resultsetId&&jMap.job_obj.result_set_id!==resultsetId?void 0:(jMap.job_obj.visible&&shownJobs.push(jMap.job_obj),_.size(shownJobs)===spaceRemaining?(thNotify.send("Max pinboard size of "+maxSize+" reached.","danger"),!0):!1)};return _.detect(getJobMap(repoName),addIfShown),shownJobs},getJobMapKey=function(job){return"key"+job.id},getSelectedJob=function(repoName){return{el:repositories[repoName].lastJobElSelected,job:repositories[repoName].lastJobObjSelected}},setSelectedJob=function(repoName,lastJobElSelected,lastJobObjSelected){repositories[repoName].lastJobElSelected=lastJobElSelected,repositories[repoName].lastJobObjSelected=lastJobObjSelected},getPlatformKey=function(name,option){var key=name;return void 0!==option&&(key+=option),key},mapResultSets=function(repoName,data){for(var rs_i=0;rs_irs_b.push_timestamp?-1:rs_a.push_timestamp0;){var jobFetchSlice=jobFetchList.splice(0,count);ThJobModel.get_list(repoName,{job_guid__in:jobFetchSlice.join(),count:count}).then(function(jobsFetched){var guids_fetched=_.pluck(jobsFetched,"job_guid"),guids_unfetched=_.difference(jobFetchSlice,guids_fetched);return guids_unfetched.length>0&&($log.debug("re-adding "+guids_unfetched.length+"job to the fetch queue"),unavailableJobs.push.apply(unavailableJobs,guids_unfetched)),jobsFetched},error_callback).then(_.bind(updateJobs,$rootScope,repoName))}_.delay(fetchJobs,1e4,repoName,unavailableJobs)},aggregateJobPlatform=function(repoName,job,platformData){var resultsetId,platformName,platformOption,platformAggregateId,platformKey,jobUpdated,resultsetAggregateId,revision,jobGroups;jobUpdated=updateJob(repoName,job),jobUpdated!==!1&&(resultsetId=job.result_set_id,platformName=job.platform,platformOption=job.platform_option,_.isEmpty(repositories[repoName].rsMap[resultsetId])||(platformAggregateId=thAggregateIds.getPlatformRowId(repoName,job.result_set_id,job.platform,job.platform_option),platformData[platformAggregateId]||_.isEmpty(repositories[repoName].rsMap[resultsetId])||(revision=repositories[repoName].rsMap[resultsetId].rs_obj.revision,resultsetAggregateId=thAggregateIds.getResultsetTableId($rootScope.repoName,resultsetId,revision),platformKey=getPlatformKey(platformName,platformOption),$log.debug("aggregateJobPlatform",repoName,resultsetId,platformKey,repositories),jobGroups=[],void 0!==repositories[repoName].rsMap[resultsetId].platforms[platformKey]&&(jobGroups=repositories[repoName].rsMap[resultsetId].platforms[platformKey].pl_obj.groups),platformData[platformAggregateId]={platformName:platformName,revision:revision,platformOrder:repositories[repoName].rsMap[resultsetId].rs_obj.platforms,resultsetId:resultsetId,resultsetAggregateId:resultsetAggregateId,platformOption:platformOption,jobGroups:jobGroups,jobs:[]}),platformData[platformAggregateId].jobs.push(job)))},updateJobs=function(repoName,jobList){$log.debug("number of jobs returned for add/update: ",jobList.length);var i,platformData={};for(i=0;i-1;i--)data.results[i].push_timestamp>=repositories[repoName].rsMapOldestTimestamp&&isInResultSetRange(repoName,data.results[i].push_timestamp)&&void 0===repositories[repoName].rsMap[data.results[i].id]?($log.debug("prepending resultset: ",data.results[i].id),repositories[repoName].resultSets.push(data.results[i]),added.push(data.results[i])):$log.debug("not prepending. timestamp is older");mapResultSets(repoName,added),repositories[repoName].loadingStatus.prepending=!1},appendResultSets=function(repoName,data){if(data.results.length>0){$log.debug("appendResultSets",data.results);var rsIds=_.map(repositories[repoName].resultSets,function(rs){return rs.id}),newResultsets=[];_.each(data.results,function(rs){_.contains(rsIds,rs.id)||newResultsets.push(rs)}),Array.prototype.push.apply(repositories[repoName].resultSets,newResultsets),mapResultSets(repoName,newResultsets),_.isUndefined(repositories[repoName].meta)&&(repositories[repoName].meta=data.meta)}repositories[repoName].loadingStatus.appending=!1},loadRevisions=function(repoName,resultsetId){$log.debug("loadRevisions",repoName,resultsetId);var rs=repositories[repoName].rsMap[resultsetId].rs_obj;return rs&&0===rs.revisions.length?($log.debug("loadRevisions: check out to load revisions",rs,repoName),ThResultSetModel.get(rs.revisions_uri).success(function(data){0===rs.revisions.length&&(Array.prototype.push.apply(rs.revisions,data),$timeout($rootScope.$emit(thEvents.revisionsLoaded,rs)))})):void 0},isInResultSetRange=function(repoName,push_timestamp){var result=!0;if(repositories[repoName]&&repositories[repoName].length){var meta=repositories[repoName].meta;_.has(meta,"push_timestamp__gte")&&push_timestampmeta.push_timestamp__lte&&(result=!1),_.has(meta,"push_timestamp__lt")&&push_timestamp>=meta.push_timestamp__lt&&(result=!1)}return result},getResultSetsArray=function(repoName){return repositories[repoName].resultSets},getResultSetsMap=function(repoName){return repositories[repoName].rsMap},getResultSet=function(repoName,resultsetId){return repositories[repoName].rsMap[resultsetId].rs_obj},getJobMap=function(repoName){return repositories[repoName].jobMap},getLoadingStatus=function(repoName){return repositories[repoName].loadingStatus},isNotLoaded=function(repoName){return _.isEmpty(repositories[repoName].rsMap)},fetchResultSets=function(repoName,count,keepFilters){repositories[repoName].loadingStatus.appending=!0;var resultsets,exclusionProfile=$location.search().exclusion_profile,loadRepositories=ThRepositoryModel.load({name:repoName,watchRepos:!0}),loadResultsets=ThResultSetModel.getResultSets(repoName,repositories[repoName].rsMapOldestTimestamp,count,void 0,!0,keepFilters).then(function(data){resultsets=data.data});return $q.all([loadRepositories,loadResultsets]).then(function(){appendResultSets(repoName,resultsets)},function(data){thNotify.send("Error retrieving resultset data!","danger",!0),$log.error(data),appendResultSets(repoName,{results:[]})}).then(function(){if(!$location.search().nojobs){var jobsPromiseList=ThResultSetModel.getResultSetJobs(resultsets,repoName,exclusionProfile);$q.all(jobsPromiseList).then(function(resultSetJobList){var lastJobUpdateList=_.map(resultSetJobList,getLastModifiedJob),lastJobModified=getLastModifiedJob(lastJobUpdateList);lastJobModified&&(lastJobUpdate=new Date(lastJobModified.last_modified+"Z"),lastJobUpdate.setSeconds(lastJobUpdate.getSeconds()-3))});var mapResultSetJobsPromiseList=_.map(jobsPromiseList,function(jobsPromise){return jobsPromise.then(function(jobs){return mapResultSetJobs(repoName,jobs)})});$q.all(mapResultSetJobsPromiseList).then(function(){registerJobsPoller()})}})},getLastModifiedJob=function(jobList){if(jobList.length>0){var sortedJobs=_.sortBy(jobList,"last_modified");return sortedJobs[sortedJobs.length-1]}return null},getJobCount=function(jobList){return _.reduce(jobList,function(memo,job){return job.job_coalesced_to_guid||memo[job.state]++,memo},thResultStatusObject.getResultStatusObject())},getJobGroupInfo=function(job){var name=job.job_group_name,symbol=job.job_group_symbol;if(job.tier&&1!==job.tier){"?"===symbol&&(symbol="");var tierLabel=symbol+"[Tier-"+job.tier+"]";name=tierLabel,symbol=tierLabel}return{name:name,symbol:symbol}},groupJobByPlatform=function(jobList){var groupedJobs={platforms:[],job_counts:getJobCount(jobList)};if(0===jobList.length)return groupedJobs;groupedJobs.id=jobList[0].result_set_id;for(var lastModified="",i=0;itreestatus.mozilla.org ',reason:"",tree:repoName}},getErrorTreeStatus=function(repoName){return{status:"error",message_of_the_day:'Error reaching treestatus.mozilla.org ',reason:'Error reaching treestatus.mozilla.org ',tree:repoName}},updateTreeStatus=function(repoName){var repoNames=watchedRepos[repoName]?[repoName]:_.keys(watchedRepos);repoNames=_.filter(repoNames,function(repo){return watchedRepos[repo]&&"unsupported"!==watchedRepos[repo].treeStatus.status?repo:void 0});var newStatuses={},getStatus=function(repo){$log.debug("updateTreeStatus","getStatus","updating",repo),treeStatus.get(repo).then(function(data){newStatuses[repo]=data.data,updateStatusesIfDone()},function(data){null!=data.data?newStatuses[repo]=getUnsupportedTreeStatus(repo):newStatuses[repo]=getErrorTreeStatus(repo),updateStatusesIfDone()})},updateStatusesIfDone=function(){_.size(newStatuses)===repoNames.length&&_.defer(function(){_.each(newStatuses,function(status){$log.debug("updateTreeStatus","updateStatusesIfDone",status.tree,status.status),watchedRepos[treeStatus.getRepoName(status.tree)].treeStatus=status})})};_.each(repoNames,getStatus)};return{load:load,get_list:get_list,getCurrent:getCurrent,setCurrent:setCurrent,getRepo:getByName,getOrderedRepoGroups:getOrderedRepoGroups,getCurrentTreeStatus:getCurrentTreeStatus,repos:repos,watchedRepos:watchedRepos,loadWatchedRepos:loadWatchedRepos,saveWatchedRepos:saveWatchedRepos,unwatchRepo:unwatchRepo,toggleWatched:toggleWatched}}]),treeherder.factory("ThBugJobMapModel",["$http","thUrl",function($http,thUrl){var ThBugJobMapModel=function(data){angular.extend(this,data)};return ThBugJobMapModel.get_uri=function(){return thUrl.getProjectUrl("/bug-job-map/")},ThBugJobMapModel.get_list=function(options){var query_string=$.param(options);return $http.get(ThBugJobMapModel.get_uri()+"?"+query_string).then(function(response){var item_list=[];return _.each(response.data,function(elem){item_list.push(new ThBugJobMapModel(elem))}),item_list})},ThBugJobMapModel.get=function(pk){return $http.get(ThBugJobMapModel.get_uri()+pk).then(function(response){return new ThBugJobMapModel(response.data)})},ThBugJobMapModel.prototype.create=function(){var bug_job_map=this;return $http.post(ThBugJobMapModel.get_uri(),bug_job_map)},ThBugJobMapModel.prototype["delete"]=function(){var pk=this.job_id+"-"+this.bug_id;return $http["delete"](ThBugJobMapModel.get_uri()+pk+"/")},ThBugJobMapModel}]),treeherder.factory("ThJobClassificationModel",["$http","ThLog","thUrl",function($http,ThLog,thUrl){var ThJobClassificationModel=function(data){angular.extend(this,data)};return ThJobClassificationModel.get_uri=function(){return thUrl.getProjectUrl("/note/")},ThJobClassificationModel.get_list=function(options){var query_string=$.param(options);return $http.get(ThJobClassificationModel.get_uri()+"?"+query_string).then(function(response){var item_list=[];return angular.forEach(response.data,function(elem){item_list.push(new ThJobClassificationModel(elem))}),item_list})},ThJobClassificationModel.get=function(pk){
-return $http.get(ThJobClassificationModel.get_uri()+pk).then(function(response){return new ThJobClassificationModel(response.data)})},ThJobClassificationModel.prototype.create=function(){var note=this;return $http.post(ThJobClassificationModel.get_uri(),note)},ThJobClassificationModel.prototype["delete"]=function(){return $http["delete"](ThJobClassificationModel.get_uri()+this.id+"/")},ThJobClassificationModel}]),treeherder.factory("ThJobModel",["$http","ThLog","thUrl","$q",function($http,ThLog,thUrl,$q){var ThJobModel=function(data){angular.extend(this,data)};return ThJobModel.prototype.get_current_eta=function(){var timestampSeconds=(new Date).getTime()/1e3;return Math.round((timestampSeconds-(parseInt(this.submit_timestamp)+parseInt(this.running_eta)))/60)},ThJobModel.prototype.get_typical_eta=function(){return Math.round(parseInt(this.running_eta)/60)},ThJobModel.get_uri=function(repoName){return thUrl.getProjectUrl("/jobs/",repoName)},ThJobModel.get_list=function(repoName,options,config){config=config||{};var timeout=config.timeout||null,fetch_all=config.fetch_all||!1;return $http.get(ThJobModel.get_uri(repoName),{params:options,timeout:timeout}).then(function(response){var item_list,next_pages_jobs=[];if(fetch_all&&response.data.results.length===response.data.meta.count){var current_offset=parseInt(response.data.meta.offset),page_size=parseInt(response.data.meta.count),new_options=angular.copy(options);new_options.offset=page_size+current_offset,new_options.count=page_size,next_pages_jobs=ThJobModel.get_list(repoName,new_options,config)}return item_list=_.has(response.data,"job_property_names")?_.map(response.data.results,function(elem){var job_obj=_.object(response.data.job_property_names,elem);return new ThJobModel(job_obj)}):_.map(response.data.results,function(job_obj){return new ThJobModel(job_obj)}),$q.when(next_pages_jobs).then(function(maybe_job_list){return item_list.concat(maybe_job_list)})})},ThJobModel.get=function(repoName,pk,config){config=config||{};var timeout=config.timeout||null;return $http.get(ThJobModel.get_uri(repoName)+pk+"/",{timeout:timeout}).then(function(response){return new ThJobModel(response.data)})},ThJobModel.retrigger=function(repoName,pk,config){config=config||{};var timeout=config.timeout||null;return $http.post(ThJobModel.get_uri(repoName)+pk+"/retrigger/",{timeout:timeout}).then(function(response){return new ThJobModel(response.data)})},ThJobModel.backfill=function(repoName,pk,config){config=config||{};var timeout=config.timeout||null;return $http.post(ThJobModel.get_uri(repoName)+pk+"/backfill/",{timeout:timeout})},ThJobModel.cancel=function(repoName,pk,config){config=config||{};var timeout=config.timeout||null;return $http.post(ThJobModel.get_uri(repoName)+pk+"/cancel/",{timeout:timeout}).then(function(response){return new ThJobModel(response.data)})},ThJobModel}]),treeherder.factory("ThJobExclusionModel",["$http","$log","thUrl","thNotify","$q",function($http,$log,thUrl,thNotify,$q){var ThJobExclusionModel=function(data){return angular.extend(this,data)};return ThJobExclusionModel.get_uri=function(){var url=thUrl.getRootUrl("/job-exclusion/");return url},ThJobExclusionModel.get_list=function(options,cache){options=options||{},cache=cache||!1;var query_string=$.param(options);return $http.get(ThJobExclusionModel.get_uri()+"?"+query_string,{cache:cache}).then(function(response){var item_list=[];return angular.forEach(response.data,function(elem){item_list.push(new ThJobExclusionModel(elem))}),item_list})},ThJobExclusionModel.get=function(pk){return $http.get(ThJobExclusionModel.get_uri()+pk).then(function(response){return new ThJobExclusionModel(response.data)})},ThJobExclusionModel.prototype.create=function(){var job_filter=this;return $http.post(ThJobExclusionModel.get_uri(),job_filter).then(function(response){angular.extend(job_filter,response.data),thNotify.send("Filter successfully created","success")},function(reason){return 400===reason.status?angular.forEach(reason.data,function(error_list,field){angular.forEach(error_list,function(error){thNotify.send(error,"danger")})}):thNotify.send(reason,"danger"),$q.reject(reason)})},ThJobExclusionModel.prototype.update=function(){var job_filter=this;return $http.put(ThJobExclusionModel.get_uri()+job_filter.id+"/",job_filter).then(function(response){angular.extend(job_filter,response.data),thNotify.send("Job filter successfully updated","success")},function(reason){return 400===reason.status?angular.forEach(reason.data,function(error_list,field){angular.forEach(error_list,function(error){thNotify.send(field+": "+error,"danger")})}):thNotify.send(reason,"danger"),$q.reject(reason)})},ThJobExclusionModel.prototype["delete"]=function(){$log.debug(this);var pk=this.id;return $http["delete"](ThJobExclusionModel.get_uri()+pk+"/").then(function(response){thNotify.send("Job filter successfully deleted","success")},function(reason){return thNotify.send(reason.data,"danger"),$q.reject(reason)})},ThJobExclusionModel}]),treeherder.factory("ThExclusionProfileModel",["$http","$log","thUrl","$q","thNotify",function($http,$log,thUrl,$q,thNotify){var ThExclusionProfileModel=function(data){return angular.extend(this,data)};return ThExclusionProfileModel.get_uri=function(){return thUrl.getRootUrl("/exclusion-profile/")},ThExclusionProfileModel.get_list=function(options,cache){options=options||{},cache=cache||!1;var query_string=$.param(options);return $http.get(ThExclusionProfileModel.get_uri()+"?"+query_string,{cache:cache}).then(function(response){var item_list=[];return angular.forEach(response.data,function(elem){item_list.push(new ThExclusionProfileModel(elem))}),item_list})},ThExclusionProfileModel.get=function(pk){return $http.get(ThExclusionProfileModel.get_uri()+pk).then(function(response){return new ThExclusionProfileModel(response.data)})},ThExclusionProfileModel.prototype.create=function(){var exclusion_profile=this;return $http.post(ThExclusionProfileModel.get_uri(),exclusion_profile).then(function(response){angular.extend(exclusion_profile,response.data),$log.debug(exclusion_profile),thNotify.send("Exclusion profile successfully created","success")},function(reason){return 400===reason.status?angular.forEach(reason.data,function(error_list,field){angular.forEach(error_list,function(error){thNotify.send(field+": "+error,"danger")})}):reason.data&&reason.data.detail?thNotify.send(reason.data.detail,"danger"):(thNotify.send("Error","danger"),$log.error(reason)),$q.reject(reason)})},ThExclusionProfileModel.prototype.update=function(){var exclusion_profile=this;return $http.put(ThExclusionProfileModel.get_uri()+exclusion_profile.id+"/",exclusion_profile).then(function(response){thNotify.send("Exclusion profile successfully updated","success")},function(reason){return 400===reason.status?angular.forEach(reason.data,function(error_list,field){angular.forEach(error_list,function(error){thNotify.send(field+": "+error,"danger")})}):thNotify.send(reason,"danger"),$q.reject(reason)})},ThExclusionProfileModel.prototype["delete"]=function(){$log.debug(this);var pk=this.id;return $http["delete"](ThExclusionProfileModel.get_uri()+pk+"/").then(function(response){thNotify.send("Exclusion profile successfully deleted","success")},function(reason){return thNotify.send(reason.data,"danger"),$q.reject(reason)})},ThExclusionProfileModel}]),treeherder.factory("ThBuildPlatformModel",["$http","$log","thUrl",function($http,$log,thUrl){var ThBuildPlatformModel=function(data){angular.extend(this,data)};return ThBuildPlatformModel.get_uri=function(){var url=thUrl.getRootUrl("/buildplatform/");return url},ThBuildPlatformModel.get_list=function(options){options=options||{};var query_string=$.param(options);return $http.get(ThBuildPlatformModel.get_uri()+"?"+query_string).then(function(response){var item_list=[];return angular.forEach(response.data,function(elem){item_list.push(new ThBuildPlatformModel(elem))}),item_list})},ThBuildPlatformModel.get=function(pk){return $http.get(ThBuildPlatformModel.get_uri()+pk).then(function(response){return new ThBuildPlatformModel(response.data)})},ThBuildPlatformModel}]),treeherder.factory("ThJobTypeModel",["$http","$log","thUrl",function($http,$log,thUrl){var ThJobTypeModel=function(data){angular.extend(this,data)};return ThJobTypeModel.get_uri=function(){var url=thUrl.getRootUrl("/jobtype/");return url},ThJobTypeModel.get_list=function(options){return options=options||{},$http.get(ThJobTypeModel.get_uri(),{cache:!0,params:options}).then(function(response){var item_list=[];return angular.forEach(response.data,function(elem){item_list.push(new ThJobTypeModel(elem))}),item_list})},ThJobTypeModel.get=function(pk){return $http.get(ThJobTypeModel.get_uri()+pk).then(function(response){return new ThJobTypeModel(response.data)})},ThJobTypeModel}]),treeherder.factory("ThJobGroupModel",["$http","$log","thUrl",function($http,$log,thUrl){var ThJobGroupModel=function(data){angular.extend(this,data)};return ThJobGroupModel.get_uri=function(){var url=thUrl.getRootUrl("/jobgroup/");return url},ThJobGroupModel.get_list=function(options){options=options||{};$.param(options);return $http.get(ThJobGroupModel.get_uri(),{cache:!0,params:options}).then(function(response){var item_list=[];return angular.forEach(response.data,function(elem){item_list.push(new ThJobGroupModel(elem))}),item_list})},ThJobGroupModel.get=function(pk){return $http.get(ThJobGroupModel.get_uri()+pk).then(function(response){return new ThJobGroupModel(response.data)})},ThJobGroupModel}]),treeherder.factory("ThJobLogUrlModel",["$http","$log","thUrl",function($http,$log,thUrl){var ThJobLogUrlModel=function(data){angular.extend(this,data)};return ThJobLogUrlModel.prototype.parse=function(){if(!this.hasOwnProperty("id"))throw"The id property is required in order to parse a log";var uri=ThJobLogUrlModel.get_uri()+this.id+"/parse/";return $http.post(uri)},ThJobLogUrlModel.get_uri=function(){var url=thUrl.getProjectUrl("/job-log-url/");return url},ThJobLogUrlModel.get_list=function(job_id,config){config=config||{};var timeout=config.timeout||null,params={job_id:job_id};return $http.get(ThJobLogUrlModel.get_uri(),{params:params,timeout:timeout}).then(function(response){var item_list=[];return angular.forEach(response.data,function(elem){var buildUrl=(elem.url.split("/"),elem.url.slice(0,elem.url.lastIndexOf("/"))+"/");elem.buildUrl=buildUrl,item_list.push(new ThJobLogUrlModel(elem))}),item_list})},ThJobLogUrlModel.get=function(pk){return $http.get(ThJobLogUrlModel.get_uri()+pk+"/").then(function(response){return new ThJobLogUrlModel(response.data)})},ThJobLogUrlModel}]),treeherder.factory("ThOptionCollectionModel",["$http","$log","thUrl",function($http,$log,thUrl){var get_list=function(options){options=options||{};var query_string=$.param(options);return $http.get(thUrl.getRootUrl("/optioncollectionhash/")+"?"+query_string)},get_map=function(options){return get_list(options).then(function(optCollectionData){var optionCollectionMap={};return _.each(optCollectionData.data,function(optColl){optionCollectionMap[optColl.option_collection_hash]=_.uniq(_.map(optColl.options,function(option){return option.name})).sort().join()}),optionCollectionMap})};return{get_list:get_list,get_map:get_map}}]),treeherder.factory("ThUserModel",["$http","$log","thUrl","thNotify","$q",function($http,$log,thUrl,thNotify,$q){var ThUserModel=function(data){angular.extend(this,data)};return ThUserModel.get_uri=function(){return thUrl.getRootUrl("/user/")},ThUserModel.get=function(){return $http.get(ThUserModel.get_uri()).then(function(response){return response.data.length>0?new ThUserModel(response.data[0]):$q.reject({data:"User not found"})},function(reason){return thNotify.send(reason.data,"danger"),$q.reject(reason)})},ThUserModel}]),treeherder.factory("ThModelErrors",[function(){var AUTH_ERROR_MSG="Please login to Treeherder using Persona to complete this action";return{format:function(e,message){if(!e||!e.data)return message;switch(e.status){case 401:case 403:return AUTH_ERROR_MSG;default:return message+":"+e.data.detail}}}}]),treeherderApp.controller("MainCtrl",["$scope","$rootScope","$routeParams","$location","ThLog","ThRepositoryModel","thPinboard","thNotify","thClassificationTypes","thEvents","$interval","$window","ThExclusionProfileModel","thJobFilters","ThResultSetStore","thDefaultRepo","thJobNavSelectors",function($scope,$rootScope,$routeParams,$location,ThLog,ThRepositoryModel,thPinboard,thNotify,thClassificationTypes,thEvents,$interval,$window,ThExclusionProfileModel,thJobFilters,ThResultSetStore,thDefaultRepo,thJobNavSelectors){var $log=new ThLog("MainCtrl");thClassificationTypes.load(),$rootScope.getWindowTitle=function(){var ufc=$scope.getUnclassifiedFailureCount($rootScope.repoName);return"["+ufc+"] "+$rootScope.repoName},$rootScope.closeJob=function(){$rootScope.selectedJob=null,$rootScope.$emit(thEvents.clearSelectedJob,$rootScope.selectedJob),ThResultSetStore.setSelectedJob($rootScope.repoName)},$scope.clearJobOnClick=function(event){var element=event.target,ignoreClear=element.hasAttribute("ignore-job-clear-on-click");ignoreClear||thPinboard.hasPinnedJobs()||$scope.closeJob()};var mousetrapExclusions=["i","right","left","j","n","k","p","r","space","u","b","c","f","l"];$scope.allowKeys=function(){Mousetrap.unbind(mousetrapExclusions)},$scope.allowKeysClassificationDropdown=function(){Mousetrap.unbind(_.without(mousetrapExclusions,"c","b"))},$scope.processKeyboardInput=function(ev){var activeElement=document.activeElement;"INPUT"===activeElement.tagName||"SELECT"===activeElement.tagName||"TEXTAREA"===activeElement.tagName||activeElement.isContentEditable||16===ev.keyCode||(Mousetrap.bind("i",function(){$scope.$evalAsync($scope.toggleInProgress())}),Mousetrap.bind("left",function(){$rootScope.$emit(thEvents.changeSelection,"previous",thJobNavSelectors.ALL_JOBS)}),Mousetrap.bind("right",function(){$rootScope.$emit(thEvents.changeSelection,"next",thJobNavSelectors.ALL_JOBS)}),Mousetrap.bind(["j","n"],function(){$rootScope.$emit(thEvents.changeSelection,"next",thJobNavSelectors.UNCLASSIFIED_FAILURES)}),Mousetrap.bind(["k","p"],function(){$rootScope.$emit(thEvents.changeSelection,"previous",thJobNavSelectors.UNCLASSIFIED_FAILURES)}),Mousetrap.bind("r",function(){$scope.selectedJob&&$scope.$evalAsync($rootScope.$emit(thEvents.jobRetrigger,$rootScope.selectedJob))}),Mousetrap.bind("space",function(ev){$scope.selectedJob&&(ev.preventDefault(),$scope.$evalAsync($rootScope.$emit(thEvents.jobPin,$rootScope.selectedJob)))}),Mousetrap.bind("u",function(){$scope.$evalAsync($scope.toggleUnclassifiedFailures)}),Mousetrap.bind("b",function(ev){$scope.selectedJob&&($rootScope.$emit(thEvents.addRelatedBug,$rootScope.selectedJob),ev.preventDefault(),$scope.$evalAsync($rootScope.$broadcast("focus-this","related-bug-input")),$scope.$evalAsync($scope.allowKeys()))}),Mousetrap.bind("c",function(ev){$scope.selectedJob&&($scope.$evalAsync($rootScope.$emit(thEvents.jobPin,$rootScope.selectedJob)),ev.preventDefault(),$scope.$evalAsync($rootScope.$broadcast("focus-this","classification-comment")),$scope.$evalAsync($scope.allowKeys()))}),Mousetrap.bind("f",function(ev){ev.preventDefault(),$("#platform-job-text-search-field").focus()}),Mousetrap.bind("ctrl+shift+f",function(ev){ev.preventDefault(),$scope.$evalAsync($scope.clearFilterBox())}),Mousetrap.bind("escape",function(){$scope.$evalAsync($scope.setFilterPanelShowing(!1)),$scope.$evalAsync($scope.setSettingsPanelShowing(!1)),$scope.$evalAsync($scope.setSheriffPanelShowing(!1)),$scope.$evalAsync($scope.closeJob())}),Mousetrap.bind("ctrl+shift+u",function(){$scope.$evalAsync($rootScope.$emit(thEvents.clearPinboard))}),Mousetrap.bind("ctrl+enter",function(){$scope.$evalAsync($rootScope.$emit(thEvents.saveClassification))}),Mousetrap.bind("l",function(){$scope.selectedJob&&$scope.$evalAsync($rootScope.$emit(thEvents.openLogviewer))}),Mousetrap.bind("ctrl+backspace",function(){$scope.selectedJob&&$scope.$evalAsync($rootScope.$emit(thEvents.deleteClassification))}))},$scope.repoModel=ThRepositoryModel,$scope.getTopNavBarHeight=function(){return $("#th-global-top-nav-panel").find("#top-nav-main-panel").height()},$rootScope.$watch($scope.getTopNavBarHeight,function(newValue){$("body").css("padding-top",newValue)}),$scope.setDropDownPull=function(event){$log.debug("dropDown",event.target);var element=event.target.offsetParent;element.offsetLeft>$(window).width()/2?$(element).find(".dropdown-menu").addClass("pull-right"):$(element).find(".dropdown-menu").removeClass("pull-right")},$scope.getUnclassifiedFailureCount=function(repoName){return ThResultSetStore.getUnclassifiedFailureCount(repoName)},$scope.isSkippingExclusionProfiles="false"===$location.search().exclusion_profile,$scope.toggleExcludedJobs=function(){"false"===$location.search().exclusion_profile?$location.search("exclusion_profile",null):$location.search("exclusion_profile","false")},$scope.toggleUnclassifiedFailures=thJobFilters.toggleUnclassifiedFailures,$scope.toggleTier1Only=thJobFilters.toggleTier1Only,$scope.toggleInProgress=function(){thJobFilters.toggleInProgress()},$scope.allExpanded=function(cls){var fullList=$("."+cls),visibleList=$("."+cls+":visible");return fullList.length===visibleList.length},$scope.allCollapsed=function(cls){var visibleList=$("."+cls+":visible");return 0===visibleList.length},$scope.toggleAllRevisions=function(collapse){collapse=collapse||$scope.allCollapsed("revision-list"),$rootScope.$emit(thEvents.toggleAllRevisions,collapse)};var getNewReloadTriggerParams=function(){return _.pick($location.search(),ThResultSetStore.reloadOnChangeParameters)};$scope.setLocationSearchParam=function(param,value){$location.search(param,value)},$scope.cachedReloadTriggerParams=getNewReloadTriggerParams(),$rootScope.$on("$locationChangeSuccess",function(){$rootScope.locationPath=$location.path().replace("/",""),$rootScope.urlBasePath=$location.absUrl().split("?")[0];var newReloadTriggerParams=getNewReloadTriggerParams(),defaulting=newReloadTriggerParams.repo===thDefaultRepo&&!$scope.cachedReloadTriggerParams.repo;defaulting||!$scope.cachedReloadTriggerParams||_.isEqual(newReloadTriggerParams,$scope.cachedReloadTriggerParams)||$rootScope.skipNextPageReload?$scope.cachedReloadTriggerParams=newReloadTriggerParams:$window.location.reload(),$rootScope.skipNextPageReload=!1}),$scope.changeRepo=function(repo_name){$location.search({repo:repo_name})},$scope.clearFilterBox=function(){thJobFilters.removeFilter("searchStr"),$("#platform-job-text-search-field").val(""),$("#platform-job-text-search-field").focus()},$scope.isFilterPanelShowing=!1,$scope.setFilterPanelShowing=function(tf){$scope.isFilterPanelShowing=tf},$scope.isSettingsPanelShowing=!1,$scope.setSettingsPanelShowing=function(tf){$scope.isSettingsPanelShowing=tf},$scope.isSheriffPanelShowing=!1,$scope.setSheriffPanelShowing=function(tf){tf&&$rootScope.$emit(thEvents.initSheriffPanel),$scope.isSheriffPanelShowing=tf},$scope.pinboardCount=thPinboard.count,$scope.pinnedJobs=thPinboard.pinnedJobs}]),treeherderApp.controller("SheriffCtrl",["$scope","$rootScope","ThBuildPlatformModel","ThJobTypeModel","thEvents","ThRepositoryModel","ThOptionCollectionModel","ThJobExclusionModel","ThExclusionProfileModel","thNotify","$q",function($scope,$rootScope,ThBuildPlatformModel,ThJobTypeModel,thEvents,ThRepositoryModel,ThOptionCollectionModel,ThJobExclusionModel,ThExclusionProfileModel,thNotify,$q){$scope.exclusions=[],$scope.exclusions_map={},$scope.profiles=[];var init=function(){$scope.initComplete||(ThJobExclusionModel.get_list().then(function(data){$scope.exclusions=data,$scope.exclusions_map=_.indexBy($scope.exclusions,"id")}),ThExclusionProfileModel.get_list({},!1).then(function(data){$scope.profiles=data}),$scope.initComplete=!0)};$rootScope.$on(thEvents.initSheriffPanel,function(){init()}),$scope.refreshExclusionProfileList=function(){ThExclusionProfileModel.get_list({},!1).then(function(data){$scope.profiles=data,thNotify.send("Refresh the page to see changes reflected.")})};var getJobComboField=function(field1,field2){return field1+" ("+field2+")"};$scope.view="exclusion_profile_list",$scope.switchView=function(newView){$scope.view=newView},$scope.master_platforms=[],ThBuildPlatformModel.get_list().then(function(data){for(var i=0;i0&&_.has(buildapi_artifact[0],"blob")&&($scope.artifacts.buildapi=buildapi_artifact[0]),$scope.jobSearchStr=thJobSearchStr($scope.job),$scope.jobSearchSignature=$scope.job.signature,$scope.jobSearchStrHref=getJobSearchStrHref($scope.jobSearchStr),$scope.jobSearchSignatureHref=getJobSearchStrHref($scope.job.signature);var jobInfoArtifact=results[2];jobInfoArtifact.length>0&&($scope.job_details=jobInfoArtifact.reduce(function(result,artifact){return artifact.blob&&Array.isArray(artifact.blob.job_details)&&(result=result.concat(artifact.blob.job_details)),$scope.artifacts.buildapi&&($scope.artifacts.buildapi.blob.title="Buildername",$scope.artifacts.buildapi.blob.value=$scope.artifacts.buildapi.blob.buildername,result=result.concat($scope.artifacts.buildapi.blob)),result},[])),$scope.job_log_urls=_.reject(results[3],{name:"mozlog_json"}),$scope.job_log_urls.length?$scope.job_log_urls[0].parse_status&&($scope.logParseStatus=$scope.job_log_urls[0].parse_status):$scope.logParseStatus="unavailable";var logsNotParsed=[];$scope.jobLogsAllParsed=_.every($scope.job_log_urls,function(jlu){return"pending"===jlu.parse_status?(logsNotParsed.push(jlu),!1):!0}),logsNotParsed.length>0&&$q.all(_.map(logsNotParsed,function(log){return log.parse()})).then(function(parseLogResponses){_.every(parseLogResponses,function(parseLogResponse){return 200===parseLogResponse.status})&&(selectJobRetryPromise=$timeout(function(){selectJobAndRender(job_id)},5e3))}),$scope.lvUrl=thUrl.getLogViewerUrl($scope.job.id),$scope.lvFullUrl=location.origin+"/"+$scope.lvUrl,$scope.resultStatusShading="result-status-shading-"+thResultStatus($scope.job),updateVisibleFields(),$scope.updateClassifications(),$scope.updateBugs(),$scope.job_detail_loading=!1})}},updateVisibleFields=function(){var undef="",duration="";$scope.visibleFields={Build:$scope.job.build_architecture+" "+$scope.job.build_platform+" "+$scope.job.build_os||undef,"Job name":$scope.job.job_type_name||undef},$scope.visibleTimeFields={requestTime:dateFilter(1e3*$scope.job.submit_timestamp,thDateFormat)};var endtime=$scope.job.end_timestamp||Date.now()/1e3,starttime=$scope.job.start_timestamp||$scope.job.submit_timestamp;duration=numberFilter((endtime-starttime)/60,0)+" minute(s)",$scope.visibleTimeFields.duration=duration,$scope.job.start_timestamp&&($scope.visibleTimeFields.startTime=dateFilter(1e3*$scope.job.start_timestamp,thDateFormat)),$scope.job.end_timestamp&&($scope.visibleTimeFields.endTime=dateFilter(1e3*$scope.job.end_timestamp,thDateFormat))};$scope.getCountPinnedJobs=function(){return thPinboard.count.numPinnedJobs},$scope.togglePinboardVisibility=function(){$scope.isPinboardVisible=!$scope.isPinboardVisible},$scope.$watch("getCountPinnedJobs()",function(newVal,oldVal){0===oldVal&&newVal>0&&($scope.isPinboardVisible=!0)}),$scope.canCancel=function(){return $scope.job&&("pending"===$scope.job.state||"running"===$scope.job.state)};var getBuildbotRequestId=function(){return $scope.artifacts.buildapi?$scope.artifacts.buildapi.blob.request_id:void 0};$scope.retriggerJob=function(){$scope.user.loggedin?$scope.job.id?ThJobModel.retrigger($scope.repoName,$scope.job.id).then(function(){if("ash"!==$scope.repoName){var requestId=getBuildbotRequestId();return requestId?thBuildApi.retriggerJob($scope.repoName,requestId):void 0}}).then(function(){thNotify.send("Retriggered job: "+$scope.jobSearchStr,"success")})["catch"](function(e){thNotify.send(ThModelErrors.format(e,"Unable to send retrigger"),"danger")}):thNotify.send("Job not yet loaded for retrigger","warning"):thNotify.send("Must be logged in to retrigger a job","danger")},$scope.backfillJob=function(){$scope.user.loggedin?$scope.job.id?ThJobModel.backfill($scope.repoName,$scope.job.id).then(function(){thNotify.send("Request sent to backfill jobs","success")},function(e){thNotify.send(ThModelErrors.format(e,"Unable to send backfill"),"danger")}):thNotify.send("Job not yet loaded for backfill","warning"):thNotify.send("Must be logged in to backfill a job","danger")},$scope.cancelJob=function(){$scope.user.loggedin?ThJobModel.cancel($scope.repoName,$scope.job.id).then(function(){if("ash"!==$scope.repoName){var requestId=getBuildbotRequestId();return requestId?thBuildApi.cancelJob($scope.repoName,requestId):void 0}})["catch"](function(e){thNotify.send(ThModelErrors.format(e,"Unable to cancel job"),"danger",!0)}):thNotify.send("Must be logged in to cancel a job","danger")},$scope.cancelAll=function(resultsetId){var rs=ThResultSetModel.getResultSet($scope.repoName,resultsetId);thBuildApi.cancelAllJobs($scope.repoName,rs.revision)},$scope.isReftest=function(){return $scope.selectedJob?thReftestStatus($scope.selectedJob):void 0};var selectJobAndRender=function(job_id,job_selection_type){$scope.jobLoadedPromise=selectJob(job_id,job_selection_type),$scope.jobLoadedPromise.then(function(){thTabs.showTab(thTabs.selectedTab,job_id)})};$rootScope.$on(thEvents.jobClick,function(event,job,job_selection_type){selectJobAndRender(job.id,job_selection_type),$rootScope.selectedJob=job}),$rootScope.$on(thEvents.clearSelectedJob,function(event,job){null!==selectJobPromise&&$timeout.cancel(selectJobPromise),null!==selectJobRetryPromise&&$timeout.cancel(selectJobRetryPromise)}),$scope.bug_job_map_list=[],$scope.classificationTypes=thClassificationTypes,$scope.updateClassifications=function(){ThJobClassificationModel.get_list({job_id:$scope.job.id}).then(function(response){$scope.classifications=response,$scope.job.note=$scope.classifications[0]})},$scope.updateBugs=function(){_.has($scope.job,"id")&&ThBugJobMapModel.get_list({job_id:$scope.job.id}).then(function(response){$scope.bugs=response})},$rootScope.$on(thEvents.openLogviewer,function(){"pending"===$scope.logParseStatus?thNotify.send("Log parsing in progress, log viewer not yet available","info"):"failed"===$scope.logParseStatus?thNotify.send("Log parsing has failed, log viewer is unavailable","warning"):"unavailable"===$scope.logParseStatus?thNotify.send("No logs available for this job","info"):"parsed"===$scope.logParseStatus&&$("#logviewer-btn")[0].click()}),$rootScope.$on(thEvents.jobRetrigger,function(event,job){$scope.retriggerJob()}),$rootScope.$on(thEvents.jobsClassified,function(event,job){$scope.updateClassifications()}),$rootScope.$on(thEvents.bugsAssociated,function(event,job){$scope.updateBugs()}),$scope.pinboard_service=thPinboard,$scope.tabService=thTabs}]),treeherder.controller("PinboardCtrl",["$scope","$rootScope","$document","$timeout","thEvents","thPinboard","thNotify","ThLog",function($scope,$rootScope,$document,$timeout,thEvents,thPinboard,thNotify,ThLog){function handleRelatedBugDocumentClick(event){$(event.target).hasClass("add-related-bugs-input")||$scope.$apply(function(){$scope.toggleEnterBugNumber(!1)})}var $log=new ThLog(this.constructor.name);$rootScope.$on(thEvents.jobPin,function(event,job){$scope.pinJob(job),$scope.$$phase||$scope.$digest()}),$rootScope.$on(thEvents.addRelatedBug,function(event,job){$scope.pinJob(job),$scope.toggleEnterBugNumber(!0)}),$rootScope.$on(thEvents.saveClassification,function(event){$scope.isPinboardVisible&&$scope.save()}),$rootScope.$on(thEvents.clearPinboard,function(event){$scope.isPinboardVisible&&$scope.unPinAll()}),$scope.pinJob=function(job){thPinboard.pinJob(job),$scope.selectedJob||$scope.viewJob(job)},$scope.pinSelectedJob=function(){thPinboard.pinJob($scope.selectedJob)},$scope.unPinJob=function(id){thPinboard.unPinJob(id)},$scope.addBug=function(bug){thPinboard.addBug(bug)},$scope.removeBug=function(id){thPinboard.removeBug(id)},$scope.unPinAll=function(){thPinboard.unPinAll(),$scope.classification=thPinboard.createNewClassification()},$scope.save=function(){if($scope.user.loggedin){$scope.enteringBugNumber&&$scope.saveEnteredBugNumber(),$scope.classification.who=$scope.user.email;var classification=$scope.classification;thPinboard.save(classification),$scope.completeClassification(),$scope.classification=thPinboard.createNewClassification(),$rootScope.$emit(thEvents.selectJob,$rootScope.selectedJob,"passive")}else thNotify.send("Must be logged in to save job classifications","danger")},$scope.saveClassificationOnly=function(){$scope.user.loggedin?($scope.classification.who=$scope.user.email,thPinboard.saveClassificationOnly($scope.classification)):thNotify.send("Must be logged in to save job classifications","danger")},$scope.saveBugsOnly=function(){$scope.user.loggedin?thPinboard.saveBugsOnly():thNotify.send("Must be logged in to save job classifications","danger")},$scope.hasPinnedJobs=function(){return thPinboard.hasPinnedJobs()},$scope.hasRelatedBugs=function(){return thPinboard.hasRelatedBugs()},$scope.toggleEnterBugNumber=function(tf){$scope.enteringBugNumber=tf,$scope.focusInput=tf,$document.off("click",handleRelatedBugDocumentClick),tf?(Mousetrap.bind("escape",function(){var cancel=_.bind($scope.toggleEnterBugNumber,$scope,!1);$scope.$evalAsync(cancel)}),$timeout(function(){$document.on("click",handleRelatedBugDocumentClick)},0)):$scope.newEnteredBugNumber=""},$scope.completeClassification=function(){$rootScope.$broadcast("blur-this","classification-comment")},$scope.saveEnteredBugNumber=function(){$scope.enteringBugNumber&&($scope.newEnteredBugNumber?($log.debug("new bug number to be saved: ",$scope.newEnteredBugNumber),thPinboard.addBug({id:$scope.newEnteredBugNumber}),$scope.toggleEnterBugNumber(!1)):$scope.toggleEnterBugNumber(!1))},$scope.viewJob=function(job){$rootScope.selectedJob=job,$rootScope.$emit(thEvents.jobClick,job),$rootScope.$emit(thEvents.selectJob,job)},$scope.classification=thPinboard.createNewClassification(),$scope.pinnedJobs=thPinboard.pinnedJobs,$scope.relatedBugs=thPinboard.relatedBugs}]),treeherder.controller("AnnotationsPluginCtrl",["$scope","$rootScope","ThLog","ThJobClassificationModel","thNotify","thEvents","ThResultSetStore","ThBugJobMapModel","thTabs",function($scope,$rootScope,ThLog,ThJobClassificationModel,thNotify,thEvents,ThResultSetStore,ThBugJobMapModel,thTabs){var $log=new ThLog(this.constructor.name);$log.debug("annotations plugin initialized"),$scope.$watch("classifications",function(newValue,oldValue){thTabs.tabs.annotations.num_items=newValue?$scope.classifications.length:0},!0),$rootScope.$on(thEvents.deleteClassification,function(event){if($scope.classifications[0]){$scope.deleteClassification($scope.classifications[0]);for(var i=0;i<$scope.bugs.length;i++)$scope.deleteBug($scope.bugs[i]);$rootScope.$emit(thEvents.selectJob,$rootScope.selectedJob,"passive")}else thNotify.send("No classification on this job to delete","warning")}),$scope.deleteClassification=function(classification){var key="key"+classification.job_id,jobMap=ThResultSetStore.getJobMap($rootScope.repoName),job=jobMap[key].job_obj;job.failure_classification_id=1,ThResultSetStore.updateUnclassifiedFailureMap($rootScope.repoName,job),classification["delete"]().then(function(){thNotify.send("Classification successfully deleted","success",!1);var jobs={};jobs[$scope.selectedJob.id]=$scope.selectedJob,ThResultSetStore.fetchJobs($scope.repoName,[$scope.job.id]),$rootScope.$emit(thEvents.jobsClassified,{jobs:jobs})},function(){thNotify.send("Classification deletion failed","danger",!0)})},$scope.deleteBug=function(bug){bug["delete"]().then(function(){thNotify.send("Association to bug "+bug.bug_id+" successfully deleted","success",!1);var jobs={};jobs[$scope.selectedJob.id]=$scope.selectedJob,$rootScope.$emit(thEvents.bugsAssociated,{jobs:jobs})},function(){thNotify.send("Association to bug "+bug.bug_id+" deletion failed","danger",!0)})}}]),treeherder.controller("BugsPluginCtrl",["$scope","ThLog","ThJobArtifactModel","$q","thTabs","$timeout",function($scope,ThLog,ThJobArtifactModel,$q,thTabs,$timeout){var $log=new ThLog(this.constructor.name);$log.debug("bugs plugin initialized");var timeoutPromise=null,requestPromise=null,bug_limit=20;$scope.tabs=thTabs.tabs,thTabs.tabs.failureSummary.update=function(){var newValue=thTabs.tabs.failureSummary.contentId;$scope.suggestions=[],angular.isDefined(newValue)&&(thTabs.tabs.failureSummary.is_loading=!0,null!==timeoutPromise&&$timeout.cancel(timeoutPromise),null!==requestPromise&&requestPromise.resolve(),requestPromise=$q.defer(),ThJobArtifactModel.get_list({name:"Bug suggestions",type:"json",job_id:newValue},{timeout:requestPromise}).then(function(artifact_list){var suggestions=[];if(artifact_list.length>0){var artifact=artifact_list[0];angular.forEach(artifact.blob,function(suggestion){suggestion.bugs.too_many_open_recent=suggestion.bugs.open_recent.length>bug_limit,suggestion.bugs.too_many_all_others=suggestion.bugs.all_others.length>bug_limit,suggestion.valid_open_recent=suggestion.bugs.open_recent.length>0&&!suggestion.bugs.too_many_open_recent,suggestion.valid_all_others=suggestion.bugs.all_others.length>0&&!suggestion.bugs.too_many_all_others&&!suggestion.bugs.too_many_open_recent,suggestions.push(suggestion)}),$scope.suggestions=suggestions,$scope.bugSuggestionsLoaded=!0}else $scope.selectedJob&&($scope.bugSuggestionsLoaded=!1,timeoutPromise=$timeout(thTabs.tabs.failureSummary.update,5e3))})["finally"](function(){thTabs.tabs.failureSummary.is_loading=!1}))}}]),treeherder.controller("SimilarJobsPluginCtrl",["$scope","ThLog","ThJobModel","thResultStatusInfo","thEvents","numberFilter","dateFilter","thClassificationTypes","thResultStatus","ThJobArtifactModel","ThResultSetModel","thNotify","thTabs",function($scope,ThLog,ThJobModel,thResultStatusInfo,thEvents,numberFilter,dateFilter,thClassificationTypes,thResultStatus,ThJobArtifactModel,ThResultSetModel,thNotify,thTabs){var $log=new ThLog(this.constructor.name);$log.debug("similar jobs plugin initialized"),$scope.page_size=20,$scope.get_similar_jobs=function(){thTabs.tabs.similarJobs.is_loading=!0;var options={count:$scope.page_size+1,offset:($scope.page-1)*$scope.page_size};angular.forEach($scope.similar_jobs_filters,function(value,key){value&&(options[key]=$scope.job[key])}),ThJobModel.get_list($scope.repoName,options).then(function(data){if(data.length>0){data.length>$scope.page_size?$scope.has_next_page=!0:$scope.has_next_page=!1,data.pop();var result_set_ids=_.uniq(_.pluck(data,"result_set_id"));ThResultSetModel.getResultSets($scope.repoName,null,100,result_set_ids,!0,!1).then(function(response){var resultsets=_.indexBy(response.data.results,"id");angular.forEach(data,function(obj){obj.result_set=resultsets[obj.result_set_id],obj.revisionResultsetFilterUrl=$scope.urlBasePath+"?repo="+$scope.repoName+"&revision="+obj.result_set.revisions[0].revision,obj.authorResultsetFilterUrl=$scope.urlBasePath+"?repo="+$scope.repoName+"&author="+encodeURIComponent(obj.result_set.author)}),$scope.similar_jobs=$.merge($scope.similar_jobs,data),1===$scope.page&&$scope.similar_jobs.length>0&&$scope.show_job_info($scope.similar_jobs[0]),thTabs.tabs.similarJobs.is_loading=!1},function(){thNotify.send("Error fetching result sets for similar jobs","danger")})}})},$scope.update_similar_jobs=function(){angular.isDefined($scope.jobLoadedPromise)&&$scope.jobLoadedPromise.then(function(){$scope.similar_jobs=[],$scope.page=1,$scope.similar_job_selected=null,$scope.get_similar_jobs()})},thTabs.tabs.similarJobs.update=$scope.update_similar_jobs,$scope.similar_jobs=[],$scope.result_status_info=thResultStatusInfo,$scope.similar_jobs_filters={machine_id:!1,job_type_id:!0,build_platform_id:!0,option_collection_hash:!0},$scope.button_class=function(job){var resultState=job.result;return"completed"!==job.state&&(resultState=job.state),thResultStatusInfo(resultState).btnClass},$scope.show_next=function(){$scope.page+=1,$scope.get_similar_jobs()},$scope.similar_job_selected=null,$scope.show_job_info=function(job){ThJobModel.get($scope.repoName,job.id).then(function(job){$scope.similar_job_selected=job,$scope.similar_job_selected.result_status=thResultStatus($scope.similar_job_selected);var duration=($scope.similar_job_selected.end_timestamp-$scope.similar_job_selected.start_timestamp)/60;duration&&(duration=numberFilter(duration,0)),$scope.similar_job_selected.duration=duration,$scope.similar_job_selected.start_time=0!==$scope.similar_job_selected.start_timestamp?dateFilter(1e3*$scope.similar_job_selected.start_timestamp,"short"):"",$scope.similar_job_selected.failure_classification=thClassificationTypes.classifications[$scope.similar_job_selected.failure_classification_id],ThJobArtifactModel.get_list({name:"text_log_summary",job_id:$scope.similar_job_selected.id}).then(function(artifact_list){artifact_list.length>0&&($scope.similar_job_selected.error_lines=artifact_list[0].blob.step_data.all_errors)})})}}]),treeherder.filter("showOrHide",function(){return function(input,isCollapsed){return 1==isCollapsed?"show"+input:"hide"+input}}),treeherder.filter("platformName",["thPlatformNameMap",function(thPlatformNameMap){return function(input,name){var newName=platformNameMap[name];return newName?newName:name}}]),treeherder.filter("stripHtml",function(){return function(input){var str=input||"";return str.replace(/<\/?[^>]+>/gi,"")}}),treeherder.filter("linkifyBugs",function(){return function(input){var str=input||"",bug_matches=str.match(/-- ([0-9]+)|bug.([0-9]+)/gi),pr_matches=str.match(/PR#([0-9]+)/gi),bug_title="bugzilla.mozilla.org",bug_url=''+initials+""}}),treeherder.filter("highlightCommonTerms",function(){return function(input,compareStr){var tokens=compareStr.split(/[^a-zA-Z0-9_-]+/);return tokens.sort(function(a,b){return b.length-a.length}),angular.forEach(tokens,function(elem){elem.length>0&&(input=input.replace(new RegExp(elem,"gi"),function(token,index,str){return inTag(str,index,"<",">")||inTag(str,index,"&",";")?token:""+token+" "}))}),input}}),treeherder.filter("escapeHTML",function(){return function(text){return text?text.replace(/&/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,"""):""}});angular.module('treeherder').run(['$templateCache', function($templateCache) {
+t=Jo(function(){return Te(f,p+"return "+l).apply(w,a)}),t.source=l,fe(t))throw t;return t},$n.trim=xe,$n.trimLeft=function(n,t,r){var e=n;return(n=u(n))?n.slice((r?jr(e,t,r):null==t)?g(n):i(n,t+"")):n},$n.trimRight=function(n,t,r){var e=n;return(n=u(n))?(r?jr(e,t,r):null==t)?n.slice(0,y(n)+1):n.slice(0,f(n,t+"")+1):n},$n.trunc=function(n,t,r){r&&jr(n,t,r)&&(t=null);var e=S;if(r=W,null!=t)if(ae(t)){var o="separator"in t?t.separator:o,e="length"in t?+t.length||0:e;r="omission"in t?u(t.omission):r}else e=+t||0;if(n=u(n),e>=n.length)return n;if(e-=r.length,1>e)return r;if(t=n.slice(0,e),null==o)return t+r;if(se(o)){if(n.slice(e).search(o)){var i,f=n.slice(0,e);for(o.global||(o=$e(o.source,(kn.exec(o)||"")+"g")),o.lastIndex=0;n=o.exec(f);)i=n.index;t=t.slice(0,null==i?e:i)}}else n.indexOf(o,e)!=e&&(o=t.lastIndexOf(o),o>-1&&(t=t.slice(0,o)));return t+r},$n.unescape=function(n){return(n=u(n))&&pn.test(n)?n.replace(ln,d):n},$n.uniqueId=function(n){var t=++Ve;return u(n)+t},$n.words=Ae,$n.all=Zr,$n.any=ne,$n.contains=Jr,$n.detect=eo,$n.foldl=so,$n.foldr=po,$n.head=Br,$n.include=Jr,$n.inject=so,Ee($n,function(){var n={};return ht($n,function(t,r){$n.prototype[r]||(n[r]=t)}),n}(),!1),$n.sample=Hr,$n.prototype.sample=function(n){return this.__chain__||null!=n?this.thru(function(t){return Hr(t,n)}):Hr(this.value())},$n.VERSION=b,Kn("bind bindKey curry curryRight partial partialRight".split(" "),function(n){$n[n].placeholder=$n}),Kn(["dropWhile","filter","map","takeWhile"],function(n,t){var r=t!=$,e=t==N;zn.prototype[n]=function(n,u){var o=this.__filtered__,i=o&&e?new zn(this):this.clone();return(i.__iteratees__||(i.__iteratees__=[])).push({done:!1,count:0,index:0,iteratee:yr(n,u,1),limit:-1,type:t}),i.__filtered__=o||r,i}}),Kn(["drop","take"],function(n,t){var r=n+"While";zn.prototype[n]=function(r){var e=this.__filtered__,u=e&&!t?this.dropWhile():this.clone();return r=null==r?1:yu(nu(r)||0,0),e?t?u.__takeCount__=du(u.__takeCount__,r):Mr(u.__iteratees__).limit=r:(u.__views__||(u.__views__=[])).push({size:r,type:n+(0>u.__dir__?"Right":"")}),u},zn.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse()},zn.prototype[n+"RightWhile"]=function(n,t){return this.reverse()[r](n,t).reverse()}}),Kn(["first","last"],function(n,t){var r="take"+(t?"Right":"");zn.prototype[n]=function(){return this[r](1).value()[0]}}),Kn(["initial","rest"],function(n,t){var r="drop"+(t?"":"Right");zn.prototype[n]=function(){return this[r](1)}}),Kn(["pluck","where"],function(n,t){var r=t?"filter":"map",e=t?wt:Re;zn.prototype[n]=function(n){return this[r](e(n))}}),zn.prototype.compact=function(){return this.filter(Oe)},zn.prototype.reject=function(n,t){return n=yr(n,t,1),this.filter(function(t){return!n(t)})},zn.prototype.slice=function(n,t){n=null==n?0:+n||0;var r=0>n?this.takeRight(-n):this.drop(n);return t!==w&&(t=+t||0,r=0>t?r.dropRight(-t):r.take(t-n)),r},zn.prototype.toArray=function(){return this.drop(0)},ht(zn.prototype,function(n,t){var r=$n[t];if(r){var e=/^(?:filter|map|reject)|While$/.test(t),u=/^(?:first|last)$/.test(t);$n.prototype[t]=function(){function t(n){return n=[n],eu.apply(n,o),r.apply($n,n)}var o=arguments,i=this.__chain__,f=this.__wrapped__,a=!!this.__actions__.length,c=f instanceof zn,l=o[0],s=c||Io(f);return s&&e&&"function"==typeof l&&1!=l.length&&(c=s=!1),c=c&&!a,u&&!i?c?n.call(f):r.call($n,this.value()):s?(f=n.apply(c?f:new zn(this),o),u||!a&&!f.__actions__||(f.__actions__||(f.__actions__=[])).push({func:Yr,args:[t],thisArg:$n}),new Bn(f,i)):this.thru(t)}}}),Kn("concat join pop push replace shift sort splice split unshift".split(" "),function(n){var t=(/^(?:replace|split)$/.test(n)?De:ze)[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:join|pop|replace|shift)$/.test(n);$n.prototype[n]=function(){var n=arguments;return e&&!this.__chain__?t.apply(this.value(),n):this[r](function(r){return t.apply(r,n)})}}),ht(zn.prototype,function(n,t){var r=$n[t];if(r){var e=r.name;(Su[e]||(Su[e]=[])).push({name:t,func:r})}}),Su[ar(null,A).name]=[{name:"wrapper",func:null}],zn.prototype.clone=function(){var n=this.__actions__,t=this.__iteratees__,r=this.__views__,e=new zn(this.__wrapped__);return e.__actions__=n?qn(n):null,e.__dir__=this.__dir__,e.__filtered__=this.__filtered__,e.__iteratees__=t?qn(t):null,e.__takeCount__=this.__takeCount__,e.__views__=r?qn(r):null,e},zn.prototype.reverse=function(){if(this.__filtered__){var n=new zn(this);n.__dir__=-1,n.__filtered__=!0}else n=this.clone(),n.__dir__*=-1;return n},zn.prototype.value=function(){var n=this.__wrapped__.value();if(!Io(n))return Ft(n,this.__actions__);var t,r=this.__dir__,e=0>r;t=n.length;for(var u=this.__views__,o=0,i=-1,f=u?u.length:0;++ia;){for(var u=u+r,l=-1,s=n[u];++lp.index:u-1?p.count++>=_:!h(s))))continue n}else if(p=h(s),_==$)s=p;else if(!p){if(_==F)continue n;break n}}c[a++]=s}return c},$n.prototype.chain=function(){return Vr(this)},$n.prototype.commit=function(){return new Bn(this.value(),this.__chain__)},$n.prototype.plant=function(n){for(var t,r=this;r instanceof Ln;){var e=Fr(r);t?u.__wrapped__=e:t=e;var u=e,r=r.__wrapped__}return u.__wrapped__=n,t},$n.prototype.reverse=function(){var n=this.__wrapped__;return n instanceof zn?(this.__actions__.length&&(n=new zn(this)),new Bn(n.reverse(),this.__chain__)):this.thru(function(n){return n.reverse()})},$n.prototype.toString=function(){return this.value()+""},$n.prototype.run=$n.prototype.toJSON=$n.prototype.valueOf=$n.prototype.value=function(){return Ft(this.__wrapped__,this.__actions__)},$n.prototype.collect=$n.prototype.map,$n.prototype.head=$n.prototype.first,$n.prototype.select=$n.prototype.filter,$n.prototype.tail=$n.prototype.rest,$n}var w,b="3.7.0",x=1,A=2,j=4,k=8,O=16,E=32,I=64,R=128,C=256,S=30,W="...",T=150,U=16,N=0,F=1,$=2,L="Expected a function",B="__lodash_placeholder__",z="[object Arguments]",M="[object Array]",D="[object Boolean]",P="[object Date]",q="[object Error]",K="[object Function]",V="[object Number]",Y="[object Object]",Z="[object RegExp]",G="[object String]",J="[object ArrayBuffer]",X="[object Float32Array]",H="[object Float64Array]",Q="[object Int8Array]",nn="[object Int16Array]",tn="[object Int32Array]",rn="[object Uint8Array]",en="[object Uint8ClampedArray]",un="[object Uint16Array]",on="[object Uint32Array]",fn=/\b__p\+='';/g,an=/\b(__p\+=)''\+/g,cn=/(__e\(.*?\)|\b__t\))\+'';/g,ln=/&(?:amp|lt|gt|quot|#39|#96);/g,sn=/[&<>"'`]/g,pn=RegExp(ln.source),hn=RegExp(sn.source),_n=/<%-([\s\S]+?)%>/g,vn=/<%([\s\S]+?)%>/g,gn=/<%=([\s\S]+?)%>/g,yn=/\.|\[(?:[^[\]]+|(["'])(?:(?!\1)[^\n\\]|\\.)*?)\1\]/,dn=/^\w*$/,mn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g,wn=/[.*+?^${}()|[\]\/\\]/g,bn=RegExp(wn.source),xn=/[\u0300-\u036f\ufe20-\ufe23]/g,An=/\\(\\)?/g,jn=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,kn=/\w*$/,On=/^0[xX]/,En=/^\[object .+?Constructor\]$/,In=/[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g,Rn=/($^)/,Cn=/['\n\r\u2028\u2029\\]/g,Sn=RegExp("[A-Z\\xc0-\\xd6\\xd8-\\xde]+(?=[A-Z\\xc0-\\xd6\\xd8-\\xde][a-z\\xdf-\\xf6\\xf8-\\xff]+)|[A-Z\\xc0-\\xd6\\xd8-\\xde]?[a-z\\xdf-\\xf6\\xf8-\\xff]+|[A-Z\\xc0-\\xd6\\xd8-\\xde]+|[0-9]+","g"),Wn=" \f \ufeff\n\r\u2028\u2029 ",Tn="Array ArrayBuffer Date Error Float32Array Float64Array Function Int8Array Int16Array Int32Array Math Number Object RegExp Set String _ clearTimeout document isFinite parseInt setTimeout TypeError Uint8Array Uint8ClampedArray Uint16Array Uint32Array WeakMap window".split(" "),Un={};Un[X]=Un[H]=Un[Q]=Un[nn]=Un[tn]=Un[rn]=Un[en]=Un[un]=Un[on]=!0,Un[z]=Un[M]=Un[J]=Un[D]=Un[P]=Un[q]=Un[K]=Un["[object Map]"]=Un[V]=Un[Y]=Un[Z]=Un["[object Set]"]=Un[G]=Un["[object WeakMap]"]=!1;var Nn={};Nn[z]=Nn[M]=Nn[J]=Nn[D]=Nn[P]=Nn[X]=Nn[H]=Nn[Q]=Nn[nn]=Nn[tn]=Nn[V]=Nn[Y]=Nn[Z]=Nn[G]=Nn[rn]=Nn[en]=Nn[un]=Nn[on]=!0,Nn[q]=Nn[K]=Nn["[object Map]"]=Nn["[object Set]"]=Nn["[object WeakMap]"]=!1;var Fn={leading:!1,maxWait:0,trailing:!1},$n={"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss"},Ln={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},Bn={"&":"&","<":"<",">":">",""":'"',"'":"'","`":"`"},zn={"function":!0,object:!0},Mn={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Dn=zn[typeof exports]&&exports&&!exports.nodeType&&exports,Pn=zn[typeof module]&&module&&!module.nodeType&&module,qn=zn[typeof self]&&self&&self.Object&&self,Kn=zn[typeof window]&&window&&window.Object&&window,Vn=Pn&&Pn.exports===Dn&&Dn,Yn=Dn&&Pn&&"object"==typeof global&&global&&global.Object&&global||Kn!==(this&&this.window)&&Kn||qn||this,Zn=m();"function"==typeof define&&"object"==typeof define.amd&&define.amd?(Yn._=Zn,define(function(){return Zn})):Dn&&Pn?Vn?(Pn.exports=Zn)._=Zn:Dn._=Zn:Yn._=Zn}.call(this),angular.module("mc.resizer",[]).directive("resizer",function($document){return function($scope,$element,$attrs){function mousemove(event){if("vertical"==$attrs.resizer){var x=event.pageX;$attrs.resizerMax&&x>$attrs.resizerMax&&(x=parseInt($attrs.resizerMax)),$element.css({left:x+"px"}),$($attrs.resizerLeft).css({width:x+"px"}),$($attrs.resizerRight).css({left:x+parseInt($attrs.resizerWidth)+"px"})}else{var y=window.innerHeight-event.pageY;$element.css({bottom:y+"px"}),$($attrs.resizerTop).css({bottom:y+parseInt($attrs.resizerHeight)+"px"}),$($attrs.resizerBottom).css({height:y+"px"})}}function mouseup(){$document.unbind("mousemove",mousemove),$document.unbind("mouseup",mouseup)}$element.on("mousedown",function(event){event.preventDefault(),$document.on("mousemove",mousemove),$document.on("mouseup",mouseup)})}});var treeherder=angular.module("treeherder",["ngResource","ngSanitize","ngCookies","LocalStorageModule"]),treeherderApp=angular.module("treeherder.app",["treeherder","ui.bootstrap","ngRoute","mc.resizer","angular-toArrayFilter"]);treeherderApp.config(function($compileProvider,$routeProvider,$httpProvider,$logProvider){$compileProvider.debugInfoEnabled(!1),$logProvider.debugEnabled(!1),$httpProvider.defaults.useXDomain=!0,delete $httpProvider.defaults.headers.common["X-Requested-With"],$httpProvider.defaults.xsrfHeaderName="X-CSRFToken",$httpProvider.defaults.xsrfCookieName="csrftoken",$httpProvider.useApplyAsync(!0),$routeProvider.when("/jobs",{controller:"JobsCtrl",templateUrl:"partials/main/jobs.html",reloadOnSearch:!1}).when("/jobs/:tree",{controller:"JobsCtrl",templateUrl:"partials/main/jobs.html",reloadOnSearch:!1}).when("/timeline",{controller:"TimelineCtrl",templateUrl:"partials/main/timeline.html"}).when("/machines",{controller:"MachinesCtrl",templateUrl:"partials/main/machines.html"}).otherwise({redirectTo:"/jobs"})}),treeherder.factory("ThLog",["$log","ThLogConfig",function($log,ThLogConfig){var ThLog=function(name){this.name=name},whitelist=ThLogConfig.whitelist,blacklist=ThLogConfig.blacklist;ThLog.prototype.getClassName=function(){return this.name},ThLog.prototype.debug=function(){logIt(this,$log.debug,arguments)},ThLog.prototype.log=function(){logIt(this,$log.log,arguments)},ThLog.prototype.warn=function(){logIt(this,$log.warn,arguments)},ThLog.prototype.info=function(){logIt(this,$log.info,arguments)},ThLog.prototype.error=function(){logIt(this,$log.error,arguments)};var logIt=function(self,func,args){if(whitelist.length&&_.contains(whitelist,self.getClassName())||blacklist.length&&!_.contains(blacklist,self.getClassName())||!whitelist.length&&!blacklist.length){var newArgs=Array.prototype.slice.call(args);newArgs.unshift(self.getClassName()),func.apply(null,newArgs)}};return ThLog}]),treeherder.provider("ThLogConfig",function(){this.whitelist=[],this.blacklist=[],this.setBlacklist=function(bl){this.blacklist=bl},this.setWhitelist=function(wl){this.whitelist=wl},this.$get=function(){var self=this;return{whitelist:self.whitelist,blacklist:self.blacklist}}}),treeherder.provider("thServiceDomain",function(){this.$get=function(){return window.thServiceDomain?window.thServiceDomain:""}}),treeherder.provider("thResultStatusList",function(){var all=function(){return["success","testfailed","busted","exception","retry","usercancel","running","pending","coalesced"]},defaultFilters=function(){return["success","testfailed","busted","exception","retry","usercancel","running","pending"]};this.$get=function(){return{all:all,defaultFilters:defaultFilters}}}),treeherder.provider("thResultStatus",function(){this.$get=function(){return function(job){return"completed"===job.state?job.result:null!==job.job_coalesced_to_guid?"coalesced":job.state}}}),treeherder.provider("thResultStatusObject",function(){var getResultStatusObject=function(){return{running:0,pending:0,completed:0}};this.$get=function(){return{getResultStatusObject:getResultStatusObject}}}),treeherder.provider("thResultStatusInfo",function(){this.$get=function(){return function(resultState){var resultStatusInfo={severity:100,btnClass:"btn-default",jobButtonIcon:""};switch(resultState){case"busted":resultStatusInfo={severity:1,btnClass:"btn-red",btnClassClassified:"btn-red-classified",jobButtonIcon:"glyphicon glyphicon-fire",countText:"busted"};break;case"exception":resultStatusInfo={severity:2,btnClass:"btn-purple",btnClassClassified:"btn-purple-classified",jobButtonIcon:"glyphicon glyphicon-fire",countText:"exception"};break;case"testfailed":resultStatusInfo={severity:3,btnClass:"btn-orange",btnClassClassified:"btn-orange-classified",jobButtonIcon:"glyphicon glyphicon-warning-sign",countText:"failed"};break;case"unknown":resultStatusInfo={severity:4,btnClass:"btn-black",btnClassClassified:"btn-black-classified",jobButtonIcon:"",countText:"unknown"};break;case"usercancel":resultStatusInfo={severity:5,btnClass:"btn-pink",jobButtonIcon:"",countText:"cancel"};break;case"retry":resultStatusInfo={severity:6,btnClass:"btn-dkblue",jobButtonIcon:"",countText:"retry"};break;case"success":resultStatusInfo={severity:7,btnClass:"btn-green",jobButtonIcon:"",countText:"success"};break;case"running":resultStatusInfo={severity:8,btnClass:"btn-dkgray",jobButtonIcon:"",countText:"running"};break;case"pending":resultStatusInfo={severity:100,btnClass:"btn-ltgray",jobButtonIcon:"",countText:"pending"};break;case"coalesced":resultStatusInfo={severity:101,btnClass:"btn-yellow",jobButtonIcon:"",countText:"coalesced"}}return resultStatusInfo}}}),treeherder.provider("thEvents",function(){this.$get=function(){return{revisionsLoaded:"revisions-loaded-EVT",jobClick:"job-click-EVT",jobDetailLoaded:"job-detail-loaded-EVT",jobPin:"job-pin-EVT",jobRetrigger:"job-retrigger-EVT",jobContextMenu:"job-context-menu-EVT",jobsClassified:"jobs-classified-EVT",bugsAssociated:"bugs-associated-EVT",jobsLoaded:"jobs-loaded-EVT",clearSelectedJob:"clear-selected-job-EVT",globalFilterChanged:"status-filter-changed-EVT",toggleRevisions:"toggle-revisions-EVT",toggleAllRevisions:"toggle-all-revisions-EVT",toggleUnclassifiedFailures:"toggle-unclassified-failures-EVT",changeSelection:"next-previous-job-EVT",addRelatedBug:"add-related-bug-EVT",saveClassification:"save-classification-EVT",deleteClassification:"delete-classification-EVT",clearPinboard:"clear-pinboard-EVT",searchPage:"search-page-EVT",selectJob:"select-job-EVT",mapResultSetJobs:"map-result-set-jobs-EVT",applyNewJobs:"apply-new-jobs-EVT",initSheriffPanel:"init-sheriff-panel-EVT",openLogviewer:"open-logviewer-EVT"}}}),treeherder.provider("thAggregateIds",function(){var escape=function(id){return id.replace(/(:|\[|\]|\?|,|\.|\s+)/g,"-")},getPlatformRowId=function(repoName,resultsetId,platformName,platformOptions){return escape(repoName+resultsetId+platformName+platformOptions)},getResultsetTableId=function(repoName,resultsetId,revision){return escape(repoName+resultsetId+revision)};this.$get=function(){return{getPlatformRowId:getPlatformRowId,getResultsetTableId:getResultsetTableId}}}),treeherder.provider("thReftestStatus",function(){this.$get=function(){return function(job){return job.job_group_name?-1!==job.job_group_name.toLowerCase().indexOf("reftest"):void 0}}}),treeherder.value("thPlatformNameMap",{linux32:"Linux",linux64:"Linux x64","osx-10-6":"OS X 10.6","osx-10-7":"OS X 10.7","osx-10-8":"OS X 10.8","osx-10-9":"OS X 10.9","osx-10-10":"OS X 10.10",windowsxp:"Windows XP","windows7-32":"Windows 7","windows7-64":"Windows 7 x64","windows8-32":"Windows 8","windows8-64":"Windows 8 x64","windows2012-64":"Windows 2012 x64","android-2-2-armv6":"Android 2.2 Armv6","android-2-2":"Android 2.2","android-2-3-armv6":"Android 2.3 Armv6","android-2-3":"Android 2.3","android-2-3-armv7-api9":"Android 2.3 API9","android-4-0":"Android 4.0","android-4-0-armv7-api10":"Android 4.0 API10+","android-4-0-armv7-api11":"Android 4.0 API11+","android-4-2-x86":"Android 4.2 x86","android-4-2":"Android 4.2","android-4-2-armv7-api11":"Android 4.2 API11+","android-4-3":"Android 4.3","android-4-3-armv7-api11":"Android 4.3 API11+","android-4-4":"Android 4.4","android-4-4-armv7-api11":"Android 4.4 API11+","android-5-0-armv7-api11":"Android 5.0 API11+","b2g-linux32":"B2G Desktop Linux","b2g-linux64":"B2G Desktop Linux x64","b2g-osx":"B2G Desktop OS X","b2g-win32":"B2G Desktop Windows","b2g-emu-ics":"B2G ICS Emulator","b2g-emu-jb":"B2G JB Emulator","b2g-emu-kk":"B2G KK Emulator","b2g-emu-l":"B2G L Emulator","b2g-device-image":"B2G Device Image","mulet-linux32":"Mulet Linux","mulet-linux64":"Mulet Linux x64","mulet-osx":"Mulet OS X","mulet-win32":"Mulet Windows","graphene-linux64":"Graphene Linux x64","graphene-osx":"Graphene OS X","graphene-win64":"Graphene Windows x64","horizon-linux64":"Horizon Linux x64","horizon-osx":"Horizon OS X","horizon-win64":"Horizon Windows x64",other:"Other"}),treeherder.value("thPlatformOrder",{linux32:0,linux64:1,"osx-10-6":10,"osx-10-7":11,"osx-10-8":12,"osx-10-9":13,"osx-10-10":14,windowsxp:20,"windows7-32":21,"windows7-64":22,"windows8-32":23,"windows8-64":24,"windows2012-64":25,"android-2-2-armv6":30,"android-2-2":31,"android-2-3-armv6":32,"android-2-3":33,"android-2-3-armv7-api9":34,"android-4-0":35,"android-4-0-armv7-api10":36,"android-4-0-armv7-api11":37,"android-4-2-x86":38,"android-4-2":39,"android-4-2-armv7-api11":40,"android-4-3":41,"android-4-3-armv7-api11":42,"android-4-4":43,"android-4-4-armv7-api11":44,"android-5-0-armv7-api11":45,"b2g-linux32":50,"b2g-linux64":51,"b2g-osx":52,"b2g-win32":53,"b2g-emu-ics":54,"b2g-emu-jb":55,"b2g-emu-kk":56,"b2g-emu-l":57,"b2g-device-image":58,"mulet-linux32":60,"mulet-linux64":61,"mulet-osx":62,"mulet-win32":63,"graphene-linux64":71,"graphene-osx":72,"graphene-win64":73,"horizon-linux64":74,"horizon-osx":75,"horizon-win64":76,other:99}),treeherder.value("thOptionOrder",{opt:0,pgo:1,asan:2,debug:3,cc:4}),treeherder.value("thFailureResults",["testfailed","busted","exception"]),treeherder.value("thFavicons",{closed:"img/tree_closed.png",open:"img/tree_open.png","approval required":"img/tree_open.png",unavailable:"img/tree_open.png"}),treeherder.value("thRepoGroupOrder",{development:1,"project repositories":2,"try":3,"release-stabilization":4,taskcluster:5,"qa automation tests":6}),treeherder.value("thDefaultRepo","mozilla-inbound"),treeherder.value("thDateFormat","EEE MMM d, H:mm:ss"),treeherder.value("phTimeRanges",[{value:86400,text:"Last day"},{value:604800,text:"Last 7 days"},{value:1209600,text:"Last 14 days"},{value:2592e3,text:"Last 30 days"},{value:5184e3,text:"Last 60 days"},{value:7776e3,text:"Last 90 days"},{value:31536e3,text:"Last year"}]),treeherder.value("thJobNavSelectors",{ALL_JOBS:{name:"jobs",selector:".th-view-content .job-btn"},UNCLASSIFIED_FAILURES:{name:"unclassified failures",selector:".selected-job, .th-view-content .job-btn.btn-red, .th-view-content .job-btn.btn-orange, .th-view-content .job-btn.btn-purple"}}),treeherder.directive("ngRightClick",["$parse",function($parse){return function(scope,element,attrs){var fn=$parse(attrs.ngRightClick);element.bind("contextmenu",function(event){scope.$apply(function(){event.preventDefault(),fn(scope,{$event:event})})})}}]),treeherder.directive("focusThis",["$timeout",function($timeout){return function(scope,elem,attr){scope.$on("focus-this",function(event,id){attr.id==id&&$timeout(function(){elem[0].focus()},0)})}}]),treeherder.directive("blurThis",["$timeout",function($timeout){return function(scope,elem,attr){scope.$on("blur-this",function(event,id){attr.id==id&&$timeout(function(){elem[0].blur()},0)})}}]),treeherder.directive("focusMe",["$timeout",function($timeout){return{link:function(scope,element,attrs){scope.$watch(attrs.focusMe,function(value){value?$timeout(function(){element[0].focus()},0):$timeout(function(){element[0].blur()},0)})}}}]),treeherder.directive("copyValue",[function(){return{restrict:"A",link:function(scope,element,attrs){var cont=document.getElementById("clipboard-container"),clip=document.getElementById("clipboard");element.on("mouseenter",function(){cont.style.display="block",clip.value=attrs.copyValue,clip.focus(),clip.select()}),element.on("mouseleave",function(){cont.style.display="none",clip.value=""})}}}]),treeherder.directive("preventDefaultOnLeftClick",[function(){return{restrict:"A",link:function(scope,element,attrs){element.on("click",function(event){1===event.which&&event.preventDefault()})}}}]),treeherder.directive("thNotificationBox",["thNotify",function(thNotify){return{restrict:"E",templateUrl:"partials/main/thNotificationsBox.html",link:function(scope,element,attr){scope.notifier=thNotify,scope.alert_class_prefix="alert-"}}}]),treeherder.directive("thFaviconLink",["ThRepositoryModel","thFavicons",function(ThRepositoryModel,thFavicons){return{restrict:"E",link:function(scope,element,attr){scope.currentTreeStatus=ThRepositoryModel.getCurrentTreeStatus,scope.$watch("currentTreeStatus()",function(newVal){newVal&&(scope.favicon=thFavicons[ThRepositoryModel.getCurrentTreeStatus()])})},template:' '}}]),treeherder.directive("bugInput",function(){return{restrict:"A",link:function(scope,elem,attrs,ctrl){elem.on("invalid",function(event){event.target.setCustomValidity("Please enter a bug number")}),elem.on("input",function(event){event.target.setCustomValidity(""),event.target.value=event.target.value.trim()}),elem.attr("type","text"),elem.attr("pattern","\\s*\\d+\\s*")}}}),treeherder.directive("numbersOnly",function(){return{require:"ngModel",link:function(scope,element,attrs,modelCtrl){modelCtrl.$parsers.push(function(inputValue){if(void 0==inputValue)return"";var transformedInput=inputValue.replace(/[^0-9]/g,"");return transformedInput!=inputValue&&(modelCtrl.$setViewValue(transformedInput),modelCtrl.$render()),transformedInput})}}}),treeherder.directive("thMultiSelect",["$log",function($log){return{restrict:"E",templateUrl:"partials/main/thMultiSelect.html",scope:{leftList:"=",rightList:"="},link:function(scope,element,attrs){scope.leftSelected=[],scope.rightSelected=[];var move_options=function(what,from,to){for(var found,i=0;i0&&$(element[0]).append($(" ").attr("title",elem_list_clone.join(", ")).text(" and "+elem_list_clone.length+" others").tooltip())}})}}}]),treeherder.directive("thCloneJobs",["$rootScope","$http","ThLog","thUrl","thCloneHtml","thServiceDomain","thResultStatusInfo","thEvents","thAggregateIds","thJobFilters","thResultStatusObject","ThResultSetStore","ThJobModel","linkifyBugsFilter","thResultStatus","thPlatformName","thJobSearchStr","thNotify","$timeout",function($rootScope,$http,ThLog,thUrl,thCloneHtml,thServiceDomain,thResultStatusInfo,thEvents,thAggregateIds,thJobFilters,thResultStatusObject,ThResultSetStore,ThJobModel,linkifyBugsFilter,thResultStatus,thPlatformName,thJobSearchStr,thNotify,$timeout){var $log=new ThLog("thCloneJobs"),btnCls="btn-xs",selectedBtnCls="selected-job",largeBtnCls="btn-lg-xform",col5Cls="col-xs-5",col7Cls="col-xs-7",col12Cls="col-xs-12",jobListNoPadCls="job-list-nopad",jobListPadCls="job-list-pad",jobKeyAttr="data-jmkey",tableInterpolator=thCloneHtml.get("resultsetClone").interpolator,platformInterpolator=thCloneHtml.get("platformClone").interpolator,jobGroupInterpolator=thCloneHtml.get("jobGroupBeginClone").interpolator,jobBtnInterpolator=thCloneHtml.get("jobBtnClone").interpolator,getJobMapKey=function(job){return"key"+job.id},getHoverText=function(job){var hoverText=job.job_type_name+" - "+thResultStatus(job);if("completed"===job.state){var duration=Math.round((job.end_timestamp-job.start_timestamp)/60);hoverText+=" ("+duration+" mins)"}return hoverText};$rootScope.$on(thEvents.changeSelection,function(ev,direction,jobNavSelector){var el,key,jobs,getIndex,jobMap=ThResultSetStore.getJobMap($rootScope.repoName);if("next"===direction?getIndex=function(idx,jobs){return idx+1>_.size(jobs)-1?0:idx+1}:"previous"===direction&&(getIndex=function(idx,jobs){return 0>idx-1?_.size(jobs)-1:idx-1}),jobs=$(jobNavSelector.selector).filter(":visible, .selected-job"),jobs.length){var selIdx=jobs.index(jobs.filter(".selected-job")),idx=getIndex(selIdx,jobs);if(el=$(jobs[idx]),key=el.attr(jobKeyAttr),jobMap&&jobMap[key]&&selIdx!==idx)return void selectJob(jobMap[key].job_obj)}$timeout(function(){"none"===$(".selected-job").css("display")&&$rootScope.closeJob(),thNotify.send("No more "+jobNavSelector.name+" to select","warning")},0)}),$rootScope.$on(thEvents.selectJob,function(ev,job,job_selection_type){selectJob(job,job_selection_type)}),$rootScope.$on(thEvents.clearSelectedJob,function(ev,job){clearSelectJobStyles()});var selectJob=function(job,job_selection_type){var jobKey=getJobMapKey(job),jobEl=$("."+jobKey);clickJobCb({},jobEl,job,job_selection_type),scrollToElement(jobEl),ThResultSetStore.setSelectedJob($rootScope.repoName,jobEl,job)},setSelectJobStyles=function(el){var lastJobSelected=ThResultSetStore.getSelectedJob($rootScope.repoName);_.isEmpty(lastJobSelected.el)||(lastJobSelected.el.removeClass(selectedBtnCls),lastJobSelected.el.removeClass(largeBtnCls),lastJobSelected.el.addClass(btnCls)),el.removeClass(btnCls),el.addClass(largeBtnCls),el.addClass(selectedBtnCls)},clearSelectJobStyles=function(){var lastJobSelected=ThResultSetStore.getSelectedJob($rootScope.repoName);_.isEmpty(lastJobSelected.el)||(lastJobSelected.el.removeClass(selectedBtnCls),lastJobSelected.el.removeClass(largeBtnCls),lastJobSelected.el.addClass(btnCls))},broadcastJobChangedTimeout=null,clickJobCb=function(ev,el,job,job_selection_type){setSelectJobStyles(el),broadcastJobChangedTimeout&&window.clearTimeout(broadcastJobChangedTimeout),broadcastJobChangedTimeout=window.setTimeout(function(){$rootScope.$emit(thEvents.jobClick,job,job_selection_type)},200)},togglePinJobCb=function(ev,el,job){$rootScope.$emit(thEvents.jobPin,job)},addJobBtnEls=function(jgObj,jobBtnInterpolator,jobTdEl){var hText,key,resultState,job,jobStatus,jobBtn,l,jobsShown=0,lastJobSelected=ThResultSetStore.getSelectedJob($rootScope.repoName),jobBtnArray=[];for(l=0;l1?(jobStatus.value=job.job_type_symbol+"*",jobStatus.btnClassClassified&&(jobStatus.btnClass=jobStatus.btnClassClassified)):jobStatus.value=job.job_type_symbol,jobStatus.title=hText,jobBtn=$(jobBtnInterpolator(jobStatus)),jobBtnArray.push(jobBtn),jobBtnArray.push(" "),showHideJob(jobBtn,job.visible),_.isEmpty(lastJobSelected.job)||lastJobSelected.job.id!==job.id||(setSelectJobStyles(jobBtn),ThResultSetStore.setSelectedJob($rootScope.repoName,jobBtn,job));return jobTdEl.append(jobBtnArray),jobsShown},jobMouseDown=function(ev){var el=$(ev.target),key=el.attr(jobKeyAttr);if(key&&!_.isEmpty(this.job_map[key])){var job=this.job_map[key].job_obj;switch(ev.which){case 1:ev.ctrlKey||ev.metaKey?_.bind(togglePinJobCb,this,ev,el,job)():_.bind(clickJobCb,this,ev,el,job)();break;case 2:ev.preventDefault(),ThJobModel.get(this.repoName,job.id).then(function(data){data.logs.length>0&&window.open(data.logs[0].url,"Log")});break;case 3:break;default:_.bind(clickJobCb,this,ev,el,job)()}ThResultSetStore.setSelectedJob($rootScope.repoName,el,job)}},addRevisions=function(resultset,element){if(resultset.revisions.length>0){var revisionInterpolator=thCloneHtml.get("revisionsClone").interpolator,ulEl=element.find("ul");$(ulEl).empty();var revision,revisionHtml,userTokens,i;for(i=0;i]+/),userTokens.length>1&&(revision.email=userTokens[1]),revision.name=userTokens[0].trim(),revision.escaped_comment=_.escape(revision.comments.split("\n")[0]),revision.escaped_comment_linkified=linkifyBugsFilter(revision.escaped_comment),revisionHtml=revisionInterpolator(revision),ulEl.append(revisionHtml);if(resultset.revision_count>resultset.revisions.length){var pushlogInterpolator=thCloneHtml.get("pushlogRevisionsClone").interpolator;ulEl.append(pushlogInterpolator({currentRepo:$rootScope.currentRepo,revision:resultset.revision}))}}},toggleRevisions=function(element,expand){var revisionsEl=element.find("ul").parent(),jobsEl=element.find("table").parent(),revElDisplayState=revisionsEl.css("display")||"block",jobsElDisplayState=jobsEl.css("display")||"block",on="block"!==revElDisplayState;_.isUndefined(expand)||(on=expand);var rowEl=revisionsEl.parent();rowEl.css("display","block"),on?(ThResultSetStore.loadRevisions($rootScope.repoName,this.resultset.id),"block"===jobsElDisplayState&&(toggleRevisionsSpanOnWithJobs(revisionsEl),toggleJobsSpanOnWithRevisions(jobsEl))):(toggleRevisionsSpanOff(revisionsEl),toggleJobsSpanOnWithoutRevisions(jobsEl))},toggleRevisionsSpanOnWithJobs=function(el){el.css("display","block"),el.addClass(col5Cls)},toggleRevisionsSpanOff=function(el){el.css("display","none"),el.removeClass(col5Cls)},toggleJobsSpanOnWithRevisions=function(el){el.css("display","block"),el.removeClass(jobListNoPadCls),el.removeClass(col12Cls),el.addClass(col7Cls),el.addClass(jobListPadCls)},toggleJobsSpanOnWithoutRevisions=function(el){el.css("display","block"),el.removeClass(col7Cls),el.removeClass(jobListPadCls),el.addClass(jobListNoPadCls),
+el.addClass(col12Cls)},renderJobTableRow=function(row,jobTdEl,jobGroups){jobTdEl.empty();var jgObj,jobGroup,jobsShown,i;for(i=0;i0){var orderedPlatforms=[];orderedPlatforms.push(platformName);var td,platformSpan,spanPlatformName,r,p;for(r=0;r");var tableEl=document.getElementById(value.resultsetAggregateId);rowEl.prop("id",platformId),option=value.platformOption,platformTdEl=$(platformInterpolator({name:platformName,option:option,id:platformId})),rowEl.append(platformTdEl),jobTdEl=$(thCloneHtml.get("jobTdClone").text),renderJobTableRow(rowEl,jobTdEl,value.jobGroups),appendPlatformRow(tableEl,rowEl,platformName)}}},this)},scrollToElement=function(el){void 0!==el.position()&&$(".th-global-content").scrollTo(el,100,{offset:-40})},registerCustomEventCallbacks=function(scope,element,attrs){$rootScope.$on(thEvents.revisionsLoaded,function(ev,rs){rs.id===scope.resultset.id&&_.bind(addRevisions,scope,rs,element)()}),$rootScope.$on(thEvents.toggleRevisions,function(ev,rs,expand){rs.id===scope.resultset.id&&_.bind(toggleRevisions,scope,element,expand)()}),$rootScope.$on(thEvents.globalFilterChanged,function(ev,filterData){_.bind(filterJobs,scope,element)()}),$rootScope.$on(thEvents.searchPage,function(ev,searchData){_.bind(filterJobs,scope,element)()}),$rootScope.$on(thEvents.jobsLoaded,function(ev,platformData){_.bind(updateJobs,scope,platformData)()}),$rootScope.$on(thEvents.jobsClassified,function(ev,pinnedJobs){var jid,platformData={};for(jid in pinnedJobs.jobs)pinnedJobs.jobs.hasOwnProperty(jid)&&pinnedJobs.jobs[jid].result_set_id===scope.resultset.id&&ThResultSetStore.aggregateJobPlatform($rootScope.repoName,pinnedJobs.jobs[jid],platformData);_.isEmpty(platformData)||_.bind(updateJobs,scope,platformData)()}),$rootScope.$on(thEvents.applyNewJobs,function(ev,resultSetId){if(scope.resultset.id===resultSetId){var rsMap=ThResultSetStore.getResultSetsMap($rootScope.repoName),resultsetAggregateId=thAggregateIds.getResultsetTableId($rootScope.repoName,scope.resultset.id,scope.resultset.revision);_.defer(generateJobElements,resultsetAggregateId,rsMap[resultSetId].rs_obj)}})},generateJobElements=function(resultsetAggregateId,resultset){var tableEl=$("#"+resultsetAggregateId),waitSpanEl=$(tableEl).prev();$(waitSpanEl).css("display","none");var name,option,platformId,platformKey,row,platformTd,jobTdEl,j;for(j=0;j"),row.prop("id",platformId)):$(row).empty(),name=thPlatformName(resultset.platforms[j].name),option=resultset.platforms[j].option,platformTd=platformInterpolator({name:name,option:option,id:thAggregateIds.getPlatformRowId(resultset.id,resultset.platforms[j].name,resultset.platforms[j].option)}),row.append(platformTd),jobTdEl=$(thCloneHtml.get("jobTdClone").text),platformKey=ThResultSetStore.getPlatformKey(resultset.platforms[j].name,resultset.platforms[j].option),renderJobTableRow(row,jobTdEl,resultset.platforms[j].groups),tableEl.append(row)},linker=function(scope,element,attrs){element.off(),element.on("mousedown",_.bind(jobMouseDown,scope)),registerCustomEventCallbacks(scope,element);var resultsetAggregateId=thAggregateIds.getResultsetTableId($rootScope.repoName,scope.resultset.id,scope.resultset.revision),targetEl=$(tableInterpolator({aggregateId:resultsetAggregateId}));if(addRevisions(scope.resultset,targetEl),element.append(targetEl),void 0!==scope.resultset.platforms)generateJobElements(resultsetAggregateId,scope.resultset);else{var tableEl=$("#"+resultsetAggregateId),waitSpanEl=$(tableEl).prev();$(waitSpanEl).css("display","none")}return{link:linker,replace:!0}};return{link:linker,replace:!0}}]),treeherder.directive("personaButtons",["$http","$q","$log","$rootScope","thServiceDomain","BrowserId","ThUserModel",function($http,$q,$log,$rootScope,thServiceDomain,BrowserId,ThUserModel){return{restrict:"E",link:function(scope,element,attrs){BrowserId.info.then(function(response){$rootScope.user={},$rootScope.user.email=response.data.userEmail||null,$rootScope.user.loggedin=null!==$rootScope.user.email,$rootScope.user.loggedin&&ThUserModel.get().then(function(user){angular.extend($rootScope.user,user)},null)}).then(function(){navigator.id.watch({loggedInUser:$rootScope.user.email,onlogin:function(assertion){BrowserId.requestDeferred&&BrowserId.requestDeferred.resolve(assertion)},onlogout:function(){BrowserId.logoutDeferred&&BrowserId.logoutDeferred.resolve()}})}),scope.login=function(){BrowserId.login().then(function(response){$rootScope.user.loggedin=!0,$rootScope.user.email=response.data.email,ThUserModel.get().then(function(user){angular.extend($rootScope.user,user)},null)},function(){scope.logout()})},scope.logout=function(){BrowserId.logout().then(function(response){$rootScope.user={loggedin:!1,email:null}})}},templateUrl:"partials/main/persona_buttons.html"}}]),treeherder.directive("thActionButton",["$compile","thCloneHtml","ThResultSetStore",function($compile,thCloneHtml,ThResultSetStore){return{restrict:"E",templateUrl:"partials/main/thActionButton.html",link:function(scope,element,attrs){var openRevisions=function(){var interpolator=thCloneHtml.get("revisionUrlClone").interpolator,htmlStr="";_.forEach(scope.resultset.revisions,function(revision){htmlStr=interpolator({revisionUrl:scope.currentRepo.getRevisionHref(revision.revision)})+htmlStr});$compile(interpolator(scope))(scope,function(el,scope){var wnd=window.open("",scope.repoName,"outerHeight=250,outerWidth=500,toolbar=no,location=no,menubar=no");wnd.document.write(htmlStr)})};scope.openRevisionListWindow=function(){scope.resultset.revisions.length?openRevisions():ThResultSetStore.loadRevisions(scope.repoName,scope.resultset.id).then(function(){openRevisions()})}}}}]),treeherder.directive("thResultCounts",["thEvents","$rootScope",function(thEvents,$rootScope){return{restrict:"E",link:function(scope,element,attrs){var setTotalCount=function(){if(scope.resultset.job_counts){scope.inProgress=scope.resultset.job_counts.pending+scope.resultset.job_counts.running;var total=scope.resultset.job_counts.completed+scope.inProgress;scope.percentComplete=(scope.resultset.job_counts.completed/total*100).toFixed(0)}};$rootScope.$on(thEvents.applyNewJobs,function(evt,resultSetId){resultSetId===scope.resultset.id&&setTotalCount()})},templateUrl:"partials/main/thResultCounts.html"}}]),treeherder.directive("thAuthor",function(){return{restrict:"E",link:function(scope,element,attrs){var userTokens=attrs.author.split(/[<>]+/),email="";userTokens.length>1&&(email=userTokens[1]),scope.authorName=userTokens[0].trim(),scope.authorEmail=email},template:'{{authorName}} '}}),treeherder.directive("thFilterCheckbox",["thResultStatusInfo",function(thResultStatusInfo){return{restrict:"E",link:function(scope,element,attrs){scope.checkClass=thResultStatusInfo(scope.filterName).btnClass+"-count-classified"},templateUrl:"partials/main/thFilterCheckbox.html"}}]),treeherder.directive("thWatchedRepo",["ThLog",function(ThLog){var $log=new ThLog("thWatchedRepo"),statusInfo={open:{icon:"fa-circle-o",color:"treeOpen",btnClass:"btn-view-nav"},"approval required":{icon:"fa-lock",color:"treeApproval",btnClass:"btn-view-nav"},closed:{icon:"fa-times-circle",color:"treeClosed",btnClass:"btn-view-nav-closed"},unsupported:{icon:"fa-question",color:"treeUnavailable",btnClass:"btn-view-nav"},"not retrieved yet":{icon:"fa-spinner",color:"treeUnavailable",btnClass:"btn-view-nav"}};return{restrict:"E",link:function(scope,element,attrs){scope.updateTitleText=function(){scope.repoData.treeStatus&&(scope.titleText=scope.repoData.treeStatus.status,scope.repoData.treeStatus.reason&&(scope.titleText=scope.titleText+" - "+scope.repoData.treeStatus.reason),scope.repoData.treeStatus.message_of_the_day&&(scope.titleText=scope.titleText+" - "+scope.repoData.treeStatus.message_of_the_day))},scope.btnClass="btn-view-nav",scope.$watch("repoData.treeStatus.status",function(newVal){if(newVal){$log.debug("updated treeStatus",newVal);var si=statusInfo[newVal];scope.statusIcon=si.icon,scope.statusColor=si.color,scope.btnClass=si.btnClass,scope.updateTitleText()}})},templateUrl:"partials/main/thWatchedRepo.html"}}]),treeherder.directive("thWatchedRepoInfoDropDown",["ThLog","ThRepositoryModel","treeStatus",function(ThLog,ThRepositoryModel,treeStatus){return{restrict:"E",replace:!0,link:function(scope,element,attrs){scope.name=attrs.name,scope.treeStatus=treeStatus.getTreeStatusName(attrs.name);var repo_obj=ThRepositoryModel.getRepo(attrs.name);scope.pushlog=repo_obj.pushlogURL,scope.$watch("repoData.treeStatus",function(newVal){newVal&&(scope.reason=newVal.reason,scope.message_of_the_day=newVal.message_of_the_day)},!0)},templateUrl:"partials/main/thWatchedRepoInfoDropDown.html"}}]),treeherder.directive("thRepoDropdownContainer",["ThLog","$rootScope","thEvents",function(ThLog,$rootScope,thEvents){var $log=new ThLog("thRepoDropdownContainer");return{restrict:"A",link:function(scope,element,attrs){scope.closeable=!0,$(element).on({"hide.bs.dropdown":function(ev){$log.debug("repo menu container","hide.bs.dropdown",scope.closeable,ev.target.className);var closeable=scope.closeable;return scope.closeable=!0,closeable}}),$(".repo-dropdown-menu").on({click:function(ev){($(ev.target).hasClass(".repo-link")||$(ev.target).hasClass(".repo-checkbox"))&&(scope.closeable=!1),$log.debug("repo menu dropdown","click",scope.closeable,ev.target.className)},mouseup:function(ev){scope.closeable=!1,$log.debug("repo menu dropdown","mouseup",scope.closeable,ev.target.className)}})}}}]),treeherder.directive("thRepoMenuItem",["ThLog",function(ThLog){new ThLog("thRepoMenuItem");return{restrict:"E",replace:!0,link:function(scope,element,attrs){var elem=$(element);elem.find(".repo-link").prop("href",scope.urlBasePath+"?repo="+scope.repo.name),scope.repo.name===scope.repoName&&elem.find(".repo-checkbox").prop("disabled","disabled")},templateUrl:"partials/main/thRepoMenuItem.html"}}]),treeherder.directive("thExclusionState",function(){return{restrict:"A",link:function(scope,element,attrs){scope.exclusionStateClass="fa-square-o",scope.isSkippingExclusionProfiles&&(scope.exclusionStateClass="fa-square")}}}),treeherder.directive("thPinnedJob",["thResultStatusInfo","thResultStatus",function(thResultStatusInfo,thResultStatus){var getHoverText=function(job){var duration=Math.round((job.end_timestamp-job.start_timestamp)/60),status=thResultStatus(job);return job.job_type_name+" - "+status+" - "+duration+"mins"};return{restrict:"E",link:function(scope,element,attrs){var unbindWatcher=scope.$watch("job",function(newValue){var resultState=thResultStatus(scope.job);scope.job.display=thResultStatusInfo(resultState),scope.hoverText=getHoverText(scope.job),"completed"===scope.job.state&&unbindWatcher()},!0)},templateUrl:"partials/main/thPinnedJob.html"}}]),treeherder.directive("thRelatedBugSaved",function(){return{restrict:"E",templateUrl:"partials/main/thRelatedBugSaved.html"}}),treeherder.directive("thRelatedBugQueued",function(){return{restrict:"E",templateUrl:"partials/main/thRelatedBugQueued.html"}}),treeherder.directive("thFailureClassification",["$parse","thClassificationTypes",function($parse,thClassificationTypes){return{scope:{failureId:"="},link:function(scope,element,attrs){scope.$watch("failureId",function(newVal){newVal&&(scope.classification=thClassificationTypes.classifications[newVal],scope.badgeColorClass=scope.classification.star,scope.hoverText=scope.classification.name)})},template:' {{hoverText}}'}}]),treeherder.directive("thSimilarJobs",["ThJobModel","ThLog",function(ThJobModel,ThLog){return{restrict:"E",templateUrl:"partials/main/similar_jobs.html",link:function(scope,element,attr){scope.$watch("job",function(newVal,oldVal){newVal&&scope.update_similar_jobs(newVal)}),scope.similar_jobs=[],scope.similar_jobs_filters={machine_id:!0,job_type_id:!0,build_platform_id:!0},scope.update_similar_jobs=function(job){var options={result_set_id__ne:job.result_set_id};angular.forEach(scope.similar_jobs_filters,function(elem,key){elem&&(options[key]=job[key])}),ThJobModel.get_list(scope.repoName,options).then(function(data){scope.similar_jobs=data})}}}}]),treeherder.directive("thPinboardPanel",function(){return{restrict:"E",templateUrl:"partials/main/thPinboardPanel.html"}}),treeherder.factory("thUrl",["$rootScope","thServiceDomain","ThLog",function($rootScope,thServiceDomain,ThLog){var thUrl={getRootUrl:function(uri){return thServiceDomain+"/api"+uri},getProjectUrl:function(uri,repoName){return _.isUndefined(repoName)&&(repoName=$rootScope.repoName),thServiceDomain+"/api/project/"+repoName+uri},getLogViewerUrl:function(job_id){return"logviewer.html#?job_id="+job_id+"&repo="+$rootScope.repoName}};return thUrl}]),treeherder.factory("thCloneHtml",["$interpolate",function($interpolate){var templateId,templateName,templateTxt,i,cloneTemplateIds=["revisionsClone.html","resultsetClone.html","platformClone.html","jobTdClone.html","jobGroupBeginClone.html","jobBtnClone.html","revisionUrlClone.html","pushlogRevisionsClone.html"],cloneHtmlObjs={};for(i=0;imaxNsNotifications)return void $timeout(thNotify.shift);$timeout(thNotify.shift,4e3,!0)}},shift:function(){for(var i=0;i=0)return!0;return!1},_containsAllSubstr=function(arr,val){for(var i=0;i0&&(job.failure_classification_id=classification.failure_classification_id,ThResultSetStore.updateUnclassifiedFailureMap($rootScope.repoName,job),classification.job_id=job.id,classification.create().success(function(data){thNotify.send("Classification saved for "+job.platform+": "+job.job_type_name,"success")}).error(function(data){thNotify.send("Error saving classification for "+job.platform+": "+job.job_type_name,"danger"),$log.debug("classification failed",data)}))},saveBugs=function(job){_.forEach(relatedBugs,function(bug){var bjm=new ThBugJobMapModel({bug_id:bug.id,job_id:job.id,type:"annotation"});bjm.create().success(function(data){thNotify.send("Bug association saved for "+job.platform+": "+job.job_type_name,"success")}).error(function(data){thNotify.send("Error saving bug association for "+job.platform+": "+job.job_type_name,"danger")})})},api={pinJob:function(job){api.spaceRemaining()>0?(pinnedJobs[job.id]=job,api.count.numPinnedJobs=_.size(pinnedJobs)):thNotify.send("Pinboard is already at maximum size of "+api.maxNumPinned,"danger")},pinJobs:function(jobsToPin){_.forEach(jobsToPin,api.pinJob)},unPinJob:function(id){delete pinnedJobs[id],api.count.numPinnedJobs=_.size(pinnedJobs);
+},unPinAll:function(){for(var jid in pinnedJobs)pinnedJobs.hasOwnProperty(jid)&&delete pinnedJobs[jid];for(var bid in relatedBugs)relatedBugs.hasOwnProperty(bid)&&delete relatedBugs[bid];api.count.numPinnedJobs=_.size(pinnedJobs)},addBug:function(bug,job){$log.debug("adding bug ",bug),relatedBugs[bug.id]=bug,api.count.numRelatedBugs=_.size(relatedBugs),$log.debug("related bugs",relatedBugs),job&&api.pinJob(job)},removeBug:function(id){delete relatedBugs[id],api.count.numRelatedBugs=_.size(relatedBugs)},createNewClassification:function(){return new ThJobClassificationModel({note:"",who:null,failure_classification_id:4})},save:function(classification){var jid,pinnedJobsClone={};for(jid in pinnedJobs)pinnedJobs.hasOwnProperty(jid)&&(pinnedJobsClone[jid]=pinnedJobs[jid]);_.each(pinnedJobs,saveClassification,classification),$rootScope.$emit(thEvents.jobsClassified,{jobs:pinnedJobsClone}),_.each(pinnedJobs,saveBugs),$rootScope.$emit(thEvents.bugsAssociated,{jobs:pinnedJobsClone}),api.unPinAll()},saveClassificationOnly:function(classification){_.each(pinnedJobs,saveClassification,classification),$rootScope.$emit(thEvents.jobsClassified,{jobs:pinnedJobs})},saveBugsOnly:function(){_.each(pinnedJobs,saveBugs),$rootScope.$emit(thEvents.bugsAssociated,{jobs:pinnedJobs})},hasPinnedJobs:function(){return!_.isEmpty(pinnedJobs)},hasRelatedBugs:function(){return!_.isEmpty(relatedBugs)},spaceRemaining:function(){return api.maxNumPinned-api.count.numPinnedJobs},pinnedJobs:pinnedJobs,relatedBugs:relatedBugs,count:{numPinnedJobs:0,numRelatedBugs:0},maxNumPinned:500};return api}]),treeherder.factory("treeStatus",["$http","$q",function($http,$q){var urlBase="https://treestatus.mozilla.org/",getTreeStatusName=function(name){return name.indexOf("comm-")>=0&&"try-comm-central"!==name?name+"-thunderbird":name},getRepoName=function(name){return name.replace("-thunderbird","")},get=function(repoName){var url=urlBase+getTreeStatusName(repoName);return $http.get(url,{params:{format:"json"}})};return{get:get,getTreeStatusName:getTreeStatusName,getRepoName:getRepoName}}]),treeherder.factory("ThResultSetModel",["$rootScope","$http","$location","$q","thUrl","thResultStatusObject","thEvents","thServiceDomain","ThLog","thNotify","ThJobModel","thPlatformOrder","thOptionOrder",function($rootScope,$http,$location,$q,thUrl,thResultStatusObject,thEvents,thServiceDomain,ThLog,thNotify,ThJobModel,thPlatformOrder,thOptionOrder){var $log=new ThLog("ThResultSetModel"),MAX_RESULTSET_FETCH_SIZE=100,convertDates=function(locationParams){return $log.debug("locationParams",locationParams),_.has(locationParams,"startdate")&&(locationParams.push_timestamp__gte=Date.parse(locationParams.startdate)/1e3,delete locationParams.startdate),_.has(locationParams,"enddate")&&(locationParams.push_timestamp__lt=Date.parse(locationParams.enddate)/1e3+84600,delete locationParams.enddate),locationParams},hasLowerRange=function(locationParams){return locationParams.fromchange||locationParams.startdate};return{getResultSetsFromChange:function(repoName,revision,locationParams){return locationParams=convertDates(locationParams),_.extend(locationParams,{fromchange:revision}),$http.get(thUrl.getProjectUrl("/resultset/",repoName),{params:locationParams})},getResultSets:function(repoName,rsOffsetTimestamp,count,resultsetlist,full,keep_filters){rsOffsetTimestamp="undefined"==typeof rsOffsetTimestamp?0:rsOffsetTimestamp,full=_.isUndefined(full)?!0:full,keep_filters=_.isUndefined(keep_filters)?!0:keep_filters;var params={full:full};if(params.count=count?Math.min(count,MAX_RESULTSET_FETCH_SIZE):10,rsOffsetTimestamp&&(params.push_timestamp__lte=rsOffsetTimestamp,params.count++),keep_filters){var locationParams=_.clone($location.search());delete locationParams.repo,rsOffsetTimestamp?(delete locationParams.tochange,delete locationParams.fromchange):hasLowerRange(locationParams)&&(params.count=MAX_RESULTSET_FETCH_SIZE),locationParams=convertDates(locationParams),$log.debug("updated params",params),_.extend(params,locationParams)}return resultsetlist&&_.extend(params,{offset:0,count:resultsetlist.length,id__in:resultsetlist.join()}),$http.get(thUrl.getProjectUrl("/resultset/",repoName),{params:params})},getResultSet:function(repoName,pk){return $http.get(thUrl.getProjectUrl("/resultset/"+pk+"/",repoName))},get:function(uri){return $http.get(thServiceDomain+uri)},getResultSetJobsUpdates:function(resultSetIdList,repoName,exclusionProfile,lastModified){angular.isDate(lastModified)&&(lastModified=lastModified.toISOString().replace("Z",""));var params={result_set_id__in:resultSetIdList.join(","),count:2e3,last_modified__gt:lastModified,return_type:"list"};return exclusionProfile&&(params.exclusion_profile=exclusionProfile),ThJobModel.get_list(repoName,params,{fetch_all:!0})},getResultSetJobs:function(resultSets,repoName,exclusionProfile){var jobsPromiseList=[];return _.each(resultSets.results,function(rs,index){var params={return_type:"list",result_set_id:rs.id,count:2e3};exclusionProfile&&(params.exclusion_profile=exclusionProfile),jobsPromiseList.push(ThJobModel.get_list(repoName,params,{fetch_all:!0}))}),jobsPromiseList},getRevisions:function(projectName,resultSetId){return $http.get(thUrl.getProjectUrl("/resultset/"+resultSetId+"/",projectName),{cache:!0}).then(function(response){return response.data.revisions.length>0?_.map(response.data.revisions,function(r){return r.revision}):$q.reject("No revisions found for result set "+resultSetId+" in project "+projectName)})},getResultSetsFromRevision:function(projectName,revision){return $http.get(thUrl.getProjectUrl("/resultset/?revision="+revision,projectName),{cache:!0}).then(function(response){return response.data.results.length>0?response.data.results:$q.reject("No results found for revision "+revision+" on project "+projectName)})},cancelAll:function(resultset_id,repoName){var uri=resultset_id+"/cancel_all/";return $http.post(thUrl.getProjectUrl("/resultset/",repoName)+uri)}}}]),treeherder.factory("ThResultSetStore",["$rootScope","$q","$location","$interval","thPlatformOrder","ThResultSetModel","ThJobModel","thEvents","thResultStatusObject","thAggregateIds","ThLog","thNotify","thJobFilters","thOptionOrder","ThRepositoryModel","$timeout","ThJobTypeModel","ThJobGroupModel",function($rootScope,$q,$location,$interval,thPlatformOrder,ThResultSetModel,ThJobModel,thEvents,thResultStatusObject,thAggregateIds,ThLog,thNotify,thJobFilters,thOptionOrder,ThRepositoryModel,$timeout,ThJobTypeModel,ThJobGroupModel){var $log=new ThLog("ThResultSetStore"),defaultResultSetCount=10,repositories={},resultSetPollInterval=6e4,jobPollInterval=6e4,lastJobUpdate=null,rsPollingKeys=["tochange","enddate","revision","author"],reloadOnChangeParameters=["repo","revision","author","fromchange","tochange","startdate","enddate","exclusion_profile","nojobs"],registerResultSetPollers=function(){var rsPollingParams=_.pick($location.search(),rsPollingKeys),resultSetPoller=$interval(function(){var rsData=repositories[$rootScope.repoName];rsData.resultSets.length>0&&!rsData.loadingStatus.prepending?doResultSetPolling(rsPollingParams)?ThResultSetModel.getResultSetsFromChange($rootScope.repoName,rsData.resultSets[0].revision,rsPollingParams).then(function(data){prependResultSets($rootScope.repoName,data.data)}):$interval.cancel(resultSetPoller):0===rsData.resultSets.length&&rsData.loadingStatus.prepending===!1&&fetchResultSets($rootScope.repoName,defaultResultSetCount)},resultSetPollInterval)},doResultSetPolling=function(rsParams){return _.has(rsParams,"revision")?!1:_.has(rsParams,"tochange")&&rsParams.tochange===repositories[$rootScope.repoName].resultSets[0].revision?!1:!0},pollJobs=function(){var resultSetIdList=_.pluck(repositories[$rootScope.repoName].resultSets,"id"),exclusionProfile=$location.search().exclusion_profile;ThResultSetModel.getResultSetJobsUpdates(resultSetIdList,$rootScope.repoName,exclusionProfile,lastJobUpdate).then(function(jobList){if(jobList.length>0){var lastModifiedJob=getLastModifiedJob(jobList);null!==lastModifiedJob&&(lastJobUpdate=new Date(lastModifiedJob.last_modified+"Z"));var jobListByResultSet=_.values(_.groupBy(jobList,"result_set_id"));_.each(jobListByResultSet,function(singleResultSetJobList){mapResultSetJobs($rootScope.repoName,singleResultSetJobList)})}})},registerJobsPoller=function(){$interval(pollJobs,jobPollInterval)},mapResultSetJobs=function(repoName,jobList){if(jobList.length>0){var resultSetId=jobList[0].result_set_id,resultSet=_.findWhere(repositories[repoName].resultSets,{id:resultSetId});if(_.isUndefined(resultSet))return $q.defer().resolve();if(_.has(resultSet,"jobList")){var jobIds=_.pluck(jobList,"id");resultSet.jobList=_.filter(resultSet.jobList,function(job){return-1===_.indexOf(jobIds,job.id)}),resultSet.jobList=resultSet.jobList.concat(jobList)}else resultSet.jobList=jobList;var sortAndGroupJobs=_.compose(sortGroupedJobs,groupJobByPlatform);return sortAndGroupJobs(resultSet.jobList).then(function(groupedJobs){_.extend(resultSet,groupedJobs),mapPlatforms(repoName,resultSet),$rootScope.$emit(thEvents.applyNewJobs,resultSetId)})}return $q.defer().resolve()},addRepository=function(repoName){var locationSearch=thJobFilters.stripFiltersFromQueryString(_.clone($location.search()));$log.debug("locationSearch",locationSearch),(_.isEmpty(repositories[repoName])||!_.isEqual(locationSearch,repositories[repoName].search))&&($log.debug("fetching new resultset list with parameters:",locationSearch),repositories[repoName]={name:repoName,lastJobElSelected:{},lastJobObjSelected:{},rsMap:{},jobMap:{},unclassifiedFailureMap:{},rsMapOldestTimestamp:null,resultSets:[],loadingStatus:{appending:!1,prepending:!1},search:locationSearch})},getAllShownJobs=function(repoName,spaceRemaining,maxSize,resultsetId){var shownJobs=[],addIfShown=function(jMap){return resultsetId&&jMap.job_obj.result_set_id!==resultsetId?void 0:(jMap.job_obj.visible&&shownJobs.push(jMap.job_obj),_.size(shownJobs)===spaceRemaining?(thNotify.send("Max pinboard size of "+maxSize+" reached.","danger"),!0):!1)};return _.detect(getJobMap(repoName),addIfShown),shownJobs},getJobMapKey=function(job){return"key"+job.id},getSelectedJob=function(repoName){return{el:repositories[repoName].lastJobElSelected,job:repositories[repoName].lastJobObjSelected}},setSelectedJob=function(repoName,lastJobElSelected,lastJobObjSelected){repositories[repoName].lastJobElSelected=lastJobElSelected,repositories[repoName].lastJobObjSelected=lastJobObjSelected},getPlatformKey=function(name,option){var key=name;return void 0!==option&&(key+=option),key},mapResultSets=function(repoName,data){for(var rs_i=0;rs_irs_b.push_timestamp?-1:rs_a.push_timestamp0;){var jobFetchSlice=jobFetchList.splice(0,count);ThJobModel.get_list(repoName,{job_guid__in:jobFetchSlice.join(),count:count}).then(function(jobsFetched){var guids_fetched=_.pluck(jobsFetched,"job_guid"),guids_unfetched=_.difference(jobFetchSlice,guids_fetched);return guids_unfetched.length>0&&($log.debug("re-adding "+guids_unfetched.length+"job to the fetch queue"),unavailableJobs.push.apply(unavailableJobs,guids_unfetched)),jobsFetched},error_callback).then(_.bind(updateJobs,$rootScope,repoName))}_.delay(fetchJobs,1e4,repoName,unavailableJobs)},aggregateJobPlatform=function(repoName,job,platformData){var resultsetId,platformName,platformOption,platformAggregateId,platformKey,jobUpdated,resultsetAggregateId,revision,jobGroups;jobUpdated=updateJob(repoName,job),jobUpdated!==!1&&(resultsetId=job.result_set_id,platformName=job.platform,platformOption=job.platform_option,_.isEmpty(repositories[repoName].rsMap[resultsetId])||(platformAggregateId=thAggregateIds.getPlatformRowId(repoName,job.result_set_id,job.platform,job.platform_option),platformData[platformAggregateId]||_.isEmpty(repositories[repoName].rsMap[resultsetId])||(revision=repositories[repoName].rsMap[resultsetId].rs_obj.revision,resultsetAggregateId=thAggregateIds.getResultsetTableId($rootScope.repoName,resultsetId,revision),platformKey=getPlatformKey(platformName,platformOption),$log.debug("aggregateJobPlatform",repoName,resultsetId,platformKey,repositories),jobGroups=[],void 0!==repositories[repoName].rsMap[resultsetId].platforms[platformKey]&&(jobGroups=repositories[repoName].rsMap[resultsetId].platforms[platformKey].pl_obj.groups),platformData[platformAggregateId]={platformName:platformName,revision:revision,platformOrder:repositories[repoName].rsMap[resultsetId].rs_obj.platforms,resultsetId:resultsetId,resultsetAggregateId:resultsetAggregateId,platformOption:platformOption,jobGroups:jobGroups,jobs:[]}),platformData[platformAggregateId].jobs.push(job)))},updateJobs=function(repoName,jobList){$log.debug("number of jobs returned for add/update: ",jobList.length);var i,platformData={};for(i=0;i-1;i--)data.results[i].push_timestamp>=repositories[repoName].rsMapOldestTimestamp&&isInResultSetRange(repoName,data.results[i].push_timestamp)&&void 0===repositories[repoName].rsMap[data.results[i].id]?($log.debug("prepending resultset: ",data.results[i].id),repositories[repoName].resultSets.push(data.results[i]),added.push(data.results[i])):$log.debug("not prepending. timestamp is older");mapResultSets(repoName,added),repositories[repoName].loadingStatus.prepending=!1},appendResultSets=function(repoName,data){if(data.results.length>0){$log.debug("appendResultSets",data.results);var rsIds=_.map(repositories[repoName].resultSets,function(rs){return rs.id}),newResultsets=[];_.each(data.results,function(rs){_.contains(rsIds,rs.id)||newResultsets.push(rs)}),Array.prototype.push.apply(repositories[repoName].resultSets,newResultsets),mapResultSets(repoName,newResultsets),_.isUndefined(repositories[repoName].meta)&&(repositories[repoName].meta=data.meta)}repositories[repoName].loadingStatus.appending=!1},loadRevisions=function(repoName,resultsetId){$log.debug("loadRevisions",repoName,resultsetId);var rs=repositories[repoName].rsMap[resultsetId].rs_obj;return rs&&0===rs.revisions.length?($log.debug("loadRevisions: check out to load revisions",rs,repoName),ThResultSetModel.get(rs.revisions_uri).success(function(data){0===rs.revisions.length&&(Array.prototype.push.apply(rs.revisions,data),$timeout($rootScope.$emit(thEvents.revisionsLoaded,rs)))})):void 0},isInResultSetRange=function(repoName,push_timestamp){var result=!0;if(repositories[repoName]&&repositories[repoName].length){var meta=repositories[repoName].meta;_.has(meta,"push_timestamp__gte")&&push_timestampmeta.push_timestamp__lte&&(result=!1),_.has(meta,"push_timestamp__lt")&&push_timestamp>=meta.push_timestamp__lt&&(result=!1)}return result},getResultSetsArray=function(repoName){return repositories[repoName].resultSets},getResultSetsMap=function(repoName){return repositories[repoName].rsMap},getResultSet=function(repoName,resultsetId){return repositories[repoName].rsMap[resultsetId].rs_obj},getJobMap=function(repoName){return repositories[repoName].jobMap},getLoadingStatus=function(repoName){return repositories[repoName].loadingStatus},isNotLoaded=function(repoName){return _.isEmpty(repositories[repoName].rsMap)},fetchResultSets=function(repoName,count,keepFilters){repositories[repoName].loadingStatus.appending=!0;var resultsets,exclusionProfile=$location.search().exclusion_profile,loadRepositories=ThRepositoryModel.load({name:repoName,watchRepos:!0}),loadResultsets=ThResultSetModel.getResultSets(repoName,repositories[repoName].rsMapOldestTimestamp,count,void 0,!0,keepFilters).then(function(data){resultsets=data.data});return $q.all([loadRepositories,loadResultsets]).then(function(){appendResultSets(repoName,resultsets)},function(data){thNotify.send("Error retrieving resultset data!","danger",!0),$log.error(data),appendResultSets(repoName,{results:[]})}).then(function(){if(!$location.search().nojobs){var jobsPromiseList=ThResultSetModel.getResultSetJobs(resultsets,repoName,exclusionProfile);$q.all(jobsPromiseList).then(function(resultSetJobList){var lastJobUpdateList=_.map(resultSetJobList,getLastModifiedJob),lastJobModified=getLastModifiedJob(lastJobUpdateList);lastJobModified&&(lastJobUpdate=new Date(lastJobModified.last_modified+"Z"),lastJobUpdate.setSeconds(lastJobUpdate.getSeconds()-3))});var mapResultSetJobsPromiseList=_.map(jobsPromiseList,function(jobsPromise){return jobsPromise.then(function(jobs){return mapResultSetJobs(repoName,jobs)})});$q.all(mapResultSetJobsPromiseList).then(function(){registerJobsPoller()})}})},getLastModifiedJob=function(jobList){if(jobList.length>0){var sortedJobs=_.sortBy(jobList,"last_modified");return sortedJobs[sortedJobs.length-1]}return null},getJobCount=function(jobList){return _.reduce(jobList,function(memo,job){return job.job_coalesced_to_guid||memo[job.state]++,memo},thResultStatusObject.getResultStatusObject())},getJobGroupInfo=function(job){var name=job.job_group_name,symbol=job.job_group_symbol;if(job.tier&&1!==job.tier){"?"===symbol&&(symbol="");var tierLabel=symbol+"[Tier-"+job.tier+"]";name=tierLabel,symbol=tierLabel}return{name:name,symbol:symbol}},groupJobByPlatform=function(jobList){var groupedJobs={platforms:[],job_counts:getJobCount(jobList)};if(0===jobList.length)return groupedJobs;groupedJobs.id=jobList[0].result_set_id;for(var lastModified="",i=0;itreestatus.mozilla.org ',reason:"",tree:repoName}},updateTreeStatus=function(repoName){var repoNames=watchedRepos[repoName]?[repoName]:_.keys(watchedRepos);repoNames=_.filter(repoNames,function(repo){return watchedRepos[repo]&&"unsupported"!==watchedRepos[repo].treeStatus.status?repo:void 0});var newStatuses={},getStatus=function(repo){$log.debug("updateTreeStatus","getStatus","updating",repo),treeStatus.get(repo).then(function(data){newStatuses[repo]=data.data,updateStatusesIfDone()},function(data){newStatuses[repo]=getUnsupportedTreeStatus(repo),updateStatusesIfDone()})},updateStatusesIfDone=function(){_.size(newStatuses)===repoNames.length&&_.defer(function(){_.each(newStatuses,function(status){$log.debug("updateTreeStatus","updateStatusesIfDone",status.tree,status.status),watchedRepos[treeStatus.getRepoName(status.tree)].treeStatus=status})})};_.each(repoNames,getStatus)};return{load:load,get_list:get_list,getCurrent:getCurrent,setCurrent:setCurrent,getRepo:getByName,getOrderedRepoGroups:getOrderedRepoGroups,getCurrentTreeStatus:getCurrentTreeStatus,repos:repos,watchedRepos:watchedRepos,loadWatchedRepos:loadWatchedRepos,saveWatchedRepos:saveWatchedRepos,unwatchRepo:unwatchRepo,toggleWatched:toggleWatched}}]),treeherder.factory("ThBugJobMapModel",["$http","thUrl",function($http,thUrl){var ThBugJobMapModel=function(data){angular.extend(this,data)};return ThBugJobMapModel.get_uri=function(){return thUrl.getProjectUrl("/bug-job-map/")},ThBugJobMapModel.get_list=function(options){var query_string=$.param(options);return $http.get(ThBugJobMapModel.get_uri()+"?"+query_string).then(function(response){var item_list=[];return _.each(response.data,function(elem){item_list.push(new ThBugJobMapModel(elem))}),item_list})},ThBugJobMapModel.get=function(pk){return $http.get(ThBugJobMapModel.get_uri()+pk).then(function(response){return new ThBugJobMapModel(response.data)})},ThBugJobMapModel.prototype.create=function(){var bug_job_map=this;return $http.post(ThBugJobMapModel.get_uri(),bug_job_map)},ThBugJobMapModel.prototype["delete"]=function(){var pk=this.job_id+"-"+this.bug_id;return $http["delete"](ThBugJobMapModel.get_uri()+pk+"/")},ThBugJobMapModel}]),treeherder.factory("ThJobClassificationModel",["$http","ThLog","thUrl",function($http,ThLog,thUrl){var ThJobClassificationModel=function(data){angular.extend(this,data)};return ThJobClassificationModel.get_uri=function(){return thUrl.getProjectUrl("/note/")},ThJobClassificationModel.get_list=function(options){var query_string=$.param(options);return $http.get(ThJobClassificationModel.get_uri()+"?"+query_string).then(function(response){var item_list=[];return angular.forEach(response.data,function(elem){item_list.push(new ThJobClassificationModel(elem))}),item_list})},ThJobClassificationModel.get=function(pk){return $http.get(ThJobClassificationModel.get_uri()+pk).then(function(response){return new ThJobClassificationModel(response.data)})},ThJobClassificationModel.prototype.create=function(){var note=this;return $http.post(ThJobClassificationModel.get_uri(),note)},ThJobClassificationModel.prototype["delete"]=function(){return $http["delete"](ThJobClassificationModel.get_uri()+this.id+"/")},ThJobClassificationModel}]),treeherder.factory("ThJobModel",["$http","ThLog","thUrl","$q",function($http,ThLog,thUrl,$q){var ThJobModel=function(data){angular.extend(this,data);
+};return ThJobModel.prototype.get_current_eta=function(){var timestampSeconds=(new Date).getTime()/1e3;return Math.round((timestampSeconds-(parseInt(this.submit_timestamp)+parseInt(this.running_eta)))/60)},ThJobModel.prototype.get_typical_eta=function(){return Math.round(parseInt(this.running_eta)/60)},ThJobModel.get_uri=function(repoName){return thUrl.getProjectUrl("/jobs/",repoName)},ThJobModel.get_list=function(repoName,options,config){config=config||{};var timeout=config.timeout||null,fetch_all=config.fetch_all||!1;return $http.get(ThJobModel.get_uri(repoName),{params:options,timeout:timeout}).then(function(response){var item_list,next_pages_jobs=[];if(fetch_all&&response.data.results.length===response.data.meta.count){var current_offset=parseInt(response.data.meta.offset),page_size=parseInt(response.data.meta.count),new_options=angular.copy(options);new_options.offset=page_size+current_offset,new_options.count=page_size,next_pages_jobs=ThJobModel.get_list(repoName,new_options,config)}return item_list=_.has(response.data,"job_property_names")?_.map(response.data.results,function(elem){var job_obj=_.object(response.data.job_property_names,elem);return new ThJobModel(job_obj)}):_.map(response.data.results,function(job_obj){return new ThJobModel(job_obj)}),$q.when(next_pages_jobs).then(function(maybe_job_list){return item_list.concat(maybe_job_list)})})},ThJobModel.get=function(repoName,pk,config){config=config||{};var timeout=config.timeout||null;return $http.get(ThJobModel.get_uri(repoName)+pk+"/",{timeout:timeout}).then(function(response){return new ThJobModel(response.data)})},ThJobModel.retrigger=function(repoName,pk,config){config=config||{};var timeout=config.timeout||null;return $http.post(ThJobModel.get_uri(repoName)+pk+"/retrigger/",{timeout:timeout}).then(function(response){return new ThJobModel(response.data)})},ThJobModel.cancel=function(repoName,pk,config){config=config||{};var timeout=config.timeout||null;return $http.post(ThJobModel.get_uri(repoName)+pk+"/cancel/",{timeout:timeout}).then(function(response){return new ThJobModel(response.data)})},ThJobModel}]),treeherder.factory("ThJobExclusionModel",["$http","$log","thUrl","thNotify","$q",function($http,$log,thUrl,thNotify,$q){var ThJobExclusionModel=function(data){return angular.extend(this,data)};return ThJobExclusionModel.get_uri=function(){var url=thUrl.getRootUrl("/job-exclusion/");return url},ThJobExclusionModel.get_list=function(options,cache){options=options||{},cache=cache||!1;var query_string=$.param(options);return $http.get(ThJobExclusionModel.get_uri()+"?"+query_string,{cache:cache}).then(function(response){var item_list=[];return angular.forEach(response.data,function(elem){item_list.push(new ThJobExclusionModel(elem))}),item_list})},ThJobExclusionModel.get=function(pk){return $http.get(ThJobExclusionModel.get_uri()+pk).then(function(response){return new ThJobExclusionModel(response.data)})},ThJobExclusionModel.prototype.create=function(){var job_filter=this;return $http.post(ThJobExclusionModel.get_uri(),job_filter).then(function(response){angular.extend(job_filter,response.data),thNotify.send("Filter successfully created","success")},function(reason){return 400===reason.status?angular.forEach(reason.data,function(error_list,field){angular.forEach(error_list,function(error){thNotify.send(error,"danger")})}):thNotify.send(reason,"danger"),$q.reject(reason)})},ThJobExclusionModel.prototype.update=function(){var job_filter=this;return $http.put(ThJobExclusionModel.get_uri()+job_filter.id+"/",job_filter).then(function(response){angular.extend(job_filter,response.data),thNotify.send("Job filter successfully updated","success")},function(reason){return 400===reason.status?angular.forEach(reason.data,function(error_list,field){angular.forEach(error_list,function(error){thNotify.send(field+": "+error,"danger")})}):thNotify.send(reason,"danger"),$q.reject(reason)})},ThJobExclusionModel.prototype["delete"]=function(){$log.debug(this);var pk=this.id;return $http["delete"](ThJobExclusionModel.get_uri()+pk+"/").then(function(response){thNotify.send("Job filter successfully deleted","success")},function(reason){return thNotify.send(reason.data,"danger"),$q.reject(reason)})},ThJobExclusionModel}]),treeherder.factory("ThExclusionProfileModel",["$http","$log","thUrl","$q","thNotify",function($http,$log,thUrl,$q,thNotify){var ThExclusionProfileModel=function(data){return angular.extend(this,data)};return ThExclusionProfileModel.get_uri=function(){return thUrl.getRootUrl("/exclusion-profile/")},ThExclusionProfileModel.get_list=function(options,cache){options=options||{},cache=cache||!1;var query_string=$.param(options);return $http.get(ThExclusionProfileModel.get_uri()+"?"+query_string,{cache:cache}).then(function(response){var item_list=[];return angular.forEach(response.data,function(elem){item_list.push(new ThExclusionProfileModel(elem))}),item_list})},ThExclusionProfileModel.get=function(pk){return $http.get(ThExclusionProfileModel.get_uri()+pk).then(function(response){return new ThExclusionProfileModel(response.data)})},ThExclusionProfileModel.prototype.create=function(){var exclusion_profile=this;return $http.post(ThExclusionProfileModel.get_uri(),exclusion_profile).then(function(response){angular.extend(exclusion_profile,response.data),$log.debug(exclusion_profile),thNotify.send("Exclusion profile successfully created","success")},function(reason){return 400===reason.status?angular.forEach(reason.data,function(error_list,field){angular.forEach(error_list,function(error){thNotify.send(field+": "+error,"danger")})}):reason.data&&reason.data.detail?thNotify.send(reason.data.detail,"danger"):(thNotify.send("Error","danger"),$log.error(reason)),$q.reject(reason)})},ThExclusionProfileModel.prototype.update=function(){var exclusion_profile=this;return $http.put(ThExclusionProfileModel.get_uri()+exclusion_profile.id+"/",exclusion_profile).then(function(response){thNotify.send("Exclusion profile successfully updated","success")},function(reason){return 400===reason.status?angular.forEach(reason.data,function(error_list,field){angular.forEach(error_list,function(error){thNotify.send(field+": "+error,"danger")})}):thNotify.send(reason,"danger"),$q.reject(reason)})},ThExclusionProfileModel.prototype["delete"]=function(){$log.debug(this);var pk=this.id;return $http["delete"](ThExclusionProfileModel.get_uri()+pk+"/").then(function(response){thNotify.send("Exclusion profile successfully deleted","success")},function(reason){return thNotify.send(reason.data,"danger"),$q.reject(reason)})},ThExclusionProfileModel}]),treeherder.factory("ThBuildPlatformModel",["$http","$log","thUrl",function($http,$log,thUrl){var ThBuildPlatformModel=function(data){angular.extend(this,data)};return ThBuildPlatformModel.get_uri=function(){var url=thUrl.getRootUrl("/buildplatform/");return url},ThBuildPlatformModel.get_list=function(options){options=options||{};var query_string=$.param(options);return $http.get(ThBuildPlatformModel.get_uri()+"?"+query_string).then(function(response){var item_list=[];return angular.forEach(response.data,function(elem){item_list.push(new ThBuildPlatformModel(elem))}),item_list})},ThBuildPlatformModel.get=function(pk){return $http.get(ThBuildPlatformModel.get_uri()+pk).then(function(response){return new ThBuildPlatformModel(response.data)})},ThBuildPlatformModel}]),treeherder.factory("ThJobTypeModel",["$http","$log","thUrl",function($http,$log,thUrl){var ThJobTypeModel=function(data){angular.extend(this,data)};return ThJobTypeModel.get_uri=function(){var url=thUrl.getRootUrl("/jobtype/");return url},ThJobTypeModel.get_list=function(options){return options=options||{},$http.get(ThJobTypeModel.get_uri(),{cache:!0,params:options}).then(function(response){var item_list=[];return angular.forEach(response.data,function(elem){item_list.push(new ThJobTypeModel(elem))}),item_list})},ThJobTypeModel.get=function(pk){return $http.get(ThJobTypeModel.get_uri()+pk).then(function(response){return new ThJobTypeModel(response.data)})},ThJobTypeModel}]),treeherder.factory("ThJobGroupModel",["$http","$log","thUrl",function($http,$log,thUrl){var ThJobGroupModel=function(data){angular.extend(this,data)};return ThJobGroupModel.get_uri=function(){var url=thUrl.getRootUrl("/jobgroup/");return url},ThJobGroupModel.get_list=function(options){options=options||{};$.param(options);return $http.get(ThJobGroupModel.get_uri(),{cache:!0,params:options}).then(function(response){var item_list=[];return angular.forEach(response.data,function(elem){item_list.push(new ThJobGroupModel(elem))}),item_list})},ThJobGroupModel.get=function(pk){return $http.get(ThJobGroupModel.get_uri()+pk).then(function(response){return new ThJobGroupModel(response.data)})},ThJobGroupModel}]),treeherder.factory("ThJobLogUrlModel",["$http","$log","thUrl",function($http,$log,thUrl){var ThJobLogUrlModel=function(data){angular.extend(this,data)};return ThJobLogUrlModel.prototype.parse=function(){if(!this.hasOwnProperty("id"))throw"The id property is required in order to parse a log";var uri=ThJobLogUrlModel.get_uri()+this.id+"/parse/";return $http.post(uri)},ThJobLogUrlModel.get_uri=function(){var url=thUrl.getProjectUrl("/job-log-url/");return url},ThJobLogUrlModel.get_list=function(job_id,config){config=config||{};var timeout=config.timeout||null,params={job_id:job_id};return $http.get(ThJobLogUrlModel.get_uri(),{params:params,timeout:timeout}).then(function(response){var item_list=[];return angular.forEach(response.data,function(elem){var buildUrl=(elem.url.split("/"),elem.url.slice(0,elem.url.lastIndexOf("/"))+"/");elem.buildUrl=buildUrl,item_list.push(new ThJobLogUrlModel(elem))}),item_list})},ThJobLogUrlModel.get=function(pk){return $http.get(ThJobLogUrlModel.get_uri()+pk+"/").then(function(response){return new ThJobLogUrlModel(response.data)})},ThJobLogUrlModel}]),treeherder.factory("ThOptionCollectionModel",["$http","$log","thUrl",function($http,$log,thUrl){var get_list=function(options){options=options||{};var query_string=$.param(options);return $http.get(thUrl.getRootUrl("/optioncollectionhash/")+"?"+query_string)},get_map=function(options){return get_list(options).then(function(optCollectionData){var optionCollectionMap={};return _.each(optCollectionData.data,function(optColl){optionCollectionMap[optColl.option_collection_hash]=_.uniq(_.map(optColl.options,function(option){return option.name})).sort().join()}),optionCollectionMap})};return{get_list:get_list,get_map:get_map}}]),treeherder.factory("ThUserModel",["$http","$log","thUrl","thNotify","$q",function($http,$log,thUrl,thNotify,$q){var ThUserModel=function(data){angular.extend(this,data)};return ThUserModel.get_uri=function(){return thUrl.getRootUrl("/user/")},ThUserModel.get=function(){return $http.get(ThUserModel.get_uri()).then(function(response){return response.data.length>0?new ThUserModel(response.data[0]):$q.reject({data:"User not found"})},function(reason){return thNotify.send(reason.data,"danger"),$q.reject(reason)})},ThUserModel}]),treeherder.factory("ThModelErrors",[function(){var AUTH_ERROR_MSG="Please login to Treeherder using Persona to complete this action";return{format:function(e,message){if(!e||!e.data)return message;switch(e.status){case 401:case 403:return AUTH_ERROR_MSG;default:return message+":"+e.data.detail}}}}]),treeherderApp.controller("MainCtrl",["$scope","$rootScope","$routeParams","$location","ThLog","ThRepositoryModel","thPinboard","thNotify","thClassificationTypes","thEvents","$interval","$window","ThExclusionProfileModel","thJobFilters","ThResultSetStore","thDefaultRepo","thJobNavSelectors",function($scope,$rootScope,$routeParams,$location,ThLog,ThRepositoryModel,thPinboard,thNotify,thClassificationTypes,thEvents,$interval,$window,ThExclusionProfileModel,thJobFilters,ThResultSetStore,thDefaultRepo,thJobNavSelectors){var $log=new ThLog("MainCtrl");thClassificationTypes.load(),$rootScope.getWindowTitle=function(){var ufc=$scope.getUnclassifiedFailureCount($rootScope.repoName);return"["+ufc+"] "+$rootScope.repoName},$rootScope.closeJob=function(){$rootScope.selectedJob=null,$rootScope.$emit(thEvents.clearSelectedJob,$rootScope.selectedJob),ThResultSetStore.setSelectedJob($rootScope.repoName)},$scope.clearJobOnClick=function(event){var element=event.target,ignoreClear=element.hasAttribute("ignore-job-clear-on-click");ignoreClear||thPinboard.hasPinnedJobs()||$scope.closeJob()};var mousetrapExclusions=["i","right","left","j","n","k","p","r","space","u","b","c","f","l"];$scope.allowKeys=function(){Mousetrap.unbind(mousetrapExclusions)},$scope.allowKeysClassificationDropdown=function(){Mousetrap.unbind(_.without(mousetrapExclusions,"c","b"))},$scope.processKeyboardInput=function(ev){var activeElement=document.activeElement;"INPUT"===activeElement.tagName||"SELECT"===activeElement.tagName||"TEXTAREA"===activeElement.tagName||activeElement.isContentEditable||16===ev.keyCode||(Mousetrap.bind("i",function(){$scope.$evalAsync($scope.toggleInProgress())}),Mousetrap.bind("left",function(){$rootScope.$emit(thEvents.changeSelection,"previous",thJobNavSelectors.ALL_JOBS)}),Mousetrap.bind("right",function(){$rootScope.$emit(thEvents.changeSelection,"next",thJobNavSelectors.ALL_JOBS)}),Mousetrap.bind(["j","n"],function(){$rootScope.$emit(thEvents.changeSelection,"next",thJobNavSelectors.UNCLASSIFIED_FAILURES)}),Mousetrap.bind(["k","p"],function(){$rootScope.$emit(thEvents.changeSelection,"previous",thJobNavSelectors.UNCLASSIFIED_FAILURES)}),Mousetrap.bind("r",function(){$scope.selectedJob&&$scope.$evalAsync($rootScope.$emit(thEvents.jobRetrigger,$rootScope.selectedJob))}),Mousetrap.bind("space",function(ev){$scope.selectedJob&&(ev.preventDefault(),$scope.$evalAsync($rootScope.$emit(thEvents.jobPin,$rootScope.selectedJob)))}),Mousetrap.bind("u",function(){$scope.$evalAsync($scope.toggleUnclassifiedFailures)}),Mousetrap.bind("b",function(ev){$scope.selectedJob&&($rootScope.$emit(thEvents.addRelatedBug,$rootScope.selectedJob),ev.preventDefault(),$scope.$evalAsync($rootScope.$broadcast("focus-this","related-bug-input")),$scope.$evalAsync($scope.allowKeys()))}),Mousetrap.bind("c",function(ev){$scope.selectedJob&&($scope.$evalAsync($rootScope.$emit(thEvents.jobPin,$rootScope.selectedJob)),ev.preventDefault(),$scope.$evalAsync($rootScope.$broadcast("focus-this","classification-comment")),$scope.$evalAsync($scope.allowKeys()))}),Mousetrap.bind("f",function(ev){ev.preventDefault(),$("#platform-job-text-search-field").focus()}),Mousetrap.bind("ctrl+shift+f",function(ev){ev.preventDefault(),$scope.$evalAsync($scope.clearFilterBox())}),Mousetrap.bind("escape",function(){$scope.$evalAsync($scope.setFilterPanelShowing(!1)),$scope.$evalAsync($scope.setSettingsPanelShowing(!1)),$scope.$evalAsync($scope.setSheriffPanelShowing(!1)),$scope.$evalAsync($scope.closeJob())}),Mousetrap.bind("ctrl+shift+u",function(){$scope.$evalAsync($rootScope.$emit(thEvents.clearPinboard))}),Mousetrap.bind("ctrl+enter",function(){$scope.$evalAsync($rootScope.$emit(thEvents.saveClassification))}),Mousetrap.bind("l",function(){$scope.selectedJob&&$scope.$evalAsync($rootScope.$emit(thEvents.openLogviewer))}),Mousetrap.bind("ctrl+backspace",function(){$scope.selectedJob&&$scope.$evalAsync($rootScope.$emit(thEvents.deleteClassification))}))},$scope.repoModel=ThRepositoryModel,$scope.getTopNavBarHeight=function(){return $("#th-global-top-nav-panel").find("#top-nav-main-panel").height()},$rootScope.$watch($scope.getTopNavBarHeight,function(newValue){$("body").css("padding-top",newValue)}),$scope.setDropDownPull=function(event){$log.debug("dropDown",event.target);var element=event.target.offsetParent;element.offsetLeft>$(window).width()/2?$(element).find(".dropdown-menu").addClass("pull-right"):$(element).find(".dropdown-menu").removeClass("pull-right")},$scope.getUnclassifiedFailureCount=function(repoName){return ThResultSetStore.getUnclassifiedFailureCount(repoName)},$scope.isSkippingExclusionProfiles="false"===$location.search().exclusion_profile,$scope.toggleExcludedJobs=function(){"false"===$location.search().exclusion_profile?$location.search("exclusion_profile",null):$location.search("exclusion_profile","false")},$scope.toggleUnclassifiedFailures=thJobFilters.toggleUnclassifiedFailures,$scope.toggleTier1Only=thJobFilters.toggleTier1Only,$scope.toggleInProgress=function(){thJobFilters.toggleInProgress()},$scope.allExpanded=function(cls){var fullList=$("."+cls),visibleList=$("."+cls+":visible");return fullList.length===visibleList.length},$scope.allCollapsed=function(cls){var visibleList=$("."+cls+":visible");return 0===visibleList.length},$scope.toggleAllRevisions=function(collapse){collapse=collapse||$scope.allCollapsed("revision-list"),$rootScope.$emit(thEvents.toggleAllRevisions,collapse)};var getNewReloadTriggerParams=function(){return _.pick($location.search(),ThResultSetStore.reloadOnChangeParameters)};$scope.setLocationSearchParam=function(param,value){$location.search(param,value)},$scope.cachedReloadTriggerParams=getNewReloadTriggerParams(),$rootScope.$on("$locationChangeSuccess",function(){$rootScope.locationPath=$location.path().replace("/",""),$rootScope.urlBasePath=$location.absUrl().split("?")[0];var newReloadTriggerParams=getNewReloadTriggerParams(),defaulting=newReloadTriggerParams.repo===thDefaultRepo&&!$scope.cachedReloadTriggerParams.repo;defaulting||!$scope.cachedReloadTriggerParams||_.isEqual(newReloadTriggerParams,$scope.cachedReloadTriggerParams)||$rootScope.skipNextPageReload?$scope.cachedReloadTriggerParams=newReloadTriggerParams:$window.location.reload(),$rootScope.skipNextPageReload=!1}),$scope.changeRepo=function(repo_name){$location.search({repo:repo_name})},$scope.clearFilterBox=function(){thJobFilters.removeFilter("searchStr"),$("#platform-job-text-search-field").val(""),$("#platform-job-text-search-field").focus()},$scope.isFilterPanelShowing=!1,$scope.setFilterPanelShowing=function(tf){$scope.isFilterPanelShowing=tf},$scope.isSettingsPanelShowing=!1,$scope.setSettingsPanelShowing=function(tf){$scope.isSettingsPanelShowing=tf},$scope.isSheriffPanelShowing=!1,$scope.setSheriffPanelShowing=function(tf){tf&&$rootScope.$emit(thEvents.initSheriffPanel),$scope.isSheriffPanelShowing=tf},$scope.pinboardCount=thPinboard.count,$scope.pinnedJobs=thPinboard.pinnedJobs}]),treeherderApp.controller("SheriffCtrl",["$scope","$rootScope","ThBuildPlatformModel","ThJobTypeModel","thEvents","ThRepositoryModel","ThOptionCollectionModel","ThJobExclusionModel","ThExclusionProfileModel","thNotify","$q",function($scope,$rootScope,ThBuildPlatformModel,ThJobTypeModel,thEvents,ThRepositoryModel,ThOptionCollectionModel,ThJobExclusionModel,ThExclusionProfileModel,thNotify,$q){$scope.exclusions=[],$scope.exclusions_map={},$scope.profiles=[];var init=function(){$scope.initComplete||(ThJobExclusionModel.get_list().then(function(data){$scope.exclusions=data,$scope.exclusions_map=_.indexBy($scope.exclusions,"id")}),ThExclusionProfileModel.get_list({},!1).then(function(data){$scope.profiles=data}),$scope.initComplete=!0)};$rootScope.$on(thEvents.initSheriffPanel,function(){init()}),$scope.refreshExclusionProfileList=function(){ThExclusionProfileModel.get_list({},!1).then(function(data){$scope.profiles=data,thNotify.send("Refresh the page to see changes reflected.")})};var getJobComboField=function(field1,field2){return field1+" ("+field2+")"};$scope.view="exclusion_profile_list",$scope.switchView=function(newView){$scope.view=newView},$scope.master_platforms=[],ThBuildPlatformModel.get_list().then(function(data){for(var i=0;i0&&_.has(buildapi_artifact[0],"blob")&&($scope.artifacts.buildapi=buildapi_artifact[0]),$scope.jobSearchStr=thJobSearchStr($scope.job),$scope.jobSearchSignature=$scope.job.signature,$scope.jobSearchStrHref=getJobSearchStrHref($scope.jobSearchStr),$scope.jobSearchSignatureHref=getJobSearchStrHref($scope.job.signature);var jobInfoArtifact=results[2];jobInfoArtifact.length>0&&($scope.job_details=jobInfoArtifact.reduce(function(result,artifact){return artifact.blob&&Array.isArray(artifact.blob.job_details)&&(result=result.concat(artifact.blob.job_details)),$scope.artifacts.buildapi&&($scope.artifacts.buildapi.blob.title="Buildername",$scope.artifacts.buildapi.blob.value=$scope.artifacts.buildapi.blob.buildername,result=result.concat($scope.artifacts.buildapi.blob)),result},[])),$scope.job_log_urls=_.reject(results[3],{name:"mozlog_json"}),$scope.job_log_urls.length?$scope.job_log_urls[0].parse_status&&($scope.logParseStatus=$scope.job_log_urls[0].parse_status):$scope.logParseStatus="unavailable";var logsNotParsed=[];$scope.jobLogsAllParsed=_.every($scope.job_log_urls,function(jlu){return"pending"===jlu.parse_status?(logsNotParsed.push(jlu),!1):!0}),logsNotParsed.length>0&&$q.all(_.map(logsNotParsed,function(log){return log.parse()})).then(function(parseLogResponses){_.every(parseLogResponses,function(parseLogResponse){return 200===parseLogResponse.status})&&(selectJobRetryPromise=$timeout(function(){selectJobAndRender(job_id)},5e3))}),$scope.lvUrl=thUrl.getLogViewerUrl($scope.job.id),$scope.lvFullUrl=location.origin+"/"+$scope.lvUrl,$scope.resultStatusShading="result-status-shading-"+thResultStatus($scope.job),updateVisibleFields(),$scope.updateClassifications(),$scope.updateBugs(),$scope.job_detail_loading=!1})}},updateVisibleFields=function(){var undef="",duration="";$scope.visibleFields={Build:$scope.job.build_architecture+" "+$scope.job.build_platform+" "+$scope.job.build_os||undef,"Job name":$scope.job.job_type_name||undef},$scope.visibleTimeFields={requestTime:dateFilter(1e3*$scope.job.submit_timestamp,thDateFormat)};var endtime=$scope.job.end_timestamp||Date.now()/1e3,starttime=$scope.job.start_timestamp||$scope.job.submit_timestamp;duration=numberFilter((endtime-starttime)/60,0)+" minute(s)",$scope.visibleTimeFields.duration=duration,$scope.job.start_timestamp&&($scope.visibleTimeFields.startTime=dateFilter(1e3*$scope.job.start_timestamp,thDateFormat)),$scope.job.end_timestamp&&($scope.visibleTimeFields.endTime=dateFilter(1e3*$scope.job.end_timestamp,thDateFormat))};$scope.getCountPinnedJobs=function(){return thPinboard.count.numPinnedJobs},$scope.togglePinboardVisibility=function(){$scope.isPinboardVisible=!$scope.isPinboardVisible},$scope.$watch("getCountPinnedJobs()",function(newVal,oldVal){0===oldVal&&newVal>0&&($scope.isPinboardVisible=!0)}),$scope.canCancel=function(){return $scope.job&&("pending"===$scope.job.state||"running"===$scope.job.state)};var getBuildbotRequestId=function(){return $scope.artifacts.buildapi?$scope.artifacts.buildapi.blob.request_id:void 0};$scope.retriggerJob=function(){$scope.user.loggedin?$scope.job.id?ThJobModel.retrigger($scope.repoName,$scope.job.id).then(function(){if("ash"!==$scope.repoName){var requestId=getBuildbotRequestId();return requestId?thBuildApi.retriggerJob($scope.repoName,requestId):void 0}}).then(function(){thNotify.send("Retriggered job: "+$scope.jobSearchStr,"success")})["catch"](function(e){thNotify.send(ThModelErrors.format(e,"Unable to send retrigger"),"danger")}):thNotify.send("Job not yet loaded for retrigger","warning"):thNotify.send("Must be logged in to retrigger a job","danger")},$scope.cancelJob=function(){ThJobModel.cancel($scope.repoName,$scope.job.id).then(function(){if("ash"!==$scope.repoName){var requestId=getBuildbotRequestId();return requestId?thBuildApi.cancelJob($scope.repoName,requestId):void 0}})["catch"](function(e){thNotify.send(ThModelErrors.format(e,"Unable to cancel job"),"danger",!0)})},$scope.cancelAll=function(resultsetId){var rs=ThResultSetModel.getResultSet($scope.repoName,resultsetId);thBuildApi.cancelAllJobs($scope.repoName,rs.revision)},$scope.isReftest=function(){return $scope.selectedJob?thReftestStatus($scope.selectedJob):void 0};var selectJobAndRender=function(job_id,job_selection_type){$scope.jobLoadedPromise=selectJob(job_id,job_selection_type),$scope.jobLoadedPromise.then(function(){thTabs.showTab(thTabs.selectedTab,job_id)})};$rootScope.$on(thEvents.jobClick,function(event,job,job_selection_type){selectJobAndRender(job.id,job_selection_type),$rootScope.selectedJob=job}),$rootScope.$on(thEvents.clearSelectedJob,function(event,job){null!==selectJobPromise&&$timeout.cancel(selectJobPromise),null!==selectJobRetryPromise&&$timeout.cancel(selectJobRetryPromise)}),$scope.bug_job_map_list=[],$scope.classificationTypes=thClassificationTypes,$scope.updateClassifications=function(){ThJobClassificationModel.get_list({job_id:$scope.job.id}).then(function(response){$scope.classifications=response,$scope.job.note=$scope.classifications[0]})},$scope.updateBugs=function(){_.has($scope.job,"id")&&ThBugJobMapModel.get_list({job_id:$scope.job.id}).then(function(response){$scope.bugs=response})},$rootScope.$on(thEvents.openLogviewer,function(){"pending"===$scope.logParseStatus?thNotify.send("Log parsing in progress, log viewer not yet available","info"):"failed"===$scope.logParseStatus?thNotify.send("Log parsing has failed, log viewer is unavailable","warning"):"unavailable"===$scope.logParseStatus?thNotify.send("No logs available for this job","info"):"parsed"===$scope.logParseStatus&&$("#logviewer-btn")[0].click()}),$rootScope.$on(thEvents.jobRetrigger,function(event,job){$scope.retriggerJob()}),$rootScope.$on(thEvents.jobsClassified,function(event,job){$scope.updateClassifications()}),$rootScope.$on(thEvents.bugsAssociated,function(event,job){$scope.updateBugs()}),$scope.pinboard_service=thPinboard,$scope.tabService=thTabs}]),treeherder.controller("PinboardCtrl",["$scope","$rootScope","$document","$timeout","thEvents","thPinboard","thNotify","ThLog",function($scope,$rootScope,$document,$timeout,thEvents,thPinboard,thNotify,ThLog){function handleRelatedBugDocumentClick(event){$(event.target).hasClass("add-related-bugs-input")||$scope.$apply(function(){$scope.toggleEnterBugNumber(!1)})}var $log=new ThLog(this.constructor.name);$rootScope.$on(thEvents.jobPin,function(event,job){$scope.pinJob(job),$scope.$$phase||$scope.$digest()}),$rootScope.$on(thEvents.addRelatedBug,function(event,job){$scope.pinJob(job),$scope.toggleEnterBugNumber(!0)}),$rootScope.$on(thEvents.saveClassification,function(event){$scope.isPinboardVisible&&$scope.save()}),$rootScope.$on(thEvents.clearPinboard,function(event){$scope.isPinboardVisible&&$scope.unPinAll()}),$scope.pinJob=function(job){thPinboard.pinJob(job),$scope.selectedJob||$scope.viewJob(job)},$scope.pinSelectedJob=function(){thPinboard.pinJob($scope.selectedJob)},$scope.unPinJob=function(id){thPinboard.unPinJob(id)},$scope.addBug=function(bug){thPinboard.addBug(bug)},$scope.removeBug=function(id){thPinboard.removeBug(id)},$scope.unPinAll=function(){thPinboard.unPinAll(),$scope.classification=thPinboard.createNewClassification()},$scope.save=function(){if($scope.user.loggedin){$scope.enteringBugNumber&&$scope.saveEnteredBugNumber(),$scope.classification.who=$scope.user.email;var classification=$scope.classification;thPinboard.save(classification),$scope.completeClassification(),$scope.classification=thPinboard.createNewClassification(),$rootScope.$emit(thEvents.selectJob,$rootScope.selectedJob,"passive")}else thNotify.send("Must be logged in to save job classifications","danger")},$scope.saveClassificationOnly=function(){$scope.user.loggedin?($scope.classification.who=$scope.user.email,thPinboard.saveClassificationOnly($scope.classification)):thNotify.send("Must be logged in to save job classifications","danger")},$scope.saveBugsOnly=function(){$scope.user.loggedin?thPinboard.saveBugsOnly():thNotify.send("Must be logged in to save job classifications","danger")},$scope.hasPinnedJobs=function(){return thPinboard.hasPinnedJobs()},$scope.hasRelatedBugs=function(){return thPinboard.hasRelatedBugs()},$scope.toggleEnterBugNumber=function(tf){$scope.enteringBugNumber=tf,$scope.focusInput=tf,$document.off("click",handleRelatedBugDocumentClick),tf?(Mousetrap.bind("escape",function(){var cancel=_.bind($scope.toggleEnterBugNumber,$scope,!1);$scope.$evalAsync(cancel)}),$timeout(function(){$document.on("click",handleRelatedBugDocumentClick)},0)):$scope.newEnteredBugNumber=""},$scope.completeClassification=function(){$rootScope.$broadcast("blur-this","classification-comment")},$scope.saveEnteredBugNumber=function(){$scope.enteringBugNumber&&($scope.newEnteredBugNumber?($log.debug("new bug number to be saved: ",$scope.newEnteredBugNumber),thPinboard.addBug({id:$scope.newEnteredBugNumber}),$scope.toggleEnterBugNumber(!1)):$scope.toggleEnterBugNumber(!1))},$scope.viewJob=function(job){$rootScope.selectedJob=job,$rootScope.$emit(thEvents.jobClick,job),$rootScope.$emit(thEvents.selectJob,job)},$scope.classification=thPinboard.createNewClassification(),$scope.pinnedJobs=thPinboard.pinnedJobs,$scope.relatedBugs=thPinboard.relatedBugs}]),treeherder.controller("AnnotationsPluginCtrl",["$scope","$rootScope","ThLog","ThJobClassificationModel","thNotify","thEvents","ThResultSetStore","ThBugJobMapModel","thTabs",function($scope,$rootScope,ThLog,ThJobClassificationModel,thNotify,thEvents,ThResultSetStore,ThBugJobMapModel,thTabs){var $log=new ThLog(this.constructor.name);$log.debug("annotations plugin initialized"),$scope.$watch("classifications",function(newValue,oldValue){thTabs.tabs.annotations.num_items=newValue?$scope.classifications.length:0},!0),$rootScope.$on(thEvents.deleteClassification,function(event){if($scope.classifications[0]){$scope.deleteClassification($scope.classifications[0]);for(var i=0;i<$scope.bugs.length;i++)$scope.deleteBug($scope.bugs[i]);$rootScope.$emit(thEvents.selectJob,$rootScope.selectedJob,"passive")}else thNotify.send("No classification on this job to delete","warning")}),$scope.deleteClassification=function(classification){var key="key"+classification.job_id,jobMap=ThResultSetStore.getJobMap($rootScope.repoName),job=jobMap[key].job_obj;job.failure_classification_id=1,ThResultSetStore.updateUnclassifiedFailureMap($rootScope.repoName,job),classification["delete"]().then(function(){thNotify.send("Classification successfully deleted","success",!1);var jobs={};jobs[$scope.selectedJob.id]=$scope.selectedJob,ThResultSetStore.fetchJobs($scope.repoName,[$scope.job.id]),$rootScope.$emit(thEvents.jobsClassified,{jobs:jobs})},function(){thNotify.send("Classification deletion failed","danger",!0)})},$scope.deleteBug=function(bug){bug["delete"]().then(function(){thNotify.send("Association to bug "+bug.bug_id+" successfully deleted","success",!1);var jobs={};jobs[$scope.selectedJob.id]=$scope.selectedJob,$rootScope.$emit(thEvents.bugsAssociated,{jobs:jobs})},function(){thNotify.send("Association to bug "+bug.bug_id+" deletion failed","danger",!0)})}}]),treeherder.controller("BugsPluginCtrl",["$scope","ThLog","ThJobArtifactModel","$q","thTabs","$timeout",function($scope,ThLog,ThJobArtifactModel,$q,thTabs,$timeout){var $log=new ThLog(this.constructor.name);$log.debug("bugs plugin initialized");var timeoutPromise=null,requestPromise=null,bug_limit=20;$scope.tabs=thTabs.tabs,thTabs.tabs.failureSummary.update=function(){var newValue=thTabs.tabs.failureSummary.contentId;$scope.suggestions=[],angular.isDefined(newValue)&&(thTabs.tabs.failureSummary.is_loading=!0,null!==timeoutPromise&&$timeout.cancel(timeoutPromise),null!==requestPromise&&requestPromise.resolve(),requestPromise=$q.defer(),ThJobArtifactModel.get_list({name:"Bug suggestions",type:"json",job_id:newValue},{timeout:requestPromise}).then(function(artifact_list){var suggestions=[];if(artifact_list.length>0){var artifact=artifact_list[0];angular.forEach(artifact.blob,function(suggestion){suggestion.bugs.too_many_open_recent=suggestion.bugs.open_recent.length>bug_limit,suggestion.bugs.too_many_all_others=suggestion.bugs.all_others.length>bug_limit,suggestion.valid_open_recent=suggestion.bugs.open_recent.length>0&&!suggestion.bugs.too_many_open_recent,suggestion.valid_all_others=suggestion.bugs.all_others.length>0&&!suggestion.bugs.too_many_all_others&&!suggestion.bugs.too_many_open_recent,suggestions.push(suggestion)}),$scope.suggestions=suggestions,$scope.bugSuggestionsLoaded=!0}else $scope.selectedJob&&($scope.bugSuggestionsLoaded=!1,timeoutPromise=$timeout(thTabs.tabs.failureSummary.update,5e3))})["finally"](function(){thTabs.tabs.failureSummary.is_loading=!1}))}}]),treeherder.controller("SimilarJobsPluginCtrl",["$scope","ThLog","ThJobModel","thResultStatusInfo","thEvents","numberFilter","dateFilter","thClassificationTypes","thResultStatus","ThJobArtifactModel","ThResultSetModel","thNotify","thTabs",function($scope,ThLog,ThJobModel,thResultStatusInfo,thEvents,numberFilter,dateFilter,thClassificationTypes,thResultStatus,ThJobArtifactModel,ThResultSetModel,thNotify,thTabs){var $log=new ThLog(this.constructor.name);$log.debug("similar jobs plugin initialized"),$scope.page_size=20,$scope.get_similar_jobs=function(){thTabs.tabs.similarJobs.is_loading=!0;var options={count:$scope.page_size+1,offset:($scope.page-1)*$scope.page_size};angular.forEach($scope.similar_jobs_filters,function(value,key){value&&(options[key]=$scope.job[key])}),ThJobModel.get_list($scope.repoName,options).then(function(data){if(data.length>0){data.length>$scope.page_size?$scope.has_next_page=!0:$scope.has_next_page=!1,data.pop();var result_set_ids=_.uniq(_.pluck(data,"result_set_id"));ThResultSetModel.getResultSets($scope.repoName,null,100,result_set_ids,!0,!1).then(function(response){var resultsets=_.indexBy(response.data.results,"id");angular.forEach(data,function(obj){obj.result_set=resultsets[obj.result_set_id],obj.revisionResultsetFilterUrl=$scope.urlBasePath+"?repo="+$scope.repoName+"&revision="+obj.result_set.revisions[0].revision,obj.authorResultsetFilterUrl=$scope.urlBasePath+"?repo="+$scope.repoName+"&author="+encodeURIComponent(obj.result_set.author)}),$scope.similar_jobs=$.merge($scope.similar_jobs,data),1===$scope.page&&$scope.similar_jobs.length>0&&$scope.show_job_info($scope.similar_jobs[0]),thTabs.tabs.similarJobs.is_loading=!1},function(){thNotify.send("Error fetching result sets for similar jobs","danger")})}})},$scope.update_similar_jobs=function(){angular.isDefined($scope.jobLoadedPromise)&&$scope.jobLoadedPromise.then(function(){$scope.similar_jobs=[],$scope.page=1,$scope.similar_job_selected=null,$scope.get_similar_jobs()})},thTabs.tabs.similarJobs.update=$scope.update_similar_jobs,$scope.similar_jobs=[],$scope.result_status_info=thResultStatusInfo,$scope.similar_jobs_filters={machine_id:!1,job_type_id:!0,build_platform_id:!0,option_collection_hash:!0},$scope.button_class=function(job){var resultState=job.result;return"completed"!==job.state&&(resultState=job.state),thResultStatusInfo(resultState).btnClass},$scope.show_next=function(){$scope.page+=1,$scope.get_similar_jobs()},$scope.similar_job_selected=null,$scope.show_job_info=function(job){ThJobModel.get($scope.repoName,job.id).then(function(job){$scope.similar_job_selected=job,$scope.similar_job_selected.result_status=thResultStatus($scope.similar_job_selected);var duration=($scope.similar_job_selected.end_timestamp-$scope.similar_job_selected.start_timestamp)/60;duration&&(duration=numberFilter(duration,0)),$scope.similar_job_selected.duration=duration,$scope.similar_job_selected.start_time=0!==$scope.similar_job_selected.start_timestamp?dateFilter(1e3*$scope.similar_job_selected.start_timestamp,"short"):"",$scope.similar_job_selected.failure_classification=thClassificationTypes.classifications[$scope.similar_job_selected.failure_classification_id],ThJobArtifactModel.get_list({name:"text_log_summary",job_id:$scope.similar_job_selected.id}).then(function(artifact_list){artifact_list.length>0&&($scope.similar_job_selected.error_lines=artifact_list[0].blob.step_data.all_errors)})})}}]),treeherder.filter("showOrHide",function(){return function(input,isCollapsed){return 1==isCollapsed?"show"+input:"hide"+input}}),treeherder.filter("platformName",["thPlatformNameMap",function(thPlatformNameMap){return function(input,name){var newName=platformNameMap[name];return newName?newName:name}}]),treeherder.filter("stripHtml",function(){return function(input){var str=input||"";return str.replace(/<\/?[^>]+>/gi,"")}}),treeherder.filter("linkifyBugs",function(){return function(input){var str=input||"",bug_matches=str.match(/-- ([0-9]+)|bug.([0-9]+)/gi),pr_matches=str.match(/PR#([0-9]+)/gi),bug_title="bugzilla.mozilla.org",bug_url=''+initials+""}}),treeherder.filter("highlightCommonTerms",function(){return function(input,compareStr){var tokens=compareStr.split(/[^a-zA-Z0-9_-]+/);return tokens.sort(function(a,b){return b.length-a.length}),angular.forEach(tokens,function(elem){elem.length>0&&(input=input.replace(new RegExp(elem,"gi"),function(token,index,str){return inTag(str,index,"<",">")||inTag(str,index,"&",";")?token:""+token+" "}))}),input}}),treeherder.filter("escapeHTML",function(){return function(text){return text?text.replace(/&/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,"""):""}});angular.module('treeherder').run(['$templateCache', function($templateCache) {
'use strict';
$templateCache.put('partials/main/jobs.html',
@@ -44,7 +44,7 @@ var $log=new ThLog(this.constructor.name);$scope.getCountClass=function(resultSt
$templateCache.put('partials/main/thActionButton.html',
- " "
+ " "
);
@@ -159,7 +159,7 @@ var $log=new ThLog(this.constructor.name);$scope.getCountClass=function(resultSt
$templateCache.put('plugins/pluginpanel.html',
- "
0 || bugs.length > 0\" class=\"list-unstyled content-spacer\"> 0\"> {{bug.bug_id}} 0\">{{classifications[0].note}} Result: {{ job.result }}
State: {{ job.state }}
ETA to completed: ~ {{eta_abs}} minutes 0\">{{eta}} mins overdue, typically takes ~ {{typical_eta}} mins ETA any minute now, typically takes ~ {{typical_eta}} mins
Typically takes ~ {{typical_eta}} mins once started
Job (sig) : {{jobSearchStr}} Machine: {{job.machine_name}} {{job.machine_name}} {{label}}: {{value}} {{value}} {{value}} Requested: {{visibleTimeFields.requestTime}} Started: {{visibleTimeFields.startTime}} Ended: {{visibleTimeFields.endTime}} Duration: {{visibleTimeFields.duration}} Log parsing status: {{ job_log_url.parse_status }} Log parsing status: No logs Taskcluster: {{line.value}} Backfill this job
"
+ "
0 || bugs.length > 0\" class=\"list-unstyled content-spacer\"> 0\"> {{bug.bug_id}} 0\">{{classifications[0].note}} Result: {{ job.result }}
State: {{ job.state }}
ETA to completed: ~ {{eta_abs}} minutes 0\">{{eta}} mins overdue, typically takes ~ {{typical_eta}} mins ETA any minute now, typically takes ~ {{typical_eta}} mins
Typically takes ~ {{typical_eta}} mins once started
Job (sig) : {{jobSearchStr}} Machine: {{job.machine_name}} {{job.machine_name}} {{label}}: {{value}} {{value}} {{value}} Requested: {{visibleTimeFields.requestTime}} Started: {{visibleTimeFields.startTime}} Ended: {{visibleTimeFields.endTime}} Duration: {{visibleTimeFields.duration}} Log parsing status: {{ job_log_url.parse_status }} Log parsing status: No logs Taskcluster: {{line.value}}
"
);
diff --git a/dist/js/logviewer.min-ecb3e8cbb917aa4a3f6ad498222058cf.js b/dist/js/logviewer.min-d724be7acbb45483f11a68ddcda692e5.js
similarity index 96%
rename from dist/js/logviewer.min-ecb3e8cbb917aa4a3f6ad498222058cf.js
rename to dist/js/logviewer.min-d724be7acbb45483f11a68ddcda692e5.js
index e5c054723..85434f7a9 100644
--- a/dist/js/logviewer.min-ecb3e8cbb917aa4a3f6ad498222058cf.js
+++ b/dist/js/logviewer.min-d724be7acbb45483f11a68ddcda692e5.js
@@ -17,8 +17,8 @@ return tooltipHtmlUnsafeSuppressDeprecated||$log.warn("tooltip-html-unsafe is no
$templateCache.put("template/pagination/pagination.html",'')}]),angular.module("template/tooltip/tooltip-html-popup.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/tooltip/tooltip-html-popup.html",'\n')}]),angular.module("template/tooltip/tooltip-html-unsafe-popup.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/tooltip/tooltip-html-unsafe-popup.html",'\n')}]),angular.module("template/tooltip/tooltip-popup.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/tooltip/tooltip-popup.html",'\n')}]),angular.module("template/tooltip/tooltip-template-popup.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/tooltip/tooltip-template-popup.html",'\n')}]),angular.module("template/popover/popover-template.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/popover/popover-template.html",'\n')}]),angular.module("template/popover/popover-window.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/popover/popover-window.html",'\n')}]),angular.module("template/popover/popover.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/popover/popover.html",'\n')}]),angular.module("template/progressbar/bar.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/progressbar/bar.html",'
\n')}]),angular.module("template/progressbar/progress.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/progressbar/progress.html",'
')}]),angular.module("template/progressbar/progressbar.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/progressbar/progressbar.html",'\n')}]),angular.module("template/rating/rating.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/rating/rating.html",'\n \n ({{ $index < value ? \'*\' : \' \' }}) \n \n ')}]),angular.module("template/tabs/tab.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/tabs/tab.html",'\n {{heading}} \n \n')}]),angular.module("template/tabs/tabset.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/tabs/tabset.html",'\n')}]),angular.module("template/timepicker/timepicker.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/timepicker/timepicker.html",' \n')}]),angular.module("template/typeahead/typeahead-match.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/typeahead/typeahead-match.html",' ')}]),angular.module("template/typeahead/typeahead-popup.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/typeahead/typeahead-popup.html",'\n')}]),!angular.$$csp()&&angular.element(document).find("head").prepend(''),"undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function($){"use strict";function transitionEnd(){var el=document.createElement("bootstrap"),transEndEventNames={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var name in transEndEventNames)if(void 0!==el.style[name])return{end:transEndEventNames[name]};return!1}$.fn.emulateTransitionEnd=function(duration){var called=!1,$el=this;$(this).one("bsTransitionEnd",function(){called=!0});var callback=function(){called||$($el).trigger($.support.transition.end)};return setTimeout(callback,duration),this},$(function(){$.support.transition=transitionEnd(),$.support.transition&&($.event.special.bsTransitionEnd={bindType:$.support.transition.end,delegateType:$.support.transition.end,handle:function(e){return $(e.target).is(this)?e.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.alert");data||$this.data("bs.alert",data=new Alert(this)),"string"==typeof option&&data[option].call($this)})}var dismiss='[data-dismiss="alert"]',Alert=function(el){$(el).on("click",dismiss,this.close)};Alert.VERSION="3.2.0",Alert.prototype.close=function(e){function removeElement(){$parent.detach().trigger("closed.bs.alert").remove()}var $this=$(this),selector=$this.attr("data-target");selector||(selector=$this.attr("href"),selector=selector&&selector.replace(/.*(?=#[^\s]*$)/,""));var $parent=$(selector);e&&e.preventDefault(),$parent.length||($parent=$this.hasClass("alert")?$this:$this.parent()),$parent.trigger(e=$.Event("close.bs.alert")),e.isDefaultPrevented()||($parent.removeClass("in"),$.support.transition&&$parent.hasClass("fade")?$parent.one("bsTransitionEnd",removeElement).emulateTransitionEnd(150):removeElement())};var old=$.fn.alert;$.fn.alert=Plugin,$.fn.alert.Constructor=Alert,$.fn.alert.noConflict=function(){return $.fn.alert=old,this},$(document).on("click.bs.alert.data-api",dismiss,Alert.prototype.close)}(jQuery),+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.button"),options="object"==typeof option&&option;data||$this.data("bs.button",data=new Button(this,options)),"toggle"==option?data.toggle():option&&data.setState(option)})}var Button=function(element,options){this.$element=$(element),this.options=$.extend({},Button.DEFAULTS,options),this.isLoading=!1};Button.VERSION="3.2.0",Button.DEFAULTS={loadingText:"loading..."},Button.prototype.setState=function(state){var d="disabled",$el=this.$element,val=$el.is("input")?"val":"html",data=$el.data();state+="Text",null==data.resetText&&$el.data("resetText",$el[val]()),$el[val](null==data[state]?this.options[state]:data[state]),setTimeout($.proxy(function(){"loadingText"==state?(this.isLoading=!0,$el.addClass(d).attr(d,d)):this.isLoading&&(this.isLoading=!1,$el.removeClass(d).removeAttr(d))},this),0)},Button.prototype.toggle=function(){var changed=!0,$parent=this.$element.closest('[data-toggle="buttons"]');if($parent.length){var $input=this.$element.find("input");"radio"==$input.prop("type")&&($input.prop("checked")&&this.$element.hasClass("active")?changed=!1:$parent.find(".active").removeClass("active")),changed&&$input.prop("checked",!this.$element.hasClass("active")).trigger("change")}changed&&this.$element.toggleClass("active")};var old=$.fn.button;$.fn.button=Plugin,$.fn.button.Constructor=Button,$.fn.button.noConflict=function(){return $.fn.button=old,this},$(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(e){var $btn=$(e.target);$btn.hasClass("btn")||($btn=$btn.closest(".btn")),Plugin.call($btn,"toggle"),e.preventDefault()})}(jQuery),+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.carousel"),options=$.extend({},Carousel.DEFAULTS,$this.data(),"object"==typeof option&&option),action="string"==typeof option?option:options.slide;data||$this.data("bs.carousel",data=new Carousel(this,options)),"number"==typeof option?data.to(option):action?data[action]():options.interval&&data.pause().cycle()})}var Carousel=function(element,options){this.$element=$(element).on("keydown.bs.carousel",$.proxy(this.keydown,this)),this.$indicators=this.$element.find(".carousel-indicators"),this.options=options,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter.bs.carousel",$.proxy(this.pause,this)).on("mouseleave.bs.carousel",$.proxy(this.cycle,this))};Carousel.VERSION="3.2.0",Carousel.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},Carousel.prototype.keydown=function(e){switch(e.which){case 37:this.prev();break;case 39:this.next();break;default:return}e.preventDefault()},Carousel.prototype.cycle=function(e){return e||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval($.proxy(this.next,this),this.options.interval)),this},Carousel.prototype.getItemIndex=function(item){return this.$items=item.parent().children(".item"),this.$items.index(item||this.$active)},Carousel.prototype.to=function(pos){var that=this,activeIndex=this.getItemIndex(this.$active=this.$element.find(".item.active"));return pos>this.$items.length-1||0>pos?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){that.to(pos)}):activeIndex==pos?this.pause().cycle():this.slide(pos>activeIndex?"next":"prev",$(this.$items[pos]))},Carousel.prototype.pause=function(e){return e||(this.paused=!0),this.$element.find(".next, .prev").length&&$.support.transition&&(this.$element.trigger($.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},Carousel.prototype.next=function(){return this.sliding?void 0:this.slide("next")},Carousel.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},Carousel.prototype.slide=function(type,next){var $active=this.$element.find(".item.active"),$next=next||$active[type](),isCycling=this.interval,direction="next"==type?"left":"right",fallback="next"==type?"first":"last",that=this;if(!$next.length){if(!this.options.wrap)return;$next=this.$element.find(".item")[fallback]()}if($next.hasClass("active"))return this.sliding=!1;var relatedTarget=$next[0],slideEvent=$.Event("slide.bs.carousel",{relatedTarget:relatedTarget,direction:direction});if(this.$element.trigger(slideEvent),!slideEvent.isDefaultPrevented()){if(this.sliding=!0,isCycling&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var $nextIndicator=$(this.$indicators.children()[this.getItemIndex($next)]);$nextIndicator&&$nextIndicator.addClass("active")}var slidEvent=$.Event("slid.bs.carousel",{relatedTarget:relatedTarget,direction:direction});return $.support.transition&&this.$element.hasClass("slide")?($next.addClass(type),$next[0].offsetWidth,$active.addClass(direction),$next.addClass(direction),$active.one("bsTransitionEnd",function(){$next.removeClass([type,direction].join(" ")).addClass("active"),$active.removeClass(["active",direction].join(" ")),that.sliding=!1,setTimeout(function(){that.$element.trigger(slidEvent)},0)}).emulateTransitionEnd(1e3*$active.css("transition-duration").slice(0,-1))):($active.removeClass("active"),$next.addClass("active"),this.sliding=!1,this.$element.trigger(slidEvent)),isCycling&&this.cycle(),this}};var old=$.fn.carousel;$.fn.carousel=Plugin,$.fn.carousel.Constructor=Carousel,$.fn.carousel.noConflict=function(){return $.fn.carousel=old,this},$(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(e){var href,$this=$(this),$target=$($this.attr("data-target")||(href=$this.attr("href"))&&href.replace(/.*(?=#[^\s]+$)/,""));if($target.hasClass("carousel")){var options=$.extend({},$target.data(),$this.data()),slideIndex=$this.attr("data-slide-to");slideIndex&&(options.interval=!1),Plugin.call($target,options),slideIndex&&$target.data("bs.carousel").to(slideIndex),e.preventDefault()}}),$(window).on("load",function(){$('[data-ride="carousel"]').each(function(){var $carousel=$(this);Plugin.call($carousel,$carousel.data())})})}(jQuery),+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.collapse"),options=$.extend({},Collapse.DEFAULTS,$this.data(),"object"==typeof option&&option);!data&&options.toggle&&"show"==option&&(option=!option),data||$this.data("bs.collapse",data=new Collapse(this,options)),"string"==typeof option&&data[option]()})}var Collapse=function(element,options){this.$element=$(element),this.options=$.extend({},Collapse.DEFAULTS,options),this.transitioning=null,this.options.parent&&(this.$parent=$(this.options.parent)),this.options.toggle&&this.toggle()};Collapse.VERSION="3.2.0",Collapse.DEFAULTS={toggle:!0},Collapse.prototype.dimension=function(){var hasWidth=this.$element.hasClass("width");return hasWidth?"width":"height"},Collapse.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var startEvent=$.Event("show.bs.collapse");if(this.$element.trigger(startEvent),!startEvent.isDefaultPrevented()){var actives=this.$parent&&this.$parent.find("> .panel > .in");if(actives&&actives.length){var hasData=actives.data("bs.collapse");if(hasData&&hasData.transitioning)return;Plugin.call(actives,"hide"),hasData||actives.data("bs.collapse",null)}var dimension=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[dimension](0),this.transitioning=1;var complete=function(){this.$element.removeClass("collapsing").addClass("collapse in")[dimension](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!$.support.transition)return complete.call(this);var scrollSize=$.camelCase(["scroll",dimension].join("-"));this.$element.one("bsTransitionEnd",$.proxy(complete,this)).emulateTransitionEnd(350)[dimension](this.$element[0][scrollSize])}}},Collapse.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var startEvent=$.Event("hide.bs.collapse");if(this.$element.trigger(startEvent),!startEvent.isDefaultPrevented()){var dimension=this.dimension();this.$element[dimension](this.$element[dimension]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var complete=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return $.support.transition?void this.$element[dimension](0).one("bsTransitionEnd",$.proxy(complete,this)).emulateTransitionEnd(350):complete.call(this)}}},Collapse.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var old=$.fn.collapse;$.fn.collapse=Plugin,$.fn.collapse.Constructor=Collapse,$.fn.collapse.noConflict=function(){return $.fn.collapse=old,this},$(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(e){var href,$this=$(this),target=$this.attr("data-target")||e.preventDefault()||(href=$this.attr("href"))&&href.replace(/.*(?=#[^\s]+$)/,""),$target=$(target),data=$target.data("bs.collapse"),option=data?"toggle":$this.data(),parent=$this.attr("data-parent"),$parent=parent&&$(parent);data&&data.transitioning||($parent&&$parent.find('[data-toggle="collapse"][data-parent="'+parent+'"]').not($this).addClass("collapsed"),$this[$target.hasClass("in")?"addClass":"removeClass"]("collapsed")),Plugin.call($target,option)})}(jQuery),+function($){"use strict";function clearMenus(e){e&&3===e.which||($(backdrop).remove(),$(toggle).each(function(){var $parent=getParent($(this)),relatedTarget={relatedTarget:this};$parent.hasClass("open")&&($parent.trigger(e=$.Event("hide.bs.dropdown",relatedTarget)),e.isDefaultPrevented()||$parent.removeClass("open").trigger("hidden.bs.dropdown",relatedTarget))}))}function getParent($this){var selector=$this.attr("data-target");selector||(selector=$this.attr("href"),selector=selector&&/#[A-Za-z]/.test(selector)&&selector.replace(/.*(?=#[^\s]*$)/,""));var $parent=selector&&$(selector);return $parent&&$parent.length?$parent:$this.parent()}function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.dropdown");data||$this.data("bs.dropdown",data=new Dropdown(this)),"string"==typeof option&&data[option].call($this)})}var backdrop=".dropdown-backdrop",toggle='[data-toggle="dropdown"]',Dropdown=function(element){$(element).on("click.bs.dropdown",this.toggle)};Dropdown.VERSION="3.2.0",Dropdown.prototype.toggle=function(e){var $this=$(this);if(!$this.is(".disabled, :disabled")){var $parent=getParent($this),isActive=$parent.hasClass("open");if(clearMenus(),!isActive){"ontouchstart"in document.documentElement&&!$parent.closest(".navbar-nav").length&&$('
').insertAfter($(this)).on("click",clearMenus);var relatedTarget={relatedTarget:this};if($parent.trigger(e=$.Event("show.bs.dropdown",relatedTarget)),e.isDefaultPrevented())return;$this.trigger("focus"),$parent.toggleClass("open").trigger("shown.bs.dropdown",relatedTarget)}return!1}},Dropdown.prototype.keydown=function(e){if(/(38|40|27)/.test(e.keyCode)){var $this=$(this);if(e.preventDefault(),e.stopPropagation(),!$this.is(".disabled, :disabled")){var $parent=getParent($this),isActive=$parent.hasClass("open");if(!isActive||isActive&&27==e.keyCode)return 27==e.which&&$parent.find(toggle).trigger("focus"),$this.trigger("click");var desc=" li:not(.divider):visible a",$items=$parent.find('[role="menu"]'+desc+', [role="listbox"]'+desc);if($items.length){var index=$items.index($items.filter(":focus"));38==e.keyCode&&index>0&&index--,40==e.keyCode&&index<$items.length-1&&index++,~index||(index=0),$items.eq(index).trigger("focus")}}}};var old=$.fn.dropdown;$.fn.dropdown=Plugin,$.fn.dropdown.Constructor=Dropdown,$.fn.dropdown.noConflict=function(){return $.fn.dropdown=old,this},$(document).on("click.bs.dropdown.data-api",clearMenus).on("click.bs.dropdown.data-api",".dropdown form",function(e){e.stopPropagation()}).on("click.bs.dropdown.data-api",toggle,Dropdown.prototype.toggle).on("keydown.bs.dropdown.data-api",toggle+', [role="menu"], [role="listbox"]',Dropdown.prototype.keydown)}(jQuery),+function($){"use strict";function Plugin(option,_relatedTarget){return this.each(function(){var $this=$(this),data=$this.data("bs.modal"),options=$.extend({},Modal.DEFAULTS,$this.data(),"object"==typeof option&&option);data||$this.data("bs.modal",data=new Modal(this,options)),"string"==typeof option?data[option](_relatedTarget):options.show&&data.show(_relatedTarget)})}var Modal=function(element,options){this.options=options,this.$body=$(document.body),this.$element=$(element),this.$backdrop=this.isShown=null,this.scrollbarWidth=0,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,$.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};Modal.VERSION="3.2.0",Modal.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},Modal.prototype.toggle=function(_relatedTarget){return this.isShown?this.hide():this.show(_relatedTarget)},Modal.prototype.show=function(_relatedTarget){var that=this,e=$.Event("show.bs.modal",{relatedTarget:_relatedTarget});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.$body.addClass("modal-open"),this.setScrollbar(),this.escape(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',$.proxy(this.hide,this)),this.backdrop(function(){var transition=$.support.transition&&that.$element.hasClass("fade");that.$element.parent().length||that.$element.appendTo(that.$body),that.$element.show().scrollTop(0),transition&&that.$element[0].offsetWidth,that.$element.addClass("in").attr("aria-hidden",!1),that.enforceFocus();var e=$.Event("shown.bs.modal",{relatedTarget:_relatedTarget});transition?that.$element.find(".modal-dialog").one("bsTransitionEnd",function(){that.$element.trigger("focus").trigger(e)}).emulateTransitionEnd(300):that.$element.trigger("focus").trigger(e)}))},Modal.prototype.hide=function(e){e&&e.preventDefault(),e=$.Event("hide.bs.modal"),this.$element.trigger(e),this.isShown&&!e.isDefaultPrevented()&&(this.isShown=!1,this.$body.removeClass("modal-open"),this.resetScrollbar(),this.escape(),$(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),$.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",$.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},Modal.prototype.enforceFocus=function(){$(document).off("focusin.bs.modal").on("focusin.bs.modal",$.proxy(function(e){this.$element[0]===e.target||this.$element.has(e.target).length||this.$element.trigger("focus")},this))},Modal.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",$.proxy(function(e){27==e.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},Modal.prototype.hideModal=function(){var that=this;this.$element.hide(),this.backdrop(function(){that.$element.trigger("hidden.bs.modal")})},Modal.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},Modal.prototype.backdrop=function(callback){var that=this,animate=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var doAnimate=$.support.transition&&animate;if(this.$backdrop=$('
').appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",$.proxy(function(e){e.target===e.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),doAnimate&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!callback)return;doAnimate?this.$backdrop.one("bsTransitionEnd",callback).emulateTransitionEnd(150):callback()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var callbackRemove=function(){that.removeBackdrop(),callback&&callback()};$.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",callbackRemove).emulateTransitionEnd(150):callbackRemove()}else callback&&callback()},Modal.prototype.checkScrollbar=function(){document.body.clientWidth>=window.innerWidth||(this.scrollbarWidth=this.scrollbarWidth||this.measureScrollbar())},Modal.prototype.setScrollbar=function(){var bodyPad=parseInt(this.$body.css("padding-right")||0,10);this.scrollbarWidth&&this.$body.css("padding-right",bodyPad+this.scrollbarWidth)},Modal.prototype.resetScrollbar=function(){this.$body.css("padding-right","")},Modal.prototype.measureScrollbar=function(){var scrollDiv=document.createElement("div");scrollDiv.className="modal-scrollbar-measure",this.$body.append(scrollDiv);var scrollbarWidth=scrollDiv.offsetWidth-scrollDiv.clientWidth;return this.$body[0].removeChild(scrollDiv),scrollbarWidth};var old=$.fn.modal;$.fn.modal=Plugin,$.fn.modal.Constructor=Modal,$.fn.modal.noConflict=function(){return $.fn.modal=old,this},$(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(e){var $this=$(this),href=$this.attr("href"),$target=$($this.attr("data-target")||href&&href.replace(/.*(?=#[^\s]+$)/,"")),option=$target.data("bs.modal")?"toggle":$.extend({remote:!/#/.test(href)&&href},$target.data(),$this.data());$this.is("a")&&e.preventDefault(),$target.one("show.bs.modal",function(showEvent){showEvent.isDefaultPrevented()||$target.one("hidden.bs.modal",function(){$this.is(":visible")&&$this.trigger("focus")})}),Plugin.call($target,option,this)})}(jQuery),+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.tooltip"),options="object"==typeof option&&option;(data||"destroy"!=option)&&(data||$this.data("bs.tooltip",data=new Tooltip(this,options)),"string"==typeof option&&data[option]())})}var Tooltip=function(element,options){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",element,options)};Tooltip.VERSION="3.2.0",Tooltip.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},Tooltip.prototype.init=function(type,element,options){this.enabled=!0,this.type=type,this.$element=$(element),this.options=this.getOptions(options),this.$viewport=this.options.viewport&&$(this.options.viewport.selector||this.options.viewport);for(var triggers=this.options.trigger.split(" "),i=triggers.length;i--;){var trigger=triggers[i];if("click"==trigger)this.$element.on("click."+this.type,this.options.selector,$.proxy(this.toggle,this));else if("manual"!=trigger){var eventIn="hover"==trigger?"mouseenter":"focusin",eventOut="hover"==trigger?"mouseleave":"focusout";this.$element.on(eventIn+"."+this.type,this.options.selector,$.proxy(this.enter,this)),this.$element.on(eventOut+"."+this.type,this.options.selector,$.proxy(this.leave,this))}}this.options.selector?this._options=$.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},Tooltip.prototype.getDefaults=function(){return Tooltip.DEFAULTS},Tooltip.prototype.getOptions=function(options){return options=$.extend({},this.getDefaults(),this.$element.data(),options),options.delay&&"number"==typeof options.delay&&(options.delay={show:options.delay,hide:options.delay}),options},Tooltip.prototype.getDelegateOptions=function(){var options={},defaults=this.getDefaults();return this._options&&$.each(this._options,function(key,value){defaults[key]!=value&&(options[key]=value)}),options},Tooltip.prototype.enter=function(obj){var self=obj instanceof this.constructor?obj:$(obj.currentTarget).data("bs."+this.type);return self||(self=new this.constructor(obj.currentTarget,this.getDelegateOptions()),$(obj.currentTarget).data("bs."+this.type,self)),clearTimeout(self.timeout),self.hoverState="in",self.options.delay&&self.options.delay.show?void(self.timeout=setTimeout(function(){"in"==self.hoverState&&self.show()},self.options.delay.show)):self.show()},Tooltip.prototype.leave=function(obj){var self=obj instanceof this.constructor?obj:$(obj.currentTarget).data("bs."+this.type);return self||(self=new this.constructor(obj.currentTarget,this.getDelegateOptions()),$(obj.currentTarget).data("bs."+this.type,self)),clearTimeout(self.timeout),self.hoverState="out",self.options.delay&&self.options.delay.hide?void(self.timeout=setTimeout(function(){"out"==self.hoverState&&self.hide()},self.options.delay.hide)):self.hide();
},Tooltip.prototype.show=function(){var e=$.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(e);var inDom=$.contains(document.documentElement,this.$element[0]);if(e.isDefaultPrevented()||!inDom)return;var that=this,$tip=this.tip(),tipId=this.getUID(this.type);this.setContent(),$tip.attr("id",tipId),this.$element.attr("aria-describedby",tipId),this.options.animation&&$tip.addClass("fade");var placement="function"==typeof this.options.placement?this.options.placement.call(this,$tip[0],this.$element[0]):this.options.placement,autoToken=/\s?auto?\s?/i,autoPlace=autoToken.test(placement);autoPlace&&(placement=placement.replace(autoToken,"")||"top"),$tip.detach().css({top:0,left:0,display:"block"}).addClass(placement).data("bs."+this.type,this),this.options.container?$tip.appendTo(this.options.container):$tip.insertAfter(this.$element);var pos=this.getPosition(),actualWidth=$tip[0].offsetWidth,actualHeight=$tip[0].offsetHeight;if(autoPlace){var orgPlacement=placement,$parent=this.$element.parent(),parentDim=this.getPosition($parent);placement="bottom"==placement&&pos.top+pos.height+actualHeight-parentDim.scroll>parentDim.height?"top":"top"==placement&&pos.top-parentDim.scroll-actualHeight<0?"bottom":"right"==placement&&pos.right+actualWidth>parentDim.width?"left":"left"==placement&&pos.left-actualWidthviewportDimensions.top+viewportDimensions.height&&(delta.top=viewportDimensions.top+viewportDimensions.height-bottomEdgeOffset)}else{var leftEdgeOffset=pos.left-viewportPadding,rightEdgeOffset=pos.left+viewportPadding+actualWidth;leftEdgeOffsetviewportDimensions.width&&(delta.left=viewportDimensions.left+viewportDimensions.width-rightEdgeOffset)}return delta},Tooltip.prototype.getTitle=function(){var title,$e=this.$element,o=this.options;return title=$e.attr("data-original-title")||("function"==typeof o.title?o.title.call($e[0]):o.title)},Tooltip.prototype.getUID=function(prefix){do prefix+=~~(1e6*Math.random());while(document.getElementById(prefix));return prefix},Tooltip.prototype.tip=function(){return this.$tip=this.$tip||$(this.options.template)},Tooltip.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},Tooltip.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},Tooltip.prototype.enable=function(){this.enabled=!0},Tooltip.prototype.disable=function(){this.enabled=!1},Tooltip.prototype.toggleEnabled=function(){this.enabled=!this.enabled},Tooltip.prototype.toggle=function(e){var self=this;e&&(self=$(e.currentTarget).data("bs."+this.type),self||(self=new this.constructor(e.currentTarget,this.getDelegateOptions()),$(e.currentTarget).data("bs."+this.type,self))),self.tip().hasClass("in")?self.leave(self):self.enter(self)},Tooltip.prototype.destroy=function(){clearTimeout(this.timeout),this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var old=$.fn.tooltip;$.fn.tooltip=Plugin,$.fn.tooltip.Constructor=Tooltip,$.fn.tooltip.noConflict=function(){return $.fn.tooltip=old,this}}(jQuery),+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.popover"),options="object"==typeof option&&option;(data||"destroy"!=option)&&(data||$this.data("bs.popover",data=new Popover(this,options)),"string"==typeof option&&data[option]())})}var Popover=function(element,options){this.init("popover",element,options)};if(!$.fn.tooltip)throw new Error("Popover requires tooltip.js");Popover.VERSION="3.2.0",Popover.DEFAULTS=$.extend({},$.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),Popover.prototype=$.extend({},$.fn.tooltip.Constructor.prototype),Popover.prototype.constructor=Popover,Popover.prototype.getDefaults=function(){return Popover.DEFAULTS},Popover.prototype.setContent=function(){var $tip=this.tip(),title=this.getTitle(),content=this.getContent();$tip.find(".popover-title")[this.options.html?"html":"text"](title),$tip.find(".popover-content").empty()[this.options.html?"string"==typeof content?"html":"append":"text"](content),$tip.removeClass("fade top bottom left right in"),$tip.find(".popover-title").html()||$tip.find(".popover-title").hide()},Popover.prototype.hasContent=function(){return this.getTitle()||this.getContent()},Popover.prototype.getContent=function(){var $e=this.$element,o=this.options;return $e.attr("data-content")||("function"==typeof o.content?o.content.call($e[0]):o.content)},Popover.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},Popover.prototype.tip=function(){return this.$tip||(this.$tip=$(this.options.template)),this.$tip};var old=$.fn.popover;$.fn.popover=Plugin,$.fn.popover.Constructor=Popover,$.fn.popover.noConflict=function(){return $.fn.popover=old,this}}(jQuery),+function($){"use strict";function ScrollSpy(element,options){var process=$.proxy(this.process,this);this.$body=$("body"),this.$scrollElement=$($(element).is("body")?window:element),this.options=$.extend({},ScrollSpy.DEFAULTS,options),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",process),this.refresh(),this.process()}function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.scrollspy"),options="object"==typeof option&&option;data||$this.data("bs.scrollspy",data=new ScrollSpy(this,options)),"string"==typeof option&&data[option]()})}ScrollSpy.VERSION="3.2.0",ScrollSpy.DEFAULTS={offset:10},ScrollSpy.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},ScrollSpy.prototype.refresh=function(){var offsetMethod="offset",offsetBase=0;$.isWindow(this.$scrollElement[0])||(offsetMethod="position",offsetBase=this.$scrollElement.scrollTop()),this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight();var self=this;this.$body.find(this.selector).map(function(){var $el=$(this),href=$el.data("target")||$el.attr("href"),$href=/^#./.test(href)&&$(href);return $href&&$href.length&&$href.is(":visible")&&[[$href[offsetMethod]().top+offsetBase,href]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){self.offsets.push(this[0]),self.targets.push(this[1])})},ScrollSpy.prototype.process=function(){var i,scrollTop=this.$scrollElement.scrollTop()+this.options.offset,scrollHeight=this.getScrollHeight(),maxScroll=this.options.offset+scrollHeight-this.$scrollElement.height(),offsets=this.offsets,targets=this.targets,activeTarget=this.activeTarget;if(this.scrollHeight!=scrollHeight&&this.refresh(),scrollTop>=maxScroll)return activeTarget!=(i=targets[targets.length-1])&&this.activate(i);if(activeTarget&&scrollTop<=offsets[0])return activeTarget!=(i=targets[0])&&this.activate(i);for(i=offsets.length;i--;)activeTarget!=targets[i]&&scrollTop>=offsets[i]&&(!offsets[i+1]||scrollTop<=offsets[i+1])&&this.activate(targets[i])},ScrollSpy.prototype.activate=function(target){this.activeTarget=target,$(this.selector).parentsUntil(this.options.target,".active").removeClass("active");var selector=this.selector+'[data-target="'+target+'"],'+this.selector+'[href="'+target+'"]',active=$(selector).parents("li").addClass("active");active.parent(".dropdown-menu").length&&(active=active.closest("li.dropdown").addClass("active")),active.trigger("activate.bs.scrollspy")};var old=$.fn.scrollspy;$.fn.scrollspy=Plugin,$.fn.scrollspy.Constructor=ScrollSpy,$.fn.scrollspy.noConflict=function(){return $.fn.scrollspy=old,this},$(window).on("load.bs.scrollspy.data-api",function(){$('[data-spy="scroll"]').each(function(){var $spy=$(this);Plugin.call($spy,$spy.data())})})}(jQuery),+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.tab");data||$this.data("bs.tab",data=new Tab(this)),"string"==typeof option&&data[option]()})}var Tab=function(element){this.element=$(element)};Tab.VERSION="3.2.0",Tab.prototype.show=function(){var $this=this.element,$ul=$this.closest("ul:not(.dropdown-menu)"),selector=$this.data("target");if(selector||(selector=$this.attr("href"),selector=selector&&selector.replace(/.*(?=#[^\s]*$)/,"")),!$this.parent("li").hasClass("active")){var previous=$ul.find(".active:last a")[0],e=$.Event("show.bs.tab",{relatedTarget:previous});if($this.trigger(e),!e.isDefaultPrevented()){var $target=$(selector);this.activate($this.closest("li"),$ul),this.activate($target,$target.parent(),function(){$this.trigger({type:"shown.bs.tab",relatedTarget:previous})})}}},Tab.prototype.activate=function(element,container,callback){function next(){$active.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),element.addClass("active"),transition?(element[0].offsetWidth,element.addClass("in")):element.removeClass("fade"),element.parent(".dropdown-menu")&&element.closest("li.dropdown").addClass("active"),callback&&callback()}var $active=container.find("> .active"),transition=callback&&$.support.transition&&$active.hasClass("fade");transition?$active.one("bsTransitionEnd",next).emulateTransitionEnd(150):next(),$active.removeClass("in")};var old=$.fn.tab;$.fn.tab=Plugin,$.fn.tab.Constructor=Tab,$.fn.tab.noConflict=function(){return $.fn.tab=old,this},$(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(e){e.preventDefault(),Plugin.call($(this),"show")})}(jQuery),+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.affix"),options="object"==typeof option&&option;data||$this.data("bs.affix",data=new Affix(this,options)),"string"==typeof option&&data[option]()})}var Affix=function(element,options){this.options=$.extend({},Affix.DEFAULTS,options),this.$target=$(this.options.target).on("scroll.bs.affix.data-api",$.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",$.proxy(this.checkPositionWithEventLoop,this)),this.$element=$(element),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};Affix.VERSION="3.2.0",Affix.RESET="affix affix-top affix-bottom",Affix.DEFAULTS={offset:0,target:window},Affix.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(Affix.RESET).addClass("affix");var scrollTop=this.$target.scrollTop(),position=this.$element.offset();return this.pinnedOffset=position.top-scrollTop},Affix.prototype.checkPositionWithEventLoop=function(){setTimeout($.proxy(this.checkPosition,this),1)},Affix.prototype.checkPosition=function(){if(this.$element.is(":visible")){var scrollHeight=$(document).height(),scrollTop=this.$target.scrollTop(),position=this.$element.offset(),offset=this.options.offset,offsetTop=offset.top,offsetBottom=offset.bottom;"object"!=typeof offset&&(offsetBottom=offsetTop=offset),"function"==typeof offsetTop&&(offsetTop=offset.top(this.$element)),"function"==typeof offsetBottom&&(offsetBottom=offset.bottom(this.$element));var affix=null!=this.unpin&&scrollTop+this.unpin<=position.top?!1:null!=offsetBottom&&position.top+this.$element.height()>=scrollHeight-offsetBottom?"bottom":null!=offsetTop&&offsetTop>=scrollTop?"top":!1;if(this.affixed!==affix){null!=this.unpin&&this.$element.css("top","");var affixType="affix"+(affix?"-"+affix:""),e=$.Event(affixType+".bs.affix");this.$element.trigger(e),e.isDefaultPrevented()||(this.affixed=affix,this.unpin="bottom"==affix?this.getPinnedOffset():null,this.$element.removeClass(Affix.RESET).addClass(affixType).trigger($.Event(affixType.replace("affix","affixed"))),"bottom"==affix&&this.$element.offset({top:scrollHeight-this.$element.height()-offsetBottom}))}}};var old=$.fn.affix;$.fn.affix=Plugin,$.fn.affix.Constructor=Affix,$.fn.affix.noConflict=function(){return $.fn.affix=old,this},$(window).on("load",function(){$('[data-spy="affix"]').each(function(){var $spy=$(this),data=$spy.data();data.offset=data.offset||{},data.offsetBottom&&(data.offset.bottom=data.offsetBottom),data.offsetTop&&(data.offset.top=data.offsetTop),Plugin.call($spy,data)})})}(jQuery),function(){function n(n,t){if(n!==t){var r=n===n,e=t===t;if(n>t||!r||n===w&&e)return 1;if(t>n||!e||t===w&&r)return-1}return 0}function t(n,t,r){for(var e=n.length,u=r?e:-1;r?u--:++u=n&&n>=9&&13>=n||32==n||160==n||5760==n||6158==n||n>=8192&&(8202>=n||8232==n||8233==n||8239==n||8287==n||12288==n||65279==n)}function v(n,t){for(var r=-1,e=n.length,u=-1,o=[];++re&&(e=u)}return e}function Hn(n,t){for(var r=-1,e=n.length;++ri(t,a,0)&&u.push(a);return u}function at(n,t){var r=!0;return Nu(n,function(n,e,u){return r=!!t(n,e,u)}),r}function ct(n,t){var r=[];return Nu(n,function(n,e,u){t(n,e,u)&&r.push(n)}),r}function lt(n,t,r,e){var u;return r(n,function(n,r,o){return t(n,r,o)?(u=e?r:n,!1):void 0}),u}function st(n,t,r){for(var e=-1,u=n.length,o=-1,i=[];++et&&(t=-t>u?0:u+t),r=r===w||r>u?u:+r||0,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=Ce(u);++eu?c*(e[u]?1:-1):c;break n}}u=t.b-r.b}return u})}function Wt(n,t){var r=0;return Nu(n,function(n,e,u){r+=+t(n,e,u)||0}),r}function Tt(n,t){var e=-1,u=dr(),o=n.length,i=u==r,f=i&&o>=200,a=f?zu():null,c=[];a?(u=Pn,i=!1):(f=!1,a=t?[]:c);n:for(;++eu(a,s,0)&&((t||f)&&a.push(s),c.push(l))}return c}function Ut(n,t){for(var r=-1,e=t.length,u=Ce(e);++r=u){for(;u>e;){var o=e+u>>>1,i=n[o];(r?t>=i:t>i)?e=o+1:u=o}return u}return Lt(n,t,Oe,r)}function Lt(n,t,r,e){t=r(t);for(var u=0,o=n?n.length:0,i=t!==t,f=t===w;o>u;){var a=nu((u+o)/2),c=r(n[a]),l=c===c;(i?l||e:f?l&&(e||c!==w):e?t>=c:t>c)?u=a+1:o=a}return du(o,Ou)}function Bt(n,t,r){if("function"!=typeof n)return Oe;if(t===w)return n;switch(r){case 1:return function(r){return n.call(t,r)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,o){return n.call(t,r,e,u,o)};case 5:return function(r,e,u,o,i){return n.call(t,r,e,u,o,i)}}return function(){return n.apply(t,arguments)}}function zt(n){return Xe.call(n,0)}function Mt(n,t,r){for(var e=r.length,u=-1,o=yu(n.length-e,0),i=-1,f=t.length,a=Ce(o+f);++i2&&r[u-2],i=u>2&&r[2],f=u>1&&r[u-1];for("function"==typeof o?(o=Bt(o,f,5),u-=2):(o="function"==typeof f?f:null,u-=o?1:0),i&&jr(r[0],r[1],i)&&(o=3>u?null:o,u=1);++e-1?e[u]:w):lt(e,u,n)}}function Qt(n){return function(r,e,u){return r&&r.length?(e=yr(e,u,3),t(r,e,n)):-1}}function nr(n){return function(t,r,e){return r=yr(r,e,3),lt(t,r,n,!0)}}function tr(n){return function(){var t=arguments.length;if(!t)return function(){return arguments[0]};for(var r,e=n?t:-1,u=0,o=Ce(t);n?e--:++earguments.length;return"function"==typeof e&&o===w&&Io(r)?n(r,e,u,i):Et(r,yr(e,o,4),u,i,t)}}function ar(n,t,r,e,u,o,i,f,a,c){function l(){for(var b=arguments.length,j=b,k=Ce(b);j--;)k[j]=arguments[j];if(e&&(k=Mt(k,e,u)),o&&(k=Dt(k,o,i)),_||y){var j=l.placeholder,O=v(k,j),b=b-O.length;if(c>b){var R=f?qn(f):null,b=yu(c-b,0),C=_?O:null,O=_?null:O,S=_?k:null,k=_?null:k;return t|=_?E:I,t&=~(_?I:E),g||(t&=~(x|A)),k=[n,t,r,S,C,k,O,R,a,b],R=ar.apply(w,k),Or(n)&&Ku(R,k),R.placeholder=j,R}}if(j=p?r:this,h&&(n=j[m]),f)for(R=k.length,b=du(f.length,R),C=qn(k);b--;)O=f[b],k[b]=Ar(O,R)?C[O]:w;return s&&an&&vu(t)?(t-=n,r=null==r?" ":r+"",be(r,He(t/r.length)).slice(0,t)):""}function lr(n,t,r,e){function u(){for(var t=-1,f=arguments.length,a=-1,c=e.length,l=Ce(f+c);++af||u)&&(t&x&&(r[2]=p[2],f|=e&x?0:j),(e=p[3])&&(u=r[3],r[3]=u?Mt(u,e,p[4]):qn(e),r[4]=u?v(r[3],B):qn(p[4])),(e=p[5])&&(u=r[5],r[5]=u?Dt(u,e,p[6]):qn(e),r[6]=u?v(r[5],B):qn(p[6])),(e=p[7])&&(r[7]=qn(e)),t&R&&(r[8]=null==r[8]?p[8]:du(r[8],p[8])),null==r[9]&&(r[9]=p[9]),r[0]=p[0],r[1]=f),t=r[1],f=r[9]),r[9]=null==f?a?0:n.length:yu(f-c,0)||0,(p?Bu:Ku)(t==x?Yt(r[0],r[2]):t!=E&&t!=(x|E)||r[4].length?ar.apply(w,r):lr.apply(w,r),r)}function hr(n,t,r,e,u,o,i){var f=-1,a=n.length,c=t.length,l=!0;if(a!=c&&(!u||a>=c))return!1;for(;l&&++fi:i>u)||i===e&&i===o)&&(u=i,o=n)}),o}function yr(n,t,r){var e=$n.callback||je,e=e===je?ut:e;return r?e(n,t,r):e}function dr(n,t,e){var u=$n.indexOf||zr,u=u===zr?r:u;return n?u(n,t,e):u}function mr(n){var t=n.length,r=new n.constructor(t);return t&&"string"==typeof n[0]&&Ke.call(n,"index")&&(r.index=n.index,r.input=n.input),r}function wr(n){return n=n.constructor,"function"==typeof n&&n instanceof n||(n=Fe),
new n}function br(n,t,r){var e=n.constructor;switch(t){case J:return zt(n);case D:case P:return new e(+n);case X:case H:case Q:case nn:case tn:case rn:case en:case un:case on:return t=n.buffer,new e(r?zt(t):t,n.byteOffset,n.length);case V:case G:return new e(n);case Z:var u=new e(n.source,kn.exec(n));u.lastIndex=n.lastIndex}return u}function xr(n,t,r){return null==n||kr(t,n)||(t=Nr(t),n=1==t.length?n:gt(n,It(t,0,-1)),t=Mr(t)),t=null==n?n:n[t],null==t?w:t.apply(n,r)}function Ar(n,t){return n=+n,t=null==t?Ru:t,n>-1&&0==n%1&&t>n}function jr(n,t,r){if(!ae(r))return!1;var e=typeof t;return"number"==e?(e=Pu(r),e=Er(e)&&Ar(t,e)):e="string"==e&&t in r,e?(t=r[t],n===n?n===t:t!==t):!1}function kr(n,t){var r=typeof n;return"string"==r&&dn.test(n)||"number"==r?!0:Io(n)?!1:!yn.test(n)||null!=t&&n in Ur(t)}function Or(n){var t=Du(n);return!!t&&n===$n[t]&&t in zn.prototype}function Er(n){return"number"==typeof n&&n>-1&&0==n%1&&Ru>=n}function Ir(n){return n===n&&(0===n?1/n>0:!ae(n))}function Rr(n,t){n=Ur(n);for(var r=-1,e=t.length,u={};++rt?0:t)):[]}function Lr(n,t,r){var e=n?n.length:0;return e?((r?jr(n,t,r):null==t)&&(t=1),t=e-(+t||0),It(n,0,0>t?0:t)):[]}function Br(n){return n?n[0]:w}function zr(n,t,e){var u=n?n.length:0;if(!u)return-1;if("number"==typeof e)e=0>e?yu(u+e,0):e;else if(e)return e=$t(n,t),n=n[e],(t===t?t===n:n!==n)?e:-1;return r(n,t,e||0)}function Mr(n){var t=n?n.length:0;return t?n[t-1]:w}function Dr(n){return $r(n,1)}function Pr(n,t,e,u){if(!n||!n.length)return[];null!=t&&"boolean"!=typeof t&&(u=e,e=jr(n,t,u)?null:t,t=!1);var o=yr();if((o!==ut||null!=e)&&(e=o(e,u,3)),t&&dr()==r){t=e;var i;e=-1,u=n.length;for(var o=-1,f=[];++e>>0,e=Ce(r);++tr?yu(u+r,0):r||0,"string"==typeof n||!Io(n)&&pe(n)?u>r&&-10?n[Ot(0,t-1)]:w):(n=Qr(n),n.length=du(0>t?0:+t||0,n.length),n)}function Qr(n){n=Tr(n);for(var t=-1,r=n.length,e=Ce(r);++t=n&&(t=null),r}}function re(n,t,r){function e(){var r=t-(_o()-c);0>=r||r>t?(f&&Qe(f),r=p,f=s=p=w,r&&(h=_o(),a=n.apply(l,i),s||f||(i=l=null))):s=fu(e,r)}function u(){s&&Qe(s),f=s=p=w,(v||_!==t)&&(h=_o(),a=n.apply(l,i),s||f||(i=l=null))}function o(){if(i=arguments,c=_o(),l=this,p=v&&(s||!g),!1===_)var r=g&&!s;else{f||g||(h=c);var o=_-(c-h),y=0>=o||o>_;y?(f&&(f=Qe(f)),h=c,a=n.apply(l,i)):f||(f=fu(u,o))}return y&&s?s=Qe(s):s||t===_||(s=fu(e,t)),r&&(y=!0,a=n.apply(l,i)),!y||s||f||(i=l=null),a}var i,f,a,c,l,s,p,h=0,_=!1,v=!0;if("function"!=typeof n)throw new Be(L);if(t=0>t?0:+t||0,!0===r)var g=!0,v=!1;else ae(r)&&(g=r.leading,_="maxWait"in r&&yu(+r.maxWait||0,t),v="trailing"in r?r.trailing:v);return o.cancel=function(){s&&Qe(s),f&&Qe(f),f=s=p=w},o}function ee(n,t){function r(){var e=arguments,u=r.cache,o=t?t.apply(this,e):e[0];return u.has(o)?u.get(o):(e=n.apply(this,e),u.set(o,e),e)}if("function"!=typeof n||t&&"function"!=typeof t)throw new Be(L);return r.cache=new ee.Cache,r}function ue(n,t){if("function"!=typeof n)throw new Be(L);return t=yu(t===w?n.length-1:+t||0,0),function(){for(var r=arguments,e=-1,u=yu(r.length-t,0),o=Ce(u);++e0;++et||!n||!vu(t))return r;do t%2&&(r+=n),t=nu(t/2),n+=n;while(t);return r}function xe(n,t,r){var e=n;return(n=u(n))?(r?jr(e,t,r):null==t)?n.slice(g(n),y(n)+1):(t+="",n.slice(i(n,t),f(n,t)+1)):n}function Ae(n,t,r){return r&&jr(n,t,r)&&(t=null),n=u(n),n.match(t||Sn)||[]}function je(n,t,r){return r&&jr(n,t,r)&&(t=null),ut(n,t)}function ke(n){return function(){return n}}function Oe(n){return n}function Ee(n,t,r){if(null==r){var e=ae(t),u=e&&zo(t);((u=u&&u.length&&vt(t,u))?u.length:e)||(u=!1,r=t,t=n,n=this)}u||(u=vt(t,zo(t)));var o=!0,e=-1,i=Co(n),f=u.length;!1===r?o=!1:ae(r)&&"chain"in r&&(o=r.chain);for(;++e>>1,Iu=su?su.BYTES_PER_ELEMENT:0,Ru=Ue.pow(2,53)-1,Cu=lu&&new lu,Su={},Wu=$n.support={};!function(n){function t(){this.x=n}var r=[];t.prototype={valueOf:n,y:n};for(var e in new t)r.push(e);Wu.funcDecomp=/\bthis\b/.test(function(){return this}),Wu.funcNames="string"==typeof Te.name;try{Wu.dom=11===Pe.createDocumentFragment().nodeType}catch(u){Wu.dom=!1}try{Wu.nonEnumArgs=!ou.call(arguments,1)}catch(o){Wu.nonEnumArgs=!0}}(1,0),$n.templateSettings={escape:_n,evaluate:vn,interpolate:gn,variable:"",imports:{_:$n}};var Tu=pu||function(n,t){return null==t?n:et(t,qu(t),et(t,zo(t),n))},Uu=function(){function n(){}return function(t){if(ae(t)){n.prototype=t;var r=new n;n.prototype=null}return r||_.Object()}}(),Nu=Kt(ht),Fu=Kt(_t,!0),$u=Vt(),Lu=Vt(!0),Bu=Cu?function(n,t){return Cu.set(n,t),n}:Oe;Xe||(zt=Je&&cu?function(n){var t=n.byteLength,r=su?nu(t/Iu):0,e=r*Iu,u=new Je(t);if(r){var o=new su(u,0,r);o.set(new su(n,0,r))}return t!=e&&(o=new cu(u,e),o.set(new cu(n,e))),u}:ke(null));var zu=_u&&iu?function(n){return new Dn(n)}:ke(null),Mu=Cu?function(n){return Cu.get(n)}:Ie,Du=function(){return Wu.funcNames?"constant"==ke.name?At("name"):function(n){for(var t=n.name,r=Su[t],e=r?r.length:0;e--;){var u=r[e],o=u.func;if(null==o||o==n)return u.name}return t}:ke("")}(),Pu=At("length"),qu=tu?function(n){return tu(Ur(n))}:ke([]),Ku=function(){var n=0,t=0;return function(r,e){var u=_o(),o=U-(u-t);if(t=u,o>0){if(++n>=T)return r}else n=0;return Bu(r,e)}}(),Vu=ue(function(n,t){return Io(n)||oe(n)?ft(n,st(t,!1,!0)):[]}),Yu=Qt(),Zu=Qt(!0),Gu=ue(function(t,r){t||(t=[]),r=st(r);var e=rt(t,r);return kt(t,r.sort(n)),e}),Ju=sr(),Xu=sr(!0),Hu=ue(function(n){return Tt(st(n,!1,!0))}),Qu=ue(function(n,t){return Io(n)||oe(n)?ft(n,t):[]}),no=ue(qr),to=ue(function(n,t){var r=n?Pu(n):0;return Er(r)&&(n=Tr(n)),rt(n,st(t))}),ro=Pt(function(n,t,r){Ke.call(n,r)?++n[r]:n[r]=1}),eo=Ht(Nu),uo=Ht(Fu,!0),oo=rr(Kn,Nu),io=rr(function(n,t){for(var r=n.length;r--&&!1!==t(n[r],r,n););return n},Fu),fo=Pt(function(n,t,r){Ke.call(n,r)?n[r].push(t):n[r]=[t]}),ao=Pt(function(n,t,r){n[r]=t}),co=ue(function(n,t,r){var e=-1,u="function"==typeof t,o=kr(t),i=Pu(n),f=Er(i)?Ce(i):[];return Nu(n,function(n){var i=u?t:o&&null!=n&&n[t];f[++e]=i?i.apply(n,r):xr(n,t,r)}),f}),lo=Pt(function(n,t,r){n[r?0:1].push(t)},function(){return[[],[]]}),so=fr(function(n,t,r,e){var u=-1,o=n.length;for(e&&o&&(r=n[++u]);++uu&&(e=u)}return e},!0);return $n.prototype=Ln.prototype,Bn.prototype=Uu(Ln.prototype),Bn.prototype.constructor=Bn,zn.prototype=Uu(Ln.prototype),zn.prototype.constructor=zn,Mn.prototype["delete"]=function(n){return this.has(n)&&delete this.__data__[n]},Mn.prototype.get=function(n){return"__proto__"==n?w:this.__data__[n]},Mn.prototype.has=function(n){return"__proto__"!=n&&Ke.call(this.__data__,n)},Mn.prototype.set=function(n,t){return"__proto__"!=n&&(this.__data__[n]=t),this},Dn.prototype.push=function(n){var t=this.data;"string"==typeof n||ae(n)?t.set.add(n):t.hash[n]=!0},ee.Cache=Mn,$n.after=function(n,t){if("function"!=typeof t){if("function"!=typeof n)throw new Be(L);var r=n;n=t,t=r}return n=vu(n=+n)?n:0,function(){return 1>--n?t.apply(this,arguments):void 0}},$n.ary=function(n,t,r){return r&&jr(n,t,r)&&(t=null),t=n&&null==t?n.length:yu(+t||0,0),pr(n,R,null,null,null,null,t)},$n.assign=Wo,$n.at=to,$n.before=te,$n.bind=vo,$n.bindAll=go,$n.bindKey=yo,$n.callback=je,$n.chain=Vr,$n.chunk=function(n,t,r){t=(r?jr(n,t,r):null==t)?1:yu(+t||1,1),r=0;for(var e=n?n.length:0,u=-1,o=Ce(He(e/t));e>r;)o[++u]=It(n,r,r+=t);return o},$n.compact=function(n){for(var t=-1,r=n?n.length:0,e=-1,u=[];++tr&&(r=-r>u?0:u+r),e=e===w||e>u?u:+e||0,0>e&&(e+=u),u=r>e?0:e>>>0,r>>>=0;u>r;)n[r++]=t;return n},$n.filter=Gr,$n.flatten=function(n,t,r){var e=n?n.length:0;return r&&jr(n,t,r)&&(t=!1),e?st(n,t):[]},$n.flattenDeep=function(n){return n&&n.length?st(n,!0):[]},$n.flow=Ao,$n.flowRight=jo,$n.forEach=oo,$n.forEachRight=io,$n.forIn=Fo,$n.forInRight=$o,$n.forOwn=Lo,$n.forOwnRight=Bo,$n.functions=ve,$n.groupBy=fo,$n.indexBy=ao,$n.initial=function(n){return Lr(n,1)},$n.intersection=function(){for(var n=[],t=-1,e=arguments.length,u=[],o=dr(),i=o==r,f=[];++te)return f;var i=n[0],c=-1,l=i?i.length:0,s=u[0];n:for(;++c(s?Pn(s,a):o(f,a,0))){for(t=e;--t;){var p=u[t];if(0>(p?Pn(p,a):o(n[t],a,0)))continue n}s&&s.push(a),f.push(a)}return f},$n.invert=function(n,t,r){r&&jr(n,t,r)&&(t=null),r=-1;for(var e=zo(n),u=e.length,o={};++rt?0:t)):[]},$n.takeRight=function(n,t,r){var e=n?n.length:0;return e?((r?jr(n,t,r):null==t)&&(t=1),t=e-(+t||0),It(n,0>t?0:t)):[]},$n.takeRightWhile=function(n,t,r){return n&&n.length?Nt(n,yr(t,r,3),!1,!0):[]},$n.takeWhile=function(n,t,r){return n&&n.length?Nt(n,yr(t,r,3)):[]},$n.tap=function(n,t,r){return t.call(r,n),n},$n.throttle=function(n,t,r){var e=!0,u=!0;if("function"!=typeof n)throw new Be(L);return!1===r?e=!1:ae(r)&&(e="leading"in r?!!r.leading:e,u="trailing"in r?!!r.trailing:u),Fn.leading=e,Fn.maxWait=+t,Fn.trailing=u,re(n,t,Fn)},$n.thru=Yr,$n.times=function(n,t,r){if(n=nu(n),1>n||!vu(n))return[];var e=-1,u=Ce(du(n,ku));for(t=Bt(t,r,1);++ee?u[e]=t(e):t(e);return u},$n.toArray=function(n){var t=n?Pu(n):0;return Er(t)?t?qn(n):[]:ye(n)},$n.toPlainObject=_e,$n.transform=function(n,t,r,e){var u=Io(n)||he(n);return t=yr(t,e,4),null==r&&(u||ae(n)?(e=n.constructor,r=u?Io(n)?new e:[]:Uu(Co(e)&&e.prototype)):r={}),(u?Kn:ht)(n,function(n,e,u){return t(r,n,e,u)}),r},$n.union=Hu,$n.uniq=Pr,$n.unzip=qr,$n.values=ye,$n.valuesIn=function(n){return Ut(n,ge(n))},$n.where=function(n,t){return Gr(n,wt(t))},$n.without=Qu,$n.wrap=function(n,t){return t=null==t?Oe:t,pr(t,E,null,[n],[])},$n.xor=function(){for(var n=-1,t=arguments.length;++nr?0:+r||0,e),r-=t.length,r>=0&&n.indexOf(t,r)==r},$n.escape=function(n){return(n=u(n))&&hn.test(n)?n.replace(sn,l):n},$n.escapeRegExp=me,$n.every=Zr,$n.find=eo,$n.findIndex=Yu,$n.findKey=Uo,$n.findLast=uo,$n.findLastIndex=Zu,$n.findLastKey=No,$n.findWhere=function(n,t){return eo(n,wt(t))},$n.first=Br,$n.get=function(n,t,r){return n=null==n?w:gt(n,Nr(t),t+""),n===w?r:n},$n.has=function(n,t){if(null==n)return!1;var r=Ke.call(n,t);return r||kr(t)||(t=Nr(t),n=1==t.length?n:gt(n,It(t,0,-1)),t=Mr(t),r=null!=n&&Ke.call(n,t)),r},$n.identity=Oe,$n.includes=Jr,$n.indexOf=zr,$n.inRange=function(n,t,r){return t=+t||0,"undefined"==typeof r?(r=t,t=0):r=+r||0,n>=du(t,r)&&nr?yu(e+r,0):du(r||0,e-1))+1;else if(r)return u=$t(n,t,!0)-1,n=n[u],(t===t?t===n:n!==n)?u:-1;if(t!==t)return p(n,u,!0);for(;u--;)if(n[u]===t)return u;return-1},$n.max=Qo,$n.min=ni,$n.noConflict=function(){return _._=Ze,this},$n.noop=Ie,$n.now=_o,$n.pad=function(n,t,r){n=u(n),t=+t;var e=n.length;return t>e&&vu(t)?(e=(t-e)/2,t=nu(e),e=He(e),r=cr("",e,r),r.slice(0,t)+n+r):n},$n.padLeft=Vo,$n.padRight=Yo,$n.parseInt=we,$n.random=function(n,t,r){r&&jr(n,t,r)&&(t=r=null);var e=null==n,u=null==t;return null==r&&(u&&"boolean"==typeof n?(r=n,n=1):"boolean"==typeof t&&(r=t,u=!0)),e&&u&&(t=1,u=!1),n=+n||0,u?(t=n,n=0):t=+t||0,r||n%1||t%1?(r=xu(),du(n+r*(t-n+parseFloat("1e-"+((r+"").length-1))),t)):Ot(n,t)},$n.reduce=so,$n.reduceRight=po,$n.repeat=be,$n.result=function(n,t,r){var e=null==n?w:n[t];return e===w&&(null==n||kr(t,n)||(t=Nr(t),n=1==t.length?n:gt(n,It(t,0,-1)),e=null==n?w:n[Mr(t)]),e=e===w?r:e),Co(e)?e.call(n):e},$n.runInContext=m,$n.size=function(n){var t=n?Pu(n):0;return Er(t)?t:zo(n).length},$n.snakeCase=Zo,$n.some=ne,$n.sortedIndex=Ju,$n.sortedLastIndex=Xu,$n.startCase=Go,$n.startsWith=function(n,t,r){return n=u(n),r=null==r?0:du(0>r?0:+r||0,n.length),n.lastIndexOf(t,r)==r},$n.sum=function(n,t,r){r&&jr(n,t,r)&&(t=null);var e=yr(),u=null==t;if(e===ut&&u||(u=!1,t=e(t,r,3)),u){for(n=Io(n)?n:Tr(n),t=n.length,r=0;t--;)r+=+n[t]||0;n=r}else n=Wt(n,t);return n},$n.template=function(n,t,r){var e=$n.templateSettings;r&&jr(n,t,r)&&(t=r=null),n=u(n),t=tt(Tu({},r||t),e,nt),r=tt(Tu({},t.imports),e.imports,nt);var o,i,f=zo(r),a=Ut(r,f),c=0;r=t.interpolate||Rn;var l="__p+='";r=$e((t.escape||Rn).source+"|"+r.source+"|"+(r===gn?jn:Rn).source+"|"+(t.evaluate||Rn).source+"|$","g");var p="sourceURL"in t?"//# sourceURL="+t.sourceURL+"\n":"";if(n.replace(r,function(t,r,e,u,f,a){return e||(e=u),l+=n.slice(c,a).replace(Cn,s),r&&(o=!0,l+="'+__e("+r+")+'"),f&&(i=!0,l+="';"+f+";\n__p+='"),e&&(l+="'+((__t=("+e+"))==null?'':__t)+'"),c=a+t.length,t}),l+="';",(t=t.variable)||(l="with(obj){"+l+"}"),l=(i?l.replace(fn,""):l).replace(an,"$1").replace(cn,"$1;"),l="function("+(t||"obj")+"){"+(t?"":"obj||(obj={});")+"var __t,__p=''"+(o?",__e=_.escape":"")+(i?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+l+"return __p}",t=Jo(function(){return Te(f,p+"return "+l).apply(w,a)}),t.source=l,fe(t))throw t;return t},$n.trim=xe,$n.trimLeft=function(n,t,r){var e=n;return(n=u(n))?n.slice((r?jr(e,t,r):null==t)?g(n):i(n,t+"")):n},$n.trimRight=function(n,t,r){var e=n;return(n=u(n))?(r?jr(e,t,r):null==t)?n.slice(0,y(n)+1):n.slice(0,f(n,t+"")+1):n},$n.trunc=function(n,t,r){r&&jr(n,t,r)&&(t=null);var e=S;if(r=W,null!=t)if(ae(t)){var o="separator"in t?t.separator:o,e="length"in t?+t.length||0:e;r="omission"in t?u(t.omission):r}else e=+t||0;if(n=u(n),e>=n.length)return n;if(e-=r.length,1>e)return r;if(t=n.slice(0,e),null==o)return t+r;if(se(o)){if(n.slice(e).search(o)){var i,f=n.slice(0,e);for(o.global||(o=$e(o.source,(kn.exec(o)||"")+"g")),o.lastIndex=0;n=o.exec(f);)i=n.index;t=t.slice(0,null==i?e:i)}}else n.indexOf(o,e)!=e&&(o=t.lastIndexOf(o),o>-1&&(t=t.slice(0,o)));return t+r},$n.unescape=function(n){return(n=u(n))&&pn.test(n)?n.replace(ln,d):n},$n.uniqueId=function(n){var t=++Ve;return u(n)+t},$n.words=Ae,$n.all=Zr,$n.any=ne,$n.contains=Jr,$n.detect=eo,$n.foldl=so,$n.foldr=po,$n.head=Br,$n.include=Jr,$n.inject=so,Ee($n,function(){var n={};return ht($n,function(t,r){$n.prototype[r]||(n[r]=t)}),n}(),!1),$n.sample=Hr,$n.prototype.sample=function(n){return this.__chain__||null!=n?this.thru(function(t){return Hr(t,n)}):Hr(this.value())},$n.VERSION=b,Kn("bind bindKey curry curryRight partial partialRight".split(" "),function(n){$n[n].placeholder=$n}),Kn(["dropWhile","filter","map","takeWhile"],function(n,t){var r=t!=$,e=t==N;zn.prototype[n]=function(n,u){var o=this.__filtered__,i=o&&e?new zn(this):this.clone();return(i.__iteratees__||(i.__iteratees__=[])).push({done:!1,count:0,index:0,iteratee:yr(n,u,1),limit:-1,type:t}),i.__filtered__=o||r,i}}),Kn(["drop","take"],function(n,t){var r=n+"While";zn.prototype[n]=function(r){var e=this.__filtered__,u=e&&!t?this.dropWhile():this.clone();return r=null==r?1:yu(nu(r)||0,0),e?t?u.__takeCount__=du(u.__takeCount__,r):Mr(u.__iteratees__).limit=r:(u.__views__||(u.__views__=[])).push({size:r,type:n+(0>u.__dir__?"Right":"")}),u},zn.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse()},zn.prototype[n+"RightWhile"]=function(n,t){return this.reverse()[r](n,t).reverse()}}),Kn(["first","last"],function(n,t){var r="take"+(t?"Right":"");zn.prototype[n]=function(){return this[r](1).value()[0]}}),Kn(["initial","rest"],function(n,t){var r="drop"+(t?"":"Right");zn.prototype[n]=function(){return this[r](1)}}),Kn(["pluck","where"],function(n,t){var r=t?"filter":"map",e=t?wt:Re;zn.prototype[n]=function(n){return this[r](e(n))}}),zn.prototype.compact=function(){return this.filter(Oe)},zn.prototype.reject=function(n,t){return n=yr(n,t,1),this.filter(function(t){return!n(t)})},zn.prototype.slice=function(n,t){n=null==n?0:+n||0;var r=0>n?this.takeRight(-n):this.drop(n);return t!==w&&(t=+t||0,r=0>t?r.dropRight(-t):r.take(t-n)),r},zn.prototype.toArray=function(){return this.drop(0)},ht(zn.prototype,function(n,t){var r=$n[t];if(r){var e=/^(?:filter|map|reject)|While$/.test(t),u=/^(?:first|last)$/.test(t);$n.prototype[t]=function(){function t(n){return n=[n],eu.apply(n,o),r.apply($n,n)}var o=arguments,i=this.__chain__,f=this.__wrapped__,a=!!this.__actions__.length,c=f instanceof zn,l=o[0],s=c||Io(f);return s&&e&&"function"==typeof l&&1!=l.length&&(c=s=!1),c=c&&!a,u&&!i?c?n.call(f):r.call($n,this.value()):s?(f=n.apply(c?f:new zn(this),o),u||!a&&!f.__actions__||(f.__actions__||(f.__actions__=[])).push({func:Yr,args:[t],thisArg:$n}),new Bn(f,i)):this.thru(t)}}}),Kn("concat join pop push replace shift sort splice split unshift".split(" "),function(n){var t=(/^(?:replace|split)$/.test(n)?De:ze)[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:join|pop|replace|shift)$/.test(n);$n.prototype[n]=function(){var n=arguments;return e&&!this.__chain__?t.apply(this.value(),n):this[r](function(r){return t.apply(r,n)})}}),ht(zn.prototype,function(n,t){var r=$n[t];if(r){var e=r.name;(Su[e]||(Su[e]=[])).push({name:t,func:r})}}),Su[ar(null,A).name]=[{name:"wrapper",func:null}],zn.prototype.clone=function(){var n=this.__actions__,t=this.__iteratees__,r=this.__views__,e=new zn(this.__wrapped__);return e.__actions__=n?qn(n):null,e.__dir__=this.__dir__,e.__filtered__=this.__filtered__,e.__iteratees__=t?qn(t):null,e.__takeCount__=this.__takeCount__,e.__views__=r?qn(r):null,e},zn.prototype.reverse=function(){if(this.__filtered__){var n=new zn(this);n.__dir__=-1,n.__filtered__=!0}else n=this.clone(),n.__dir__*=-1;return n},zn.prototype.value=function(){var n=this.__wrapped__.value();if(!Io(n))return Ft(n,this.__actions__);var t,r=this.__dir__,e=0>r;t=n.length;for(var u=this.__views__,o=0,i=-1,f=u?u.length:0;++ia;){for(var u=u+r,l=-1,s=n[u];++lp.index:u-1?p.count++>=_:!h(s))))continue n}else if(p=h(s),_==$)s=p;else if(!p){if(_==F)continue n;break n}}c[a++]=s}return c},$n.prototype.chain=function(){return Vr(this)},$n.prototype.commit=function(){return new Bn(this.value(),this.__chain__)},$n.prototype.plant=function(n){for(var t,r=this;r instanceof Ln;){var e=Fr(r);t?u.__wrapped__=e:t=e;var u=e,r=r.__wrapped__}return u.__wrapped__=n,t},$n.prototype.reverse=function(){var n=this.__wrapped__;return n instanceof zn?(this.__actions__.length&&(n=new zn(this)),new Bn(n.reverse(),this.__chain__)):this.thru(function(n){return n.reverse()})},$n.prototype.toString=function(){return this.value()+""},$n.prototype.run=$n.prototype.toJSON=$n.prototype.valueOf=$n.prototype.value=function(){return Ft(this.__wrapped__,this.__actions__)},$n.prototype.collect=$n.prototype.map,$n.prototype.head=$n.prototype.first,$n.prototype.select=$n.prototype.filter,$n.prototype.tail=$n.prototype.rest,$n}var w,b="3.7.0",x=1,A=2,j=4,k=8,O=16,E=32,I=64,R=128,C=256,S=30,W="...",T=150,U=16,N=0,F=1,$=2,L="Expected a function",B="__lodash_placeholder__",z="[object Arguments]",M="[object Array]",D="[object Boolean]",P="[object Date]",q="[object Error]",K="[object Function]",V="[object Number]",Y="[object Object]",Z="[object RegExp]",G="[object String]",J="[object ArrayBuffer]",X="[object Float32Array]",H="[object Float64Array]",Q="[object Int8Array]",nn="[object Int16Array]",tn="[object Int32Array]",rn="[object Uint8Array]",en="[object Uint8ClampedArray]",un="[object Uint16Array]",on="[object Uint32Array]",fn=/\b__p\+='';/g,an=/\b(__p\+=)''\+/g,cn=/(__e\(.*?\)|\b__t\))\+'';/g,ln=/&(?:amp|lt|gt|quot|#39|#96);/g,sn=/[&<>"'`]/g,pn=RegExp(ln.source),hn=RegExp(sn.source),_n=/<%-([\s\S]+?)%>/g,vn=/<%([\s\S]+?)%>/g,gn=/<%=([\s\S]+?)%>/g,yn=/\.|\[(?:[^[\]]+|(["'])(?:(?!\1)[^\n\\]|\\.)*?)\1\]/,dn=/^\w*$/,mn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g,wn=/[.*+?^${}()|[\]\/\\]/g,bn=RegExp(wn.source),xn=/[\u0300-\u036f\ufe20-\ufe23]/g,An=/\\(\\)?/g,jn=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,kn=/\w*$/,On=/^0[xX]/,En=/^\[object .+?Constructor\]$/,In=/[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g,Rn=/($^)/,Cn=/['\n\r\u2028\u2029\\]/g,Sn=RegExp("[A-Z\\xc0-\\xd6\\xd8-\\xde]+(?=[A-Z\\xc0-\\xd6\\xd8-\\xde][a-z\\xdf-\\xf6\\xf8-\\xff]+)|[A-Z\\xc0-\\xd6\\xd8-\\xde]?[a-z\\xdf-\\xf6\\xf8-\\xff]+|[A-Z\\xc0-\\xd6\\xd8-\\xde]+|[0-9]+","g"),Wn=" \f \ufeff\n\r\u2028\u2029 ",Tn="Array ArrayBuffer Date Error Float32Array Float64Array Function Int8Array Int16Array Int32Array Math Number Object RegExp Set String _ clearTimeout document isFinite parseInt setTimeout TypeError Uint8Array Uint8ClampedArray Uint16Array Uint32Array WeakMap window".split(" "),Un={};
-Un[X]=Un[H]=Un[Q]=Un[nn]=Un[tn]=Un[rn]=Un[en]=Un[un]=Un[on]=!0,Un[z]=Un[M]=Un[J]=Un[D]=Un[P]=Un[q]=Un[K]=Un["[object Map]"]=Un[V]=Un[Y]=Un[Z]=Un["[object Set]"]=Un[G]=Un["[object WeakMap]"]=!1;var Nn={};Nn[z]=Nn[M]=Nn[J]=Nn[D]=Nn[P]=Nn[X]=Nn[H]=Nn[Q]=Nn[nn]=Nn[tn]=Nn[V]=Nn[Y]=Nn[Z]=Nn[G]=Nn[rn]=Nn[en]=Nn[un]=Nn[on]=!0,Nn[q]=Nn[K]=Nn["[object Map]"]=Nn["[object Set]"]=Nn["[object WeakMap]"]=!1;var Fn={leading:!1,maxWait:0,trailing:!1},$n={"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss"},Ln={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},Bn={"&":"&","<":"<",">":">",""":'"',"'":"'","`":"`"},zn={"function":!0,object:!0},Mn={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Dn=zn[typeof exports]&&exports&&!exports.nodeType&&exports,Pn=zn[typeof module]&&module&&!module.nodeType&&module,qn=zn[typeof self]&&self&&self.Object&&self,Kn=zn[typeof window]&&window&&window.Object&&window,Vn=Pn&&Pn.exports===Dn&&Dn,Yn=Dn&&Pn&&"object"==typeof global&&global&&global.Object&&global||Kn!==(this&&this.window)&&Kn||qn||this,Zn=m();"function"==typeof define&&"object"==typeof define.amd&&define.amd?(Yn._=Zn,define(function(){return Zn})):Dn&&Pn?Vn?(Pn.exports=Zn)._=Zn:Dn._=Zn:Yn._=Zn}.call(this),angular.module("mc.resizer",[]).directive("resizer",function($document){return function($scope,$element,$attrs){function mousemove(event){if("vertical"==$attrs.resizer){var x=event.pageX;$attrs.resizerMax&&x>$attrs.resizerMax&&(x=parseInt($attrs.resizerMax)),$element.css({left:x+"px"}),$($attrs.resizerLeft).css({width:x+"px"}),$($attrs.resizerRight).css({left:x+parseInt($attrs.resizerWidth)+"px"})}else{var y=window.innerHeight-event.pageY;$element.css({bottom:y+"px"}),$($attrs.resizerTop).css({bottom:y+parseInt($attrs.resizerHeight)+"px"}),$($attrs.resizerBottom).css({height:y+"px"})}}function mouseup(){$document.unbind("mousemove",mousemove),$document.unbind("mouseup",mouseup)}$element.on("mousedown",function(event){event.preventDefault(),$document.on("mousemove",mousemove),$document.on("mouseup",mouseup)})}});var treeherder=angular.module("treeherder",["ngResource","ngSanitize","ngCookies","LocalStorageModule"]),logViewerApp=angular.module("logviewer",["treeherder"]);logViewerApp.config(function($compileProvider){$compileProvider.debugInfoEnabled(!1)}),treeherder.provider("thServiceDomain",function(){this.$get=function(){return window.thServiceDomain?window.thServiceDomain:""}}),treeherder.provider("thResultStatusList",function(){var all=function(){return["success","testfailed","busted","exception","retry","usercancel","running","pending","coalesced"]},defaultFilters=function(){return["success","testfailed","busted","exception","retry","usercancel","running","pending"]};this.$get=function(){return{all:all,defaultFilters:defaultFilters}}}),treeherder.provider("thResultStatus",function(){this.$get=function(){return function(job){return"completed"===job.state?job.result:null!==job.job_coalesced_to_guid?"coalesced":job.state}}}),treeherder.provider("thResultStatusObject",function(){var getResultStatusObject=function(){return{running:0,pending:0,completed:0}};this.$get=function(){return{getResultStatusObject:getResultStatusObject}}}),treeherder.provider("thResultStatusInfo",function(){this.$get=function(){return function(resultState){var resultStatusInfo={severity:100,btnClass:"btn-default",jobButtonIcon:""};switch(resultState){case"busted":resultStatusInfo={severity:1,btnClass:"btn-red",btnClassClassified:"btn-red-classified",jobButtonIcon:"glyphicon glyphicon-fire",countText:"busted"};break;case"exception":resultStatusInfo={severity:2,btnClass:"btn-purple",btnClassClassified:"btn-purple-classified",jobButtonIcon:"glyphicon glyphicon-fire",countText:"exception"};break;case"testfailed":resultStatusInfo={severity:3,btnClass:"btn-orange",btnClassClassified:"btn-orange-classified",jobButtonIcon:"glyphicon glyphicon-warning-sign",countText:"failed"};break;case"unknown":resultStatusInfo={severity:4,btnClass:"btn-black",btnClassClassified:"btn-black-classified",jobButtonIcon:"",countText:"unknown"};break;case"usercancel":resultStatusInfo={severity:5,btnClass:"btn-pink",jobButtonIcon:"",countText:"cancel"};break;case"retry":resultStatusInfo={severity:6,btnClass:"btn-dkblue",jobButtonIcon:"",countText:"retry"};break;case"success":resultStatusInfo={severity:7,btnClass:"btn-green",jobButtonIcon:"",countText:"success"};break;case"running":resultStatusInfo={severity:8,btnClass:"btn-dkgray",jobButtonIcon:"",countText:"running"};break;case"pending":resultStatusInfo={severity:100,btnClass:"btn-ltgray",jobButtonIcon:"",countText:"pending"};break;case"coalesced":resultStatusInfo={severity:101,btnClass:"btn-yellow",jobButtonIcon:"",countText:"coalesced"}}return resultStatusInfo}}}),treeherder.provider("thEvents",function(){this.$get=function(){return{revisionsLoaded:"revisions-loaded-EVT",jobClick:"job-click-EVT",jobDetailLoaded:"job-detail-loaded-EVT",jobPin:"job-pin-EVT",jobRetrigger:"job-retrigger-EVT",jobContextMenu:"job-context-menu-EVT",jobsClassified:"jobs-classified-EVT",bugsAssociated:"bugs-associated-EVT",jobsLoaded:"jobs-loaded-EVT",clearSelectedJob:"clear-selected-job-EVT",globalFilterChanged:"status-filter-changed-EVT",toggleRevisions:"toggle-revisions-EVT",toggleAllRevisions:"toggle-all-revisions-EVT",toggleUnclassifiedFailures:"toggle-unclassified-failures-EVT",changeSelection:"next-previous-job-EVT",addRelatedBug:"add-related-bug-EVT",saveClassification:"save-classification-EVT",deleteClassification:"delete-classification-EVT",clearPinboard:"clear-pinboard-EVT",searchPage:"search-page-EVT",selectJob:"select-job-EVT",mapResultSetJobs:"map-result-set-jobs-EVT",applyNewJobs:"apply-new-jobs-EVT",initSheriffPanel:"init-sheriff-panel-EVT",openLogviewer:"open-logviewer-EVT"}}}),treeherder.provider("thAggregateIds",function(){var escape=function(id){return id.replace(/(:|\[|\]|\?|,|\.|\s+)/g,"-")},getPlatformRowId=function(repoName,resultsetId,platformName,platformOptions){return escape(repoName+resultsetId+platformName+platformOptions)},getResultsetTableId=function(repoName,resultsetId,revision){return escape(repoName+resultsetId+revision)};this.$get=function(){return{getPlatformRowId:getPlatformRowId,getResultsetTableId:getResultsetTableId}}}),treeherder.provider("thReftestStatus",function(){this.$get=function(){return function(job){return job.job_group_name?-1!==job.job_group_name.toLowerCase().indexOf("reftest"):void 0}}}),treeherder.value("thPlatformNameMap",{linux32:"Linux",linux64:"Linux x64","osx-10-6":"OS X 10.6","osx-10-7":"OS X 10.7","osx-10-8":"OS X 10.8","osx-10-9":"OS X 10.9","osx-10-10":"OS X 10.10",windowsxp:"Windows XP","windows7-32":"Windows 7","windows7-64":"Windows 7 x64","windows8-32":"Windows 8","windows8-64":"Windows 8 x64","windows2012-64":"Windows 2012 x64","android-2-2-armv6":"Android 2.2 Armv6","android-2-2":"Android 2.2","android-2-3-armv6":"Android 2.3 Armv6","android-2-3":"Android 2.3","android-2-3-armv7-api9":"Android 2.3 API9","android-4-0":"Android 4.0","android-4-0-armv7-api10":"Android 4.0 API10+","android-4-0-armv7-api11":"Android 4.0 API11+","android-4-2-x86":"Android 4.2 x86","android-4-2":"Android 4.2","android-4-2-armv7-api11":"Android 4.2 API11+","android-4-3":"Android 4.3","android-4-3-armv7-api11":"Android 4.3 API11+","android-4-4":"Android 4.4","android-4-4-armv7-api11":"Android 4.4 API11+","android-5-0-armv7-api11":"Android 5.0 API11+","b2g-linux32":"B2G Desktop Linux","b2g-linux64":"B2G Desktop Linux x64","b2g-osx":"B2G Desktop OS X","b2g-win32":"B2G Desktop Windows","b2g-emu-ics":"B2G ICS Emulator","b2g-emu-jb":"B2G JB Emulator","b2g-emu-kk":"B2G KK Emulator","b2g-emu-l":"B2G L Emulator","b2g-device-image":"B2G Device Image","mulet-linux32":"Mulet Linux","mulet-linux64":"Mulet Linux x64","mulet-osx":"Mulet OS X","mulet-win32":"Mulet Windows","graphene-linux64":"Graphene Linux x64","graphene-osx":"Graphene OS X","graphene-win64":"Graphene Windows x64","horizon-linux64":"Horizon Linux x64","horizon-osx":"Horizon OS X","horizon-win64":"Horizon Windows x64",other:"Other"}),treeherder.value("thPlatformOrder",{linux32:0,linux64:1,"osx-10-6":10,"osx-10-7":11,"osx-10-8":12,"osx-10-9":13,"osx-10-10":14,windowsxp:20,"windows7-32":21,"windows7-64":22,"windows8-32":23,"windows8-64":24,"windows2012-64":25,"android-2-2-armv6":30,"android-2-2":31,"android-2-3-armv6":32,"android-2-3":33,"android-2-3-armv7-api9":34,"android-4-0":35,"android-4-0-armv7-api10":36,"android-4-0-armv7-api11":37,"android-4-2-x86":38,"android-4-2":39,"android-4-2-armv7-api11":40,"android-4-3":41,"android-4-3-armv7-api11":42,"android-4-4":43,"android-4-4-armv7-api11":44,"android-5-0-armv7-api11":45,"b2g-linux32":50,"b2g-linux64":51,"b2g-osx":52,"b2g-win32":53,"b2g-emu-ics":54,"b2g-emu-jb":55,"b2g-emu-kk":56,"b2g-emu-l":57,"b2g-device-image":58,"mulet-linux32":60,"mulet-linux64":61,"mulet-osx":62,"mulet-win32":63,"graphene-linux64":71,"graphene-osx":72,"graphene-win64":73,"horizon-linux64":74,"horizon-osx":75,"horizon-win64":76,other:99}),treeherder.value("thOptionOrder",{opt:0,pgo:1,asan:2,debug:3,cc:4}),treeherder.value("thFailureResults",["testfailed","busted","exception"]),treeherder.value("thFavicons",{closed:"img/tree_closed.png",open:"img/tree_open.png","approval required":"img/tree_open.png",unavailable:"img/tree_open.png"}),treeherder.value("thRepoGroupOrder",{development:1,"project repositories":2,"try":3,"release-stabilization":4,taskcluster:5,"qa automation tests":6}),treeherder.value("thDefaultRepo","mozilla-inbound"),treeherder.value("thDateFormat","EEE MMM d, H:mm:ss"),treeherder.value("phTimeRanges",[{value:86400,text:"Last day"},{value:604800,text:"Last 7 days"},{value:1209600,text:"Last 14 days"},{value:2592e3,text:"Last 30 days"},{value:5184e3,text:"Last 60 days"},{value:7776e3,text:"Last 90 days"},{value:31536e3,text:"Last year"}]),treeherder.value("thJobNavSelectors",{ALL_JOBS:{name:"jobs",selector:".job-btn"},UNCLASSIFIED_FAILURES:{name:"unclassified failures",selector:".selected-job, .job-btn.btn-red, .job-btn.btn-orange, .job-btn.btn-purple"}}),treeherder.directive("lvInfiniteScroll",["$timeout","$parse",function($timeout,$parse){return function(scope,element,attr){element.bind("scroll",function(){var raw=element[0],sh=raw.scrollHeight;raw.scrollTop<=100?scope.loadMore({top:!0},raw).then(function(haltScrollTop){haltScrollTop||$timeout(function(){raw.scrollTop=raw.scrollHeight-sh})}):raw.scrollTop>=raw.scrollHeight-$(element).height()-100&&scope.loadMore({bottom:!0},raw)})}}]),treeherder.directive("lvLogLines",["$timeout","$parse",function($timeout){function getOffsetOfStep(order){var el=$('.logviewer-step[order="'+order+'"]'),parentOffset=el.parent().offset();return el.offset().top-parentOffset.top+el.parent().scrollTop()-parseInt($(".steps-data").first().css("padding-bottom"))}function onScroll($scope){for(var lines=$(".lv-log-line"),scrollTop=$(".lv-log-container").scrollTop(),i=0,l=lines.length;l>i;i++)if(lines[i].offsetTop>scrollTop)for(var steps=$scope.artifact.step_data.steps,lineNumber=+$(lines[i]).attr("line"),j=0,ll=steps.length;ll>j;j++)if(lineNumber>steps[j].started_linenumber-1&&lineNumbermaxNsNotifications)return void $timeout(thNotify.shift);$timeout(thNotify.shift,4e3,!0)}},shift:function(){for(var i=0;i0?_.map(response.data.revisions,function(r){return r.revision}):$q.reject("No revisions found for result set "+resultSetId+" in project "+projectName)})},getResultSetsFromRevision:function(projectName,revision){return $http.get(thUrl.getProjectUrl("/resultset/?revision="+revision,projectName),{cache:!0}).then(function(response){return response.data.results.length>0?response.data.results:$q.reject("No results found for revision "+revision+" on project "+projectName)})},cancelAll:function(resultset_id,repoName){var uri=resultset_id+"/cancel_all/";return $http.post(thUrl.getProjectUrl("/resultset/",repoName)+uri)},triggerMissingJobs:function(resultset_id,repoName){var uri=resultset_id+"/trigger_missing_jobs/";return $http.post(thUrl.getProjectUrl("/resultset/",repoName)+uri)}}}]),treeherder.factory("ThLogSliceModel",["$http","$q","$timeout","thUrl",function($http,$q,$timeout,thUrl){var ThLogSliceModel=function(job_id,buffer_chunk_size,buffer_size){this.job_id=job_id,this.chunk_size=buffer_chunk_size||500,this.buffer_size=buffer_size||10,this.buffer={}};return ThLogSliceModel.get_uri=function(){return thUrl.getProjectUrl("/logslice/")},ThLogSliceModel.prototype.find_in_buffer=function(options){for(var arr,ret=[],i=options.start_line;ithis.buffer_size;){size=0;var indexLRU=0,baseDate=Date.now();for(var k in this.buffer)this.buffer.hasOwnProperty(k)&&(size++,this.buffer[k].usedthis.buffer_size&&delete this.buffer[indexLRU]}},ThLogSliceModel.prototype.get_line_range=function(options,config){config=config||{};var timeout=config.timeout||null,found=this.find_in_buffer(options),self=this,deferred=$q.defer();return found?(deferred.resolve(found),deferred.promise):$http.get(ThLogSliceModel.get_uri(),{params:options,timeout:timeout}).then(function(res){return self.insert_into_buffer(options,res.data),res.data},function(res){return $q.reject("Log not found")})},ThLogSliceModel}]),logViewerApp.controller("LogviewerCtrl",["$anchorScroll","$http","$location","$q","$rootScope","$scope","$timeout","ThJobArtifactModel","ThLog","ThLogSliceModel","ThJobModel","dateFilter","thJobSearchStr","ThResultSetModel","thDateFormat","thReftestStatus",function($anchorScroll,$http,$location,$q,$rootScope,$scope,$timeout,ThJobArtifactModel,ThLog,ThLogSliceModel,ThJobModel,dateFilter,thJobSearchStr,ThResultSetModel,thDateFormat,thReftestStatus){function logFileLineCount(){var steps=$scope.artifact.step_data.steps;return steps[steps.length-1].finished_linenumber}function moveLineNumber(bounds){var newLine,lines=$scope.displayedLogLines;return bounds.top?lines[0].index:bounds.bottom?(newLine=lines[lines.length-1].index+1,newLine>logFileLineCount()?logFileLineCount():newLine):$scope.currentLineNumber}function drawErrorLines(data){if(0!==data.length){var min=data[0].index,max=data[data.length-1].index;$scope.artifact.step_data.steps.forEach(function(step){step.errors.forEach(function(err){var line=err.linenumber;if(!(min>line||line>max)){var index=line-min;data[index].hasError=!0}})})}}function getChunksSurrounding(line){var request={start:null,end:null};return getChunkContaining(line,request),getChunkAbove(request),getChunkBelow(request),request}function getChunkContaining(line,request){var index=Math.floor(line/LINE_BUFFER_SIZE);request.start=index*LINE_BUFFER_SIZE,request.end=(index+1)*LINE_BUFFER_SIZE}function getChunkAbove(request){return request.start-=LINE_BUFFER_SIZE,request.start=Math.floor(request.start/LINE_BUFFER_SIZE)*LINE_BUFFER_SIZE,request.start>=0?!0:(request.start=0,!1)}function getChunkBelow(request){var lastLine=logFileLineCount();return request.end+=LINE_BUFFER_SIZE,request.end=Math.ceil(request.end/LINE_BUFFER_SIZE)*LINE_BUFFER_SIZE,request.end<=lastLine?!0:(request.end=lastLine,!1)}function removeChunkAbove(request){$scope.displayedLogLines=$scope.displayedLogLines.slice(LINE_BUFFER_SIZE)}function removeChunkBelow(request){var endSlice=$scope.displayedLogLines.length-LINE_BUFFER_SIZE;$scope.displayedLogLines=$scope.displayedLogLines.slice(0,endSlice)}var LogSlice,$log=new ThLog("LogviewerCtrl"),LINE_BUFFER_SIZE=100;$rootScope.urlBasePath=$location.absUrl().split("logviewer")[0];var query_string=$location.search();""!==query_string.repo&&($rootScope.repoName=query_string.repo),""!==query_string.job_id&&($scope.job_id=query_string.job_id,LogSlice=new ThLogSliceModel($scope.job_id,LINE_BUFFER_SIZE)),$scope.displayedLogLines=[],$scope.loading=!1,$scope.logError=!1,$scope.currentLineNumber=0,$scope.highestLine=0,$scope.showSuccessful=!0,$scope.$watch("artifact",function(){$scope.artifact&&($scope.showSuccessful=!$scope.hasFailedSteps())}),$scope.hasFailedSteps=function(){for(var steps=$scope.artifact.step_data.steps,i=0;i=0;i--)$scope.displayedLogLines[0].index===data[i].index+1&&$scope.displayedLogLines.unshift(data[i]);$timeout(function(){above&&removeChunkBelow()},100)}else if(bounds.bottom){for(var sh=element.scrollHeight,lines=$scope.displayedLogLines,j=0;j0?h+"h ":"")+(m>0?m+"m ":"")+(s>0?s+"s ":"")+(ms>0?ms+"ms ":"00ms")},$scope.displayTime=function(started,finished){var start=started.substr(started.indexOf(" ")+1,8),end=finished.substr(finished.indexOf(" ")+1,8);
-return start+"-"+end},$scope.init=function(){$scope.logProperties=[],ThJobModel.get($scope.repoName,$scope.job_id).then(function(job){var jobStr=thJobSearchStr(job);$scope.logViewerTitle="Log for "+jobStr,$scope.result={label:"Result",value:job.result},$scope.resultStatusShading=$scope.getShadingClass(job.result),$scope.logProperties=[{label:"Job",value:jobStr},{label:"Machine",value:job.machine_name},{label:"Start",value:dateFilter(1e3*job.start_timestamp,thDateFormat)},{label:"End",value:dateFilter(1e3*job.end_timestamp,thDateFormat)}],$scope.isReftest=function(){return job.job_group_name?thReftestStatus(job):void 0},ThResultSetModel.getResultSet($scope.repoName,job.result_set_id).then(function(data){var revision=data.data.revision;$scope.logProperties.push({label:"Revision",value:revision}),$scope.logRevisionFilterUrl=$scope.urlBasePath+"#/jobs?repo="+$scope.repoName+"&revision="+revision})}),$log.debug(ThJobArtifactModel.get_uri()),ThJobArtifactModel.get_list({job_id:$scope.job_id,name:"text_log_summary"}).then(function(artifactList){artifactList.length>0&&($scope.artifact=artifactList[0].blob)})}}]);angular.module('logviewer').run(['$templateCache', function($templateCache) {
+Un[X]=Un[H]=Un[Q]=Un[nn]=Un[tn]=Un[rn]=Un[en]=Un[un]=Un[on]=!0,Un[z]=Un[M]=Un[J]=Un[D]=Un[P]=Un[q]=Un[K]=Un["[object Map]"]=Un[V]=Un[Y]=Un[Z]=Un["[object Set]"]=Un[G]=Un["[object WeakMap]"]=!1;var Nn={};Nn[z]=Nn[M]=Nn[J]=Nn[D]=Nn[P]=Nn[X]=Nn[H]=Nn[Q]=Nn[nn]=Nn[tn]=Nn[V]=Nn[Y]=Nn[Z]=Nn[G]=Nn[rn]=Nn[en]=Nn[un]=Nn[on]=!0,Nn[q]=Nn[K]=Nn["[object Map]"]=Nn["[object Set]"]=Nn["[object WeakMap]"]=!1;var Fn={leading:!1,maxWait:0,trailing:!1},$n={"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss"},Ln={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},Bn={"&":"&","<":"<",">":">",""":'"',"'":"'","`":"`"},zn={"function":!0,object:!0},Mn={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Dn=zn[typeof exports]&&exports&&!exports.nodeType&&exports,Pn=zn[typeof module]&&module&&!module.nodeType&&module,qn=zn[typeof self]&&self&&self.Object&&self,Kn=zn[typeof window]&&window&&window.Object&&window,Vn=Pn&&Pn.exports===Dn&&Dn,Yn=Dn&&Pn&&"object"==typeof global&&global&&global.Object&&global||Kn!==(this&&this.window)&&Kn||qn||this,Zn=m();"function"==typeof define&&"object"==typeof define.amd&&define.amd?(Yn._=Zn,define(function(){return Zn})):Dn&&Pn?Vn?(Pn.exports=Zn)._=Zn:Dn._=Zn:Yn._=Zn}.call(this),angular.module("mc.resizer",[]).directive("resizer",function($document){return function($scope,$element,$attrs){function mousemove(event){if("vertical"==$attrs.resizer){var x=event.pageX;$attrs.resizerMax&&x>$attrs.resizerMax&&(x=parseInt($attrs.resizerMax)),$element.css({left:x+"px"}),$($attrs.resizerLeft).css({width:x+"px"}),$($attrs.resizerRight).css({left:x+parseInt($attrs.resizerWidth)+"px"})}else{var y=window.innerHeight-event.pageY;$element.css({bottom:y+"px"}),$($attrs.resizerTop).css({bottom:y+parseInt($attrs.resizerHeight)+"px"}),$($attrs.resizerBottom).css({height:y+"px"})}}function mouseup(){$document.unbind("mousemove",mousemove),$document.unbind("mouseup",mouseup)}$element.on("mousedown",function(event){event.preventDefault(),$document.on("mousemove",mousemove),$document.on("mouseup",mouseup)})}});var treeherder=angular.module("treeherder",["ngResource","ngSanitize","ngCookies","LocalStorageModule"]),logViewerApp=angular.module("logviewer",["treeherder"]);logViewerApp.config(function($compileProvider){$compileProvider.debugInfoEnabled(!1)}),treeherder.provider("thServiceDomain",function(){this.$get=function(){return window.thServiceDomain?window.thServiceDomain:""}}),treeherder.provider("thResultStatusList",function(){var all=function(){return["success","testfailed","busted","exception","retry","usercancel","running","pending","coalesced"]},defaultFilters=function(){return["success","testfailed","busted","exception","retry","usercancel","running","pending"]};this.$get=function(){return{all:all,defaultFilters:defaultFilters}}}),treeherder.provider("thResultStatus",function(){this.$get=function(){return function(job){return"completed"===job.state?job.result:null!==job.job_coalesced_to_guid?"coalesced":job.state}}}),treeherder.provider("thResultStatusObject",function(){var getResultStatusObject=function(){return{running:0,pending:0,completed:0}};this.$get=function(){return{getResultStatusObject:getResultStatusObject}}}),treeherder.provider("thResultStatusInfo",function(){this.$get=function(){return function(resultState){var resultStatusInfo={severity:100,btnClass:"btn-default",jobButtonIcon:""};switch(resultState){case"busted":resultStatusInfo={severity:1,btnClass:"btn-red",btnClassClassified:"btn-red-classified",jobButtonIcon:"glyphicon glyphicon-fire",countText:"busted"};break;case"exception":resultStatusInfo={severity:2,btnClass:"btn-purple",btnClassClassified:"btn-purple-classified",jobButtonIcon:"glyphicon glyphicon-fire",countText:"exception"};break;case"testfailed":resultStatusInfo={severity:3,btnClass:"btn-orange",btnClassClassified:"btn-orange-classified",jobButtonIcon:"glyphicon glyphicon-warning-sign",countText:"failed"};break;case"unknown":resultStatusInfo={severity:4,btnClass:"btn-black",btnClassClassified:"btn-black-classified",jobButtonIcon:"",countText:"unknown"};break;case"usercancel":resultStatusInfo={severity:5,btnClass:"btn-pink",jobButtonIcon:"",countText:"cancel"};break;case"retry":resultStatusInfo={severity:6,btnClass:"btn-dkblue",jobButtonIcon:"",countText:"retry"};break;case"success":resultStatusInfo={severity:7,btnClass:"btn-green",jobButtonIcon:"",countText:"success"};break;case"running":resultStatusInfo={severity:8,btnClass:"btn-dkgray",jobButtonIcon:"",countText:"running"};break;case"pending":resultStatusInfo={severity:100,btnClass:"btn-ltgray",jobButtonIcon:"",countText:"pending"};break;case"coalesced":resultStatusInfo={severity:101,btnClass:"btn-yellow",jobButtonIcon:"",countText:"coalesced"}}return resultStatusInfo}}}),treeherder.provider("thEvents",function(){this.$get=function(){return{revisionsLoaded:"revisions-loaded-EVT",jobClick:"job-click-EVT",jobDetailLoaded:"job-detail-loaded-EVT",jobPin:"job-pin-EVT",jobRetrigger:"job-retrigger-EVT",jobContextMenu:"job-context-menu-EVT",jobsClassified:"jobs-classified-EVT",bugsAssociated:"bugs-associated-EVT",jobsLoaded:"jobs-loaded-EVT",clearSelectedJob:"clear-selected-job-EVT",globalFilterChanged:"status-filter-changed-EVT",toggleRevisions:"toggle-revisions-EVT",toggleAllRevisions:"toggle-all-revisions-EVT",toggleUnclassifiedFailures:"toggle-unclassified-failures-EVT",changeSelection:"next-previous-job-EVT",addRelatedBug:"add-related-bug-EVT",saveClassification:"save-classification-EVT",deleteClassification:"delete-classification-EVT",clearPinboard:"clear-pinboard-EVT",searchPage:"search-page-EVT",selectJob:"select-job-EVT",mapResultSetJobs:"map-result-set-jobs-EVT",applyNewJobs:"apply-new-jobs-EVT",initSheriffPanel:"init-sheriff-panel-EVT",openLogviewer:"open-logviewer-EVT"}}}),treeherder.provider("thAggregateIds",function(){var escape=function(id){return id.replace(/(:|\[|\]|\?|,|\.|\s+)/g,"-")},getPlatformRowId=function(repoName,resultsetId,platformName,platformOptions){return escape(repoName+resultsetId+platformName+platformOptions)},getResultsetTableId=function(repoName,resultsetId,revision){return escape(repoName+resultsetId+revision)};this.$get=function(){return{getPlatformRowId:getPlatformRowId,getResultsetTableId:getResultsetTableId}}}),treeherder.provider("thReftestStatus",function(){this.$get=function(){return function(job){return job.job_group_name?-1!==job.job_group_name.toLowerCase().indexOf("reftest"):void 0}}}),treeherder.value("thPlatformNameMap",{linux32:"Linux",linux64:"Linux x64","osx-10-6":"OS X 10.6","osx-10-7":"OS X 10.7","osx-10-8":"OS X 10.8","osx-10-9":"OS X 10.9","osx-10-10":"OS X 10.10",windowsxp:"Windows XP","windows7-32":"Windows 7","windows7-64":"Windows 7 x64","windows8-32":"Windows 8","windows8-64":"Windows 8 x64","windows2012-64":"Windows 2012 x64","android-2-2-armv6":"Android 2.2 Armv6","android-2-2":"Android 2.2","android-2-3-armv6":"Android 2.3 Armv6","android-2-3":"Android 2.3","android-2-3-armv7-api9":"Android 2.3 API9","android-4-0":"Android 4.0","android-4-0-armv7-api10":"Android 4.0 API10+","android-4-0-armv7-api11":"Android 4.0 API11+","android-4-2-x86":"Android 4.2 x86","android-4-2":"Android 4.2","android-4-2-armv7-api11":"Android 4.2 API11+","android-4-3":"Android 4.3","android-4-3-armv7-api11":"Android 4.3 API11+","android-4-4":"Android 4.4","android-4-4-armv7-api11":"Android 4.4 API11+","android-5-0-armv7-api11":"Android 5.0 API11+","b2g-linux32":"B2G Desktop Linux","b2g-linux64":"B2G Desktop Linux x64","b2g-osx":"B2G Desktop OS X","b2g-win32":"B2G Desktop Windows","b2g-emu-ics":"B2G ICS Emulator","b2g-emu-jb":"B2G JB Emulator","b2g-emu-kk":"B2G KK Emulator","b2g-emu-l":"B2G L Emulator","b2g-device-image":"B2G Device Image","mulet-linux32":"Mulet Linux","mulet-linux64":"Mulet Linux x64","mulet-osx":"Mulet OS X","mulet-win32":"Mulet Windows","graphene-linux64":"Graphene Linux x64","graphene-osx":"Graphene OS X","graphene-win64":"Graphene Windows x64","horizon-linux64":"Horizon Linux x64","horizon-osx":"Horizon OS X","horizon-win64":"Horizon Windows x64",other:"Other"}),treeherder.value("thPlatformOrder",{linux32:0,linux64:1,"osx-10-6":10,"osx-10-7":11,"osx-10-8":12,"osx-10-9":13,"osx-10-10":14,windowsxp:20,"windows7-32":21,"windows7-64":22,"windows8-32":23,"windows8-64":24,"windows2012-64":25,"android-2-2-armv6":30,"android-2-2":31,"android-2-3-armv6":32,"android-2-3":33,"android-2-3-armv7-api9":34,"android-4-0":35,"android-4-0-armv7-api10":36,"android-4-0-armv7-api11":37,"android-4-2-x86":38,"android-4-2":39,"android-4-2-armv7-api11":40,"android-4-3":41,"android-4-3-armv7-api11":42,"android-4-4":43,"android-4-4-armv7-api11":44,"android-5-0-armv7-api11":45,"b2g-linux32":50,"b2g-linux64":51,"b2g-osx":52,"b2g-win32":53,"b2g-emu-ics":54,"b2g-emu-jb":55,"b2g-emu-kk":56,"b2g-emu-l":57,"b2g-device-image":58,"mulet-linux32":60,"mulet-linux64":61,"mulet-osx":62,"mulet-win32":63,"graphene-linux64":71,"graphene-osx":72,"graphene-win64":73,"horizon-linux64":74,"horizon-osx":75,"horizon-win64":76,other:99}),treeherder.value("thOptionOrder",{opt:0,pgo:1,asan:2,debug:3,cc:4}),treeherder.value("thFailureResults",["testfailed","busted","exception"]),treeherder.value("thFavicons",{closed:"img/tree_closed.png",open:"img/tree_open.png","approval required":"img/tree_open.png",unavailable:"img/tree_open.png"}),treeherder.value("thRepoGroupOrder",{development:1,"project repositories":2,"try":3,"release-stabilization":4,taskcluster:5,"qa automation tests":6}),treeherder.value("thDefaultRepo","mozilla-inbound"),treeherder.value("thDateFormat","EEE MMM d, H:mm:ss"),treeherder.value("phTimeRanges",[{value:86400,text:"Last day"},{value:604800,text:"Last 7 days"},{value:1209600,text:"Last 14 days"},{value:2592e3,text:"Last 30 days"},{value:5184e3,text:"Last 60 days"},{value:7776e3,text:"Last 90 days"},{value:31536e3,text:"Last year"}]),treeherder.value("thJobNavSelectors",{ALL_JOBS:{name:"jobs",selector:".th-view-content .job-btn"},UNCLASSIFIED_FAILURES:{name:"unclassified failures",selector:".selected-job, .th-view-content .job-btn.btn-red, .th-view-content .job-btn.btn-orange, .th-view-content .job-btn.btn-purple"}}),treeherder.directive("lvInfiniteScroll",["$timeout","$parse",function($timeout,$parse){return function(scope,element,attr){element.bind("scroll",function(){var raw=element[0],sh=raw.scrollHeight;raw.scrollTop<=100?scope.loadMore({top:!0},raw).then(function(haltScrollTop){haltScrollTop||$timeout(function(){raw.scrollTop=raw.scrollHeight-sh})}):raw.scrollTop>=raw.scrollHeight-$(element).height()-100&&scope.loadMore({bottom:!0},raw)})}}]),treeherder.directive("lvLogLines",["$timeout","$parse",function($timeout){function getOffsetOfStep(order){var el=$('.logviewer-step[order="'+order+'"]'),parentOffset=el.parent().offset();return el.offset().top-parentOffset.top+el.parent().scrollTop()-parseInt($(".steps-data").first().css("padding-bottom"))}function onScroll($scope){for(var lines=$(".lv-log-line"),scrollTop=$(".lv-log-container").scrollTop(),i=0,l=lines.length;l>i;i++)if(lines[i].offsetTop>scrollTop)for(var steps=$scope.artifact.step_data.steps,lineNumber=+$(lines[i]).attr("line"),j=0,ll=steps.length;ll>j;j++)if(lineNumber>steps[j].started_linenumber-1&&lineNumbermaxNsNotifications)return void $timeout(thNotify.shift);$timeout(thNotify.shift,4e3,!0)}},shift:function(){for(var i=0;i0?_.map(response.data.revisions,function(r){return r.revision}):$q.reject("No revisions found for result set "+resultSetId+" in project "+projectName)})},getResultSetsFromRevision:function(projectName,revision){return $http.get(thUrl.getProjectUrl("/resultset/?revision="+revision,projectName),{cache:!0}).then(function(response){return response.data.results.length>0?response.data.results:$q.reject("No results found for revision "+revision+" on project "+projectName)})},cancelAll:function(resultset_id,repoName){var uri=resultset_id+"/cancel_all/";return $http.post(thUrl.getProjectUrl("/resultset/",repoName)+uri)}}}]),treeherder.factory("ThLogSliceModel",["$http","$q","$timeout","thUrl",function($http,$q,$timeout,thUrl){var ThLogSliceModel=function(job_id,buffer_chunk_size,buffer_size){this.job_id=job_id,this.chunk_size=buffer_chunk_size||500,this.buffer_size=buffer_size||10,this.buffer={}};return ThLogSliceModel.get_uri=function(){return thUrl.getProjectUrl("/logslice/")},ThLogSliceModel.prototype.find_in_buffer=function(options){for(var arr,ret=[],i=options.start_line;ithis.buffer_size;){size=0;var indexLRU=0,baseDate=Date.now();for(var k in this.buffer)this.buffer.hasOwnProperty(k)&&(size++,this.buffer[k].usedthis.buffer_size&&delete this.buffer[indexLRU]}},ThLogSliceModel.prototype.get_line_range=function(options,config){config=config||{};var timeout=config.timeout||null,found=this.find_in_buffer(options),self=this,deferred=$q.defer();return found?(deferred.resolve(found),deferred.promise):$http.get(ThLogSliceModel.get_uri(),{params:options,timeout:timeout}).then(function(res){return self.insert_into_buffer(options,res.data),res.data},function(res){return $q.reject("Log not found")})},ThLogSliceModel}]),logViewerApp.controller("LogviewerCtrl",["$anchorScroll","$http","$location","$q","$rootScope","$scope","$timeout","ThJobArtifactModel","ThLog","ThLogSliceModel","ThJobModel","dateFilter","thJobSearchStr","ThResultSetModel","thDateFormat","thReftestStatus",function($anchorScroll,$http,$location,$q,$rootScope,$scope,$timeout,ThJobArtifactModel,ThLog,ThLogSliceModel,ThJobModel,dateFilter,thJobSearchStr,ThResultSetModel,thDateFormat,thReftestStatus){function logFileLineCount(){var steps=$scope.artifact.step_data.steps;return steps[steps.length-1].finished_linenumber}function moveLineNumber(bounds){var newLine,lines=$scope.displayedLogLines;return bounds.top?lines[0].index:bounds.bottom?(newLine=lines[lines.length-1].index+1,newLine>logFileLineCount()?logFileLineCount():newLine):$scope.currentLineNumber}function drawErrorLines(data){if(0!==data.length){var min=data[0].index,max=data[data.length-1].index;$scope.artifact.step_data.steps.forEach(function(step){step.errors.forEach(function(err){var line=err.linenumber;if(!(min>line||line>max)){var index=line-min;data[index].hasError=!0}})})}}function getChunksSurrounding(line){var request={start:null,end:null};return getChunkContaining(line,request),getChunkAbove(request),getChunkBelow(request),request}function getChunkContaining(line,request){var index=Math.floor(line/LINE_BUFFER_SIZE);request.start=index*LINE_BUFFER_SIZE,request.end=(index+1)*LINE_BUFFER_SIZE}function getChunkAbove(request){return request.start-=LINE_BUFFER_SIZE,request.start=Math.floor(request.start/LINE_BUFFER_SIZE)*LINE_BUFFER_SIZE,request.start>=0?!0:(request.start=0,!1)}function getChunkBelow(request){var lastLine=logFileLineCount();return request.end+=LINE_BUFFER_SIZE,request.end=Math.ceil(request.end/LINE_BUFFER_SIZE)*LINE_BUFFER_SIZE,request.end<=lastLine?!0:(request.end=lastLine,!1)}function removeChunkAbove(request){$scope.displayedLogLines=$scope.displayedLogLines.slice(LINE_BUFFER_SIZE)}function removeChunkBelow(request){var endSlice=$scope.displayedLogLines.length-LINE_BUFFER_SIZE;$scope.displayedLogLines=$scope.displayedLogLines.slice(0,endSlice)}var LogSlice,$log=new ThLog("LogviewerCtrl"),LINE_BUFFER_SIZE=100;$rootScope.urlBasePath=$location.absUrl().split("logviewer")[0];var query_string=$location.search();""!==query_string.repo&&($rootScope.repoName=query_string.repo),""!==query_string.job_id&&($scope.job_id=query_string.job_id,LogSlice=new ThLogSliceModel($scope.job_id,LINE_BUFFER_SIZE)),$scope.displayedLogLines=[],$scope.loading=!1,$scope.logError=!1,$scope.currentLineNumber=0,$scope.highestLine=0,$scope.showSuccessful=!0,$scope.$watch("artifact",function(){$scope.artifact&&($scope.showSuccessful=!$scope.hasFailedSteps())}),$scope.hasFailedSteps=function(){for(var steps=$scope.artifact.step_data.steps,i=0;i=0;i--)$scope.displayedLogLines[0].index===data[i].index+1&&$scope.displayedLogLines.unshift(data[i]);$timeout(function(){above&&removeChunkBelow()},100)}else if(bounds.bottom){for(var sh=element.scrollHeight,lines=$scope.displayedLogLines,j=0;j0?h+"h ":"")+(m>0?m+"m ":"")+(s>0?s+"s ":"")+(ms>0?ms+"ms ":"00ms")},$scope.displayTime=function(started,finished){var start=started.substr(started.indexOf(" ")+1,8),end=finished.substr(finished.indexOf(" ")+1,8);return start+"-"+end},$scope.init=function(){$scope.logProperties=[],ThJobModel.get($scope.repoName,$scope.job_id).then(function(job){var jobStr=thJobSearchStr(job);$scope.logViewerTitle="Log for "+jobStr,$scope.result={
+label:"Result",value:job.result},$scope.resultStatusShading=$scope.getShadingClass(job.result),$scope.logProperties=[{label:"Job",value:jobStr},{label:"Machine",value:job.machine_name},{label:"Start",value:dateFilter(1e3*job.start_timestamp,thDateFormat)},{label:"End",value:dateFilter(1e3*job.end_timestamp,thDateFormat)}],$scope.isReftest=function(){return job.job_group_name?thReftestStatus(job):void 0},ThResultSetModel.getResultSet($scope.repoName,job.result_set_id).then(function(data){var revision=data.data.revision;$scope.logProperties.push({label:"Revision",value:revision}),$scope.logRevisionFilterUrl=$scope.urlBasePath+"#/jobs?repo="+$scope.repoName+"&revision="+revision})}),$log.debug(ThJobArtifactModel.get_uri()),ThJobArtifactModel.get_list({job_id:$scope.job_id,name:"text_log_summary"}).then(function(artifactList){artifactList.length>0&&($scope.artifact=artifactList[0].blob)})}}]);angular.module('logviewer').run(['$templateCache', function($templateCache) {
'use strict';
$templateCache.put('partials/logviewer/lvLogLines.html',
diff --git a/dist/js/perf.min-2a0d8c0968b846f1b9216922286b2822.js b/dist/js/perf.min-0f6e4e55a61ffc08025f0356670fb7ee.js
similarity index 92%
rename from dist/js/perf.min-2a0d8c0968b846f1b9216922286b2822.js
rename to dist/js/perf.min-0f6e4e55a61ffc08025f0356670fb7ee.js
index 9ef925461..452b09c80 100644
--- a/dist/js/perf.min-2a0d8c0968b846f1b9216922286b2822.js
+++ b/dist/js/perf.min-0f6e4e55a61ffc08025f0356670fb7ee.js
@@ -20,9 +20,9 @@ return tooltipHtmlUnsafeSuppressDeprecated||$log.warn("tooltip-html-unsafe is no
$templateCache.put("template/pagination/pagination.html",'')}]),angular.module("template/tooltip/tooltip-html-popup.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/tooltip/tooltip-html-popup.html",'\n')}]),angular.module("template/tooltip/tooltip-html-unsafe-popup.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/tooltip/tooltip-html-unsafe-popup.html",'\n')}]),angular.module("template/tooltip/tooltip-popup.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/tooltip/tooltip-popup.html",'\n')}]),angular.module("template/tooltip/tooltip-template-popup.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/tooltip/tooltip-template-popup.html",'\n')}]),angular.module("template/popover/popover-template.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/popover/popover-template.html",'\n')}]),angular.module("template/popover/popover-window.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/popover/popover-window.html",'\n')}]),angular.module("template/popover/popover.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/popover/popover.html",'\n')}]),angular.module("template/progressbar/bar.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/progressbar/bar.html",'
\n')}]),angular.module("template/progressbar/progress.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/progressbar/progress.html",'
')}]),angular.module("template/progressbar/progressbar.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/progressbar/progressbar.html",'\n')}]),angular.module("template/rating/rating.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/rating/rating.html",'\n \n ({{ $index < value ? \'*\' : \' \' }}) \n \n ')}]),angular.module("template/tabs/tab.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/tabs/tab.html",'\n {{heading}} \n \n')}]),angular.module("template/tabs/tabset.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/tabs/tabset.html",'\n')}]),angular.module("template/timepicker/timepicker.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/timepicker/timepicker.html",'\n')}]),angular.module("template/typeahead/typeahead-match.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/typeahead/typeahead-match.html",' ')}]),angular.module("template/typeahead/typeahead-popup.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/typeahead/typeahead-popup.html",'\n')}]),!angular.$$csp()&&angular.element(document).find("head").prepend(''),"undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function($){"use strict";function transitionEnd(){var el=document.createElement("bootstrap"),transEndEventNames={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var name in transEndEventNames)if(void 0!==el.style[name])return{end:transEndEventNames[name]};return!1}$.fn.emulateTransitionEnd=function(duration){var called=!1,$el=this;$(this).one("bsTransitionEnd",function(){called=!0});var callback=function(){called||$($el).trigger($.support.transition.end)};return setTimeout(callback,duration),this},$(function(){$.support.transition=transitionEnd(),$.support.transition&&($.event.special.bsTransitionEnd={bindType:$.support.transition.end,delegateType:$.support.transition.end,handle:function(e){return $(e.target).is(this)?e.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.alert");data||$this.data("bs.alert",data=new Alert(this)),"string"==typeof option&&data[option].call($this)})}var dismiss='[data-dismiss="alert"]',Alert=function(el){$(el).on("click",dismiss,this.close)};Alert.VERSION="3.2.0",Alert.prototype.close=function(e){function removeElement(){$parent.detach().trigger("closed.bs.alert").remove()}var $this=$(this),selector=$this.attr("data-target");selector||(selector=$this.attr("href"),selector=selector&&selector.replace(/.*(?=#[^\s]*$)/,""));var $parent=$(selector);e&&e.preventDefault(),$parent.length||($parent=$this.hasClass("alert")?$this:$this.parent()),$parent.trigger(e=$.Event("close.bs.alert")),e.isDefaultPrevented()||($parent.removeClass("in"),$.support.transition&&$parent.hasClass("fade")?$parent.one("bsTransitionEnd",removeElement).emulateTransitionEnd(150):removeElement())};var old=$.fn.alert;$.fn.alert=Plugin,$.fn.alert.Constructor=Alert,$.fn.alert.noConflict=function(){return $.fn.alert=old,this},$(document).on("click.bs.alert.data-api",dismiss,Alert.prototype.close)}(jQuery),+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.button"),options="object"==typeof option&&option;data||$this.data("bs.button",data=new Button(this,options)),"toggle"==option?data.toggle():option&&data.setState(option)})}var Button=function(element,options){this.$element=$(element),this.options=$.extend({},Button.DEFAULTS,options),this.isLoading=!1};Button.VERSION="3.2.0",Button.DEFAULTS={loadingText:"loading..."},Button.prototype.setState=function(state){var d="disabled",$el=this.$element,val=$el.is("input")?"val":"html",data=$el.data();state+="Text",null==data.resetText&&$el.data("resetText",$el[val]()),$el[val](null==data[state]?this.options[state]:data[state]),setTimeout($.proxy(function(){"loadingText"==state?(this.isLoading=!0,$el.addClass(d).attr(d,d)):this.isLoading&&(this.isLoading=!1,$el.removeClass(d).removeAttr(d))},this),0)},Button.prototype.toggle=function(){var changed=!0,$parent=this.$element.closest('[data-toggle="buttons"]');if($parent.length){var $input=this.$element.find("input");"radio"==$input.prop("type")&&($input.prop("checked")&&this.$element.hasClass("active")?changed=!1:$parent.find(".active").removeClass("active")),changed&&$input.prop("checked",!this.$element.hasClass("active")).trigger("change")}changed&&this.$element.toggleClass("active")};var old=$.fn.button;$.fn.button=Plugin,$.fn.button.Constructor=Button,$.fn.button.noConflict=function(){return $.fn.button=old,this},$(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(e){var $btn=$(e.target);$btn.hasClass("btn")||($btn=$btn.closest(".btn")),Plugin.call($btn,"toggle"),e.preventDefault()})}(jQuery),+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.carousel"),options=$.extend({},Carousel.DEFAULTS,$this.data(),"object"==typeof option&&option),action="string"==typeof option?option:options.slide;data||$this.data("bs.carousel",data=new Carousel(this,options)),"number"==typeof option?data.to(option):action?data[action]():options.interval&&data.pause().cycle()})}var Carousel=function(element,options){this.$element=$(element).on("keydown.bs.carousel",$.proxy(this.keydown,this)),this.$indicators=this.$element.find(".carousel-indicators"),this.options=options,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter.bs.carousel",$.proxy(this.pause,this)).on("mouseleave.bs.carousel",$.proxy(this.cycle,this))};Carousel.VERSION="3.2.0",Carousel.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},Carousel.prototype.keydown=function(e){switch(e.which){case 37:this.prev();break;case 39:this.next();break;default:return}e.preventDefault()},Carousel.prototype.cycle=function(e){return e||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval($.proxy(this.next,this),this.options.interval)),this},Carousel.prototype.getItemIndex=function(item){return this.$items=item.parent().children(".item"),this.$items.index(item||this.$active)},Carousel.prototype.to=function(pos){var that=this,activeIndex=this.getItemIndex(this.$active=this.$element.find(".item.active"));return pos>this.$items.length-1||0>pos?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){that.to(pos)}):activeIndex==pos?this.pause().cycle():this.slide(pos>activeIndex?"next":"prev",$(this.$items[pos]))},Carousel.prototype.pause=function(e){return e||(this.paused=!0),this.$element.find(".next, .prev").length&&$.support.transition&&(this.$element.trigger($.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},Carousel.prototype.next=function(){return this.sliding?void 0:this.slide("next")},Carousel.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},Carousel.prototype.slide=function(type,next){var $active=this.$element.find(".item.active"),$next=next||$active[type](),isCycling=this.interval,direction="next"==type?"left":"right",fallback="next"==type?"first":"last",that=this;if(!$next.length){if(!this.options.wrap)return;$next=this.$element.find(".item")[fallback]()}if($next.hasClass("active"))return this.sliding=!1;var relatedTarget=$next[0],slideEvent=$.Event("slide.bs.carousel",{relatedTarget:relatedTarget,direction:direction});if(this.$element.trigger(slideEvent),!slideEvent.isDefaultPrevented()){if(this.sliding=!0,isCycling&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var $nextIndicator=$(this.$indicators.children()[this.getItemIndex($next)]);$nextIndicator&&$nextIndicator.addClass("active")}var slidEvent=$.Event("slid.bs.carousel",{relatedTarget:relatedTarget,direction:direction});return $.support.transition&&this.$element.hasClass("slide")?($next.addClass(type),$next[0].offsetWidth,$active.addClass(direction),$next.addClass(direction),$active.one("bsTransitionEnd",function(){$next.removeClass([type,direction].join(" ")).addClass("active"),$active.removeClass(["active",direction].join(" ")),that.sliding=!1,setTimeout(function(){that.$element.trigger(slidEvent)},0)}).emulateTransitionEnd(1e3*$active.css("transition-duration").slice(0,-1))):($active.removeClass("active"),$next.addClass("active"),this.sliding=!1,this.$element.trigger(slidEvent)),isCycling&&this.cycle(),this}};var old=$.fn.carousel;$.fn.carousel=Plugin,$.fn.carousel.Constructor=Carousel,$.fn.carousel.noConflict=function(){return $.fn.carousel=old,this},$(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(e){var href,$this=$(this),$target=$($this.attr("data-target")||(href=$this.attr("href"))&&href.replace(/.*(?=#[^\s]+$)/,""));if($target.hasClass("carousel")){var options=$.extend({},$target.data(),$this.data()),slideIndex=$this.attr("data-slide-to");slideIndex&&(options.interval=!1),Plugin.call($target,options),slideIndex&&$target.data("bs.carousel").to(slideIndex),e.preventDefault()}}),$(window).on("load",function(){$('[data-ride="carousel"]').each(function(){var $carousel=$(this);Plugin.call($carousel,$carousel.data())})})}(jQuery),+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.collapse"),options=$.extend({},Collapse.DEFAULTS,$this.data(),"object"==typeof option&&option);!data&&options.toggle&&"show"==option&&(option=!option),data||$this.data("bs.collapse",data=new Collapse(this,options)),"string"==typeof option&&data[option]()})}var Collapse=function(element,options){this.$element=$(element),this.options=$.extend({},Collapse.DEFAULTS,options),this.transitioning=null,this.options.parent&&(this.$parent=$(this.options.parent)),this.options.toggle&&this.toggle()};Collapse.VERSION="3.2.0",Collapse.DEFAULTS={toggle:!0},Collapse.prototype.dimension=function(){var hasWidth=this.$element.hasClass("width");return hasWidth?"width":"height"},Collapse.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var startEvent=$.Event("show.bs.collapse");if(this.$element.trigger(startEvent),!startEvent.isDefaultPrevented()){var actives=this.$parent&&this.$parent.find("> .panel > .in");if(actives&&actives.length){var hasData=actives.data("bs.collapse");if(hasData&&hasData.transitioning)return;Plugin.call(actives,"hide"),hasData||actives.data("bs.collapse",null)}var dimension=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[dimension](0),this.transitioning=1;var complete=function(){this.$element.removeClass("collapsing").addClass("collapse in")[dimension](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!$.support.transition)return complete.call(this);var scrollSize=$.camelCase(["scroll",dimension].join("-"));this.$element.one("bsTransitionEnd",$.proxy(complete,this)).emulateTransitionEnd(350)[dimension](this.$element[0][scrollSize])}}},Collapse.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var startEvent=$.Event("hide.bs.collapse");if(this.$element.trigger(startEvent),!startEvent.isDefaultPrevented()){var dimension=this.dimension();this.$element[dimension](this.$element[dimension]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var complete=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return $.support.transition?void this.$element[dimension](0).one("bsTransitionEnd",$.proxy(complete,this)).emulateTransitionEnd(350):complete.call(this)}}},Collapse.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var old=$.fn.collapse;$.fn.collapse=Plugin,$.fn.collapse.Constructor=Collapse,$.fn.collapse.noConflict=function(){return $.fn.collapse=old,this},$(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(e){var href,$this=$(this),target=$this.attr("data-target")||e.preventDefault()||(href=$this.attr("href"))&&href.replace(/.*(?=#[^\s]+$)/,""),$target=$(target),data=$target.data("bs.collapse"),option=data?"toggle":$this.data(),parent=$this.attr("data-parent"),$parent=parent&&$(parent);data&&data.transitioning||($parent&&$parent.find('[data-toggle="collapse"][data-parent="'+parent+'"]').not($this).addClass("collapsed"),$this[$target.hasClass("in")?"addClass":"removeClass"]("collapsed")),Plugin.call($target,option)})}(jQuery),+function($){"use strict";function clearMenus(e){e&&3===e.which||($(backdrop).remove(),$(toggle).each(function(){var $parent=getParent($(this)),relatedTarget={relatedTarget:this};$parent.hasClass("open")&&($parent.trigger(e=$.Event("hide.bs.dropdown",relatedTarget)),e.isDefaultPrevented()||$parent.removeClass("open").trigger("hidden.bs.dropdown",relatedTarget))}))}function getParent($this){var selector=$this.attr("data-target");selector||(selector=$this.attr("href"),selector=selector&&/#[A-Za-z]/.test(selector)&&selector.replace(/.*(?=#[^\s]*$)/,""));var $parent=selector&&$(selector);return $parent&&$parent.length?$parent:$this.parent()}function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.dropdown");data||$this.data("bs.dropdown",data=new Dropdown(this)),"string"==typeof option&&data[option].call($this)})}var backdrop=".dropdown-backdrop",toggle='[data-toggle="dropdown"]',Dropdown=function(element){$(element).on("click.bs.dropdown",this.toggle)};Dropdown.VERSION="3.2.0",Dropdown.prototype.toggle=function(e){var $this=$(this);if(!$this.is(".disabled, :disabled")){var $parent=getParent($this),isActive=$parent.hasClass("open");if(clearMenus(),!isActive){"ontouchstart"in document.documentElement&&!$parent.closest(".navbar-nav").length&&$('
').insertAfter($(this)).on("click",clearMenus);var relatedTarget={relatedTarget:this};if($parent.trigger(e=$.Event("show.bs.dropdown",relatedTarget)),e.isDefaultPrevented())return;$this.trigger("focus"),$parent.toggleClass("open").trigger("shown.bs.dropdown",relatedTarget)}return!1}},Dropdown.prototype.keydown=function(e){if(/(38|40|27)/.test(e.keyCode)){var $this=$(this);if(e.preventDefault(),e.stopPropagation(),!$this.is(".disabled, :disabled")){var $parent=getParent($this),isActive=$parent.hasClass("open");if(!isActive||isActive&&27==e.keyCode)return 27==e.which&&$parent.find(toggle).trigger("focus"),$this.trigger("click");var desc=" li:not(.divider):visible a",$items=$parent.find('[role="menu"]'+desc+', [role="listbox"]'+desc);if($items.length){var index=$items.index($items.filter(":focus"));38==e.keyCode&&index>0&&index--,40==e.keyCode&&index<$items.length-1&&index++,~index||(index=0),$items.eq(index).trigger("focus")}}}};var old=$.fn.dropdown;$.fn.dropdown=Plugin,$.fn.dropdown.Constructor=Dropdown,$.fn.dropdown.noConflict=function(){return $.fn.dropdown=old,this},$(document).on("click.bs.dropdown.data-api",clearMenus).on("click.bs.dropdown.data-api",".dropdown form",function(e){e.stopPropagation()}).on("click.bs.dropdown.data-api",toggle,Dropdown.prototype.toggle).on("keydown.bs.dropdown.data-api",toggle+', [role="menu"], [role="listbox"]',Dropdown.prototype.keydown)}(jQuery),+function($){"use strict";function Plugin(option,_relatedTarget){return this.each(function(){var $this=$(this),data=$this.data("bs.modal"),options=$.extend({},Modal.DEFAULTS,$this.data(),"object"==typeof option&&option);data||$this.data("bs.modal",data=new Modal(this,options)),"string"==typeof option?data[option](_relatedTarget):options.show&&data.show(_relatedTarget)})}var Modal=function(element,options){this.options=options,this.$body=$(document.body),this.$element=$(element),this.$backdrop=this.isShown=null,this.scrollbarWidth=0,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,$.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};Modal.VERSION="3.2.0",Modal.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},Modal.prototype.toggle=function(_relatedTarget){return this.isShown?this.hide():this.show(_relatedTarget)},Modal.prototype.show=function(_relatedTarget){var that=this,e=$.Event("show.bs.modal",{relatedTarget:_relatedTarget});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.$body.addClass("modal-open"),this.setScrollbar(),this.escape(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',$.proxy(this.hide,this)),this.backdrop(function(){var transition=$.support.transition&&that.$element.hasClass("fade");that.$element.parent().length||that.$element.appendTo(that.$body),that.$element.show().scrollTop(0),transition&&that.$element[0].offsetWidth,that.$element.addClass("in").attr("aria-hidden",!1),that.enforceFocus();var e=$.Event("shown.bs.modal",{relatedTarget:_relatedTarget});transition?that.$element.find(".modal-dialog").one("bsTransitionEnd",function(){that.$element.trigger("focus").trigger(e)}).emulateTransitionEnd(300):that.$element.trigger("focus").trigger(e)}))},Modal.prototype.hide=function(e){e&&e.preventDefault(),e=$.Event("hide.bs.modal"),this.$element.trigger(e),this.isShown&&!e.isDefaultPrevented()&&(this.isShown=!1,this.$body.removeClass("modal-open"),this.resetScrollbar(),this.escape(),$(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),$.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",$.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},Modal.prototype.enforceFocus=function(){$(document).off("focusin.bs.modal").on("focusin.bs.modal",$.proxy(function(e){this.$element[0]===e.target||this.$element.has(e.target).length||this.$element.trigger("focus")},this))},Modal.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",$.proxy(function(e){27==e.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},Modal.prototype.hideModal=function(){var that=this;this.$element.hide(),this.backdrop(function(){that.$element.trigger("hidden.bs.modal")})},Modal.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},Modal.prototype.backdrop=function(callback){var that=this,animate=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var doAnimate=$.support.transition&&animate;if(this.$backdrop=$('
').appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",$.proxy(function(e){e.target===e.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),doAnimate&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!callback)return;doAnimate?this.$backdrop.one("bsTransitionEnd",callback).emulateTransitionEnd(150):callback()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var callbackRemove=function(){that.removeBackdrop(),callback&&callback()};$.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",callbackRemove).emulateTransitionEnd(150):callbackRemove()}else callback&&callback()},Modal.prototype.checkScrollbar=function(){document.body.clientWidth>=window.innerWidth||(this.scrollbarWidth=this.scrollbarWidth||this.measureScrollbar())},Modal.prototype.setScrollbar=function(){var bodyPad=parseInt(this.$body.css("padding-right")||0,10);this.scrollbarWidth&&this.$body.css("padding-right",bodyPad+this.scrollbarWidth)},Modal.prototype.resetScrollbar=function(){this.$body.css("padding-right","")},Modal.prototype.measureScrollbar=function(){var scrollDiv=document.createElement("div");scrollDiv.className="modal-scrollbar-measure",this.$body.append(scrollDiv);var scrollbarWidth=scrollDiv.offsetWidth-scrollDiv.clientWidth;return this.$body[0].removeChild(scrollDiv),scrollbarWidth};var old=$.fn.modal;$.fn.modal=Plugin,$.fn.modal.Constructor=Modal,$.fn.modal.noConflict=function(){return $.fn.modal=old,this},$(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(e){var $this=$(this),href=$this.attr("href"),$target=$($this.attr("data-target")||href&&href.replace(/.*(?=#[^\s]+$)/,"")),option=$target.data("bs.modal")?"toggle":$.extend({remote:!/#/.test(href)&&href},$target.data(),$this.data());$this.is("a")&&e.preventDefault(),$target.one("show.bs.modal",function(showEvent){showEvent.isDefaultPrevented()||$target.one("hidden.bs.modal",function(){$this.is(":visible")&&$this.trigger("focus")})}),Plugin.call($target,option,this)})}(jQuery),+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.tooltip"),options="object"==typeof option&&option;(data||"destroy"!=option)&&(data||$this.data("bs.tooltip",data=new Tooltip(this,options)),"string"==typeof option&&data[option]())})}var Tooltip=function(element,options){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",element,options)};Tooltip.VERSION="3.2.0",Tooltip.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},Tooltip.prototype.init=function(type,element,options){this.enabled=!0,this.type=type,this.$element=$(element),this.options=this.getOptions(options),this.$viewport=this.options.viewport&&$(this.options.viewport.selector||this.options.viewport);for(var triggers=this.options.trigger.split(" "),i=triggers.length;i--;){var trigger=triggers[i];if("click"==trigger)this.$element.on("click."+this.type,this.options.selector,$.proxy(this.toggle,this));else if("manual"!=trigger){var eventIn="hover"==trigger?"mouseenter":"focusin",eventOut="hover"==trigger?"mouseleave":"focusout";this.$element.on(eventIn+"."+this.type,this.options.selector,$.proxy(this.enter,this)),this.$element.on(eventOut+"."+this.type,this.options.selector,$.proxy(this.leave,this))}}this.options.selector?this._options=$.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},Tooltip.prototype.getDefaults=function(){return Tooltip.DEFAULTS},Tooltip.prototype.getOptions=function(options){return options=$.extend({},this.getDefaults(),this.$element.data(),options),options.delay&&"number"==typeof options.delay&&(options.delay={show:options.delay,hide:options.delay}),options},Tooltip.prototype.getDelegateOptions=function(){var options={},defaults=this.getDefaults();return this._options&&$.each(this._options,function(key,value){defaults[key]!=value&&(options[key]=value)}),options},Tooltip.prototype.enter=function(obj){var self=obj instanceof this.constructor?obj:$(obj.currentTarget).data("bs."+this.type);return self||(self=new this.constructor(obj.currentTarget,this.getDelegateOptions()),$(obj.currentTarget).data("bs."+this.type,self)),clearTimeout(self.timeout),self.hoverState="in",self.options.delay&&self.options.delay.show?void(self.timeout=setTimeout(function(){"in"==self.hoverState&&self.show()},self.options.delay.show)):self.show()},Tooltip.prototype.leave=function(obj){var self=obj instanceof this.constructor?obj:$(obj.currentTarget).data("bs."+this.type);return self||(self=new this.constructor(obj.currentTarget,this.getDelegateOptions()),$(obj.currentTarget).data("bs."+this.type,self)),clearTimeout(self.timeout),self.hoverState="out",self.options.delay&&self.options.delay.hide?void(self.timeout=setTimeout(function(){"out"==self.hoverState&&self.hide()},self.options.delay.hide)):self.hide();
},Tooltip.prototype.show=function(){var e=$.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(e);var inDom=$.contains(document.documentElement,this.$element[0]);if(e.isDefaultPrevented()||!inDom)return;var that=this,$tip=this.tip(),tipId=this.getUID(this.type);this.setContent(),$tip.attr("id",tipId),this.$element.attr("aria-describedby",tipId),this.options.animation&&$tip.addClass("fade");var placement="function"==typeof this.options.placement?this.options.placement.call(this,$tip[0],this.$element[0]):this.options.placement,autoToken=/\s?auto?\s?/i,autoPlace=autoToken.test(placement);autoPlace&&(placement=placement.replace(autoToken,"")||"top"),$tip.detach().css({top:0,left:0,display:"block"}).addClass(placement).data("bs."+this.type,this),this.options.container?$tip.appendTo(this.options.container):$tip.insertAfter(this.$element);var pos=this.getPosition(),actualWidth=$tip[0].offsetWidth,actualHeight=$tip[0].offsetHeight;if(autoPlace){var orgPlacement=placement,$parent=this.$element.parent(),parentDim=this.getPosition($parent);placement="bottom"==placement&&pos.top+pos.height+actualHeight-parentDim.scroll>parentDim.height?"top":"top"==placement&&pos.top-parentDim.scroll-actualHeight<0?"bottom":"right"==placement&&pos.right+actualWidth>parentDim.width?"left":"left"==placement&&pos.left-actualWidthviewportDimensions.top+viewportDimensions.height&&(delta.top=viewportDimensions.top+viewportDimensions.height-bottomEdgeOffset)}else{var leftEdgeOffset=pos.left-viewportPadding,rightEdgeOffset=pos.left+viewportPadding+actualWidth;leftEdgeOffsetviewportDimensions.width&&(delta.left=viewportDimensions.left+viewportDimensions.width-rightEdgeOffset)}return delta},Tooltip.prototype.getTitle=function(){var title,$e=this.$element,o=this.options;return title=$e.attr("data-original-title")||("function"==typeof o.title?o.title.call($e[0]):o.title)},Tooltip.prototype.getUID=function(prefix){do prefix+=~~(1e6*Math.random());while(document.getElementById(prefix));return prefix},Tooltip.prototype.tip=function(){return this.$tip=this.$tip||$(this.options.template)},Tooltip.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},Tooltip.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},Tooltip.prototype.enable=function(){this.enabled=!0},Tooltip.prototype.disable=function(){this.enabled=!1},Tooltip.prototype.toggleEnabled=function(){this.enabled=!this.enabled},Tooltip.prototype.toggle=function(e){var self=this;e&&(self=$(e.currentTarget).data("bs."+this.type),self||(self=new this.constructor(e.currentTarget,this.getDelegateOptions()),$(e.currentTarget).data("bs."+this.type,self))),self.tip().hasClass("in")?self.leave(self):self.enter(self)},Tooltip.prototype.destroy=function(){clearTimeout(this.timeout),this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var old=$.fn.tooltip;$.fn.tooltip=Plugin,$.fn.tooltip.Constructor=Tooltip,$.fn.tooltip.noConflict=function(){return $.fn.tooltip=old,this}}(jQuery),+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.popover"),options="object"==typeof option&&option;(data||"destroy"!=option)&&(data||$this.data("bs.popover",data=new Popover(this,options)),"string"==typeof option&&data[option]())})}var Popover=function(element,options){this.init("popover",element,options)};if(!$.fn.tooltip)throw new Error("Popover requires tooltip.js");Popover.VERSION="3.2.0",Popover.DEFAULTS=$.extend({},$.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),Popover.prototype=$.extend({},$.fn.tooltip.Constructor.prototype),Popover.prototype.constructor=Popover,Popover.prototype.getDefaults=function(){return Popover.DEFAULTS},Popover.prototype.setContent=function(){var $tip=this.tip(),title=this.getTitle(),content=this.getContent();$tip.find(".popover-title")[this.options.html?"html":"text"](title),$tip.find(".popover-content").empty()[this.options.html?"string"==typeof content?"html":"append":"text"](content),$tip.removeClass("fade top bottom left right in"),$tip.find(".popover-title").html()||$tip.find(".popover-title").hide()},Popover.prototype.hasContent=function(){return this.getTitle()||this.getContent()},Popover.prototype.getContent=function(){var $e=this.$element,o=this.options;return $e.attr("data-content")||("function"==typeof o.content?o.content.call($e[0]):o.content)},Popover.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},Popover.prototype.tip=function(){return this.$tip||(this.$tip=$(this.options.template)),this.$tip};var old=$.fn.popover;$.fn.popover=Plugin,$.fn.popover.Constructor=Popover,$.fn.popover.noConflict=function(){return $.fn.popover=old,this}}(jQuery),+function($){"use strict";function ScrollSpy(element,options){var process=$.proxy(this.process,this);this.$body=$("body"),this.$scrollElement=$($(element).is("body")?window:element),this.options=$.extend({},ScrollSpy.DEFAULTS,options),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",process),this.refresh(),this.process()}function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.scrollspy"),options="object"==typeof option&&option;data||$this.data("bs.scrollspy",data=new ScrollSpy(this,options)),"string"==typeof option&&data[option]()})}ScrollSpy.VERSION="3.2.0",ScrollSpy.DEFAULTS={offset:10},ScrollSpy.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},ScrollSpy.prototype.refresh=function(){var offsetMethod="offset",offsetBase=0;$.isWindow(this.$scrollElement[0])||(offsetMethod="position",offsetBase=this.$scrollElement.scrollTop()),this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight();var self=this;this.$body.find(this.selector).map(function(){var $el=$(this),href=$el.data("target")||$el.attr("href"),$href=/^#./.test(href)&&$(href);return $href&&$href.length&&$href.is(":visible")&&[[$href[offsetMethod]().top+offsetBase,href]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){self.offsets.push(this[0]),self.targets.push(this[1])})},ScrollSpy.prototype.process=function(){var i,scrollTop=this.$scrollElement.scrollTop()+this.options.offset,scrollHeight=this.getScrollHeight(),maxScroll=this.options.offset+scrollHeight-this.$scrollElement.height(),offsets=this.offsets,targets=this.targets,activeTarget=this.activeTarget;if(this.scrollHeight!=scrollHeight&&this.refresh(),scrollTop>=maxScroll)return activeTarget!=(i=targets[targets.length-1])&&this.activate(i);if(activeTarget&&scrollTop<=offsets[0])return activeTarget!=(i=targets[0])&&this.activate(i);for(i=offsets.length;i--;)activeTarget!=targets[i]&&scrollTop>=offsets[i]&&(!offsets[i+1]||scrollTop<=offsets[i+1])&&this.activate(targets[i])},ScrollSpy.prototype.activate=function(target){this.activeTarget=target,$(this.selector).parentsUntil(this.options.target,".active").removeClass("active");var selector=this.selector+'[data-target="'+target+'"],'+this.selector+'[href="'+target+'"]',active=$(selector).parents("li").addClass("active");active.parent(".dropdown-menu").length&&(active=active.closest("li.dropdown").addClass("active")),active.trigger("activate.bs.scrollspy")};var old=$.fn.scrollspy;$.fn.scrollspy=Plugin,$.fn.scrollspy.Constructor=ScrollSpy,$.fn.scrollspy.noConflict=function(){return $.fn.scrollspy=old,this},$(window).on("load.bs.scrollspy.data-api",function(){$('[data-spy="scroll"]').each(function(){var $spy=$(this);Plugin.call($spy,$spy.data())})})}(jQuery),+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.tab");data||$this.data("bs.tab",data=new Tab(this)),"string"==typeof option&&data[option]()})}var Tab=function(element){this.element=$(element)};Tab.VERSION="3.2.0",Tab.prototype.show=function(){var $this=this.element,$ul=$this.closest("ul:not(.dropdown-menu)"),selector=$this.data("target");if(selector||(selector=$this.attr("href"),selector=selector&&selector.replace(/.*(?=#[^\s]*$)/,"")),!$this.parent("li").hasClass("active")){var previous=$ul.find(".active:last a")[0],e=$.Event("show.bs.tab",{relatedTarget:previous});if($this.trigger(e),!e.isDefaultPrevented()){var $target=$(selector);this.activate($this.closest("li"),$ul),this.activate($target,$target.parent(),function(){$this.trigger({type:"shown.bs.tab",relatedTarget:previous})})}}},Tab.prototype.activate=function(element,container,callback){function next(){$active.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),element.addClass("active"),transition?(element[0].offsetWidth,element.addClass("in")):element.removeClass("fade"),element.parent(".dropdown-menu")&&element.closest("li.dropdown").addClass("active"),callback&&callback()}var $active=container.find("> .active"),transition=callback&&$.support.transition&&$active.hasClass("fade");transition?$active.one("bsTransitionEnd",next).emulateTransitionEnd(150):next(),$active.removeClass("in")};var old=$.fn.tab;$.fn.tab=Plugin,$.fn.tab.Constructor=Tab,$.fn.tab.noConflict=function(){return $.fn.tab=old,this},$(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(e){e.preventDefault(),Plugin.call($(this),"show")})}(jQuery),+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.affix"),options="object"==typeof option&&option;data||$this.data("bs.affix",data=new Affix(this,options)),"string"==typeof option&&data[option]()})}var Affix=function(element,options){this.options=$.extend({},Affix.DEFAULTS,options),this.$target=$(this.options.target).on("scroll.bs.affix.data-api",$.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",$.proxy(this.checkPositionWithEventLoop,this)),this.$element=$(element),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};Affix.VERSION="3.2.0",Affix.RESET="affix affix-top affix-bottom",Affix.DEFAULTS={offset:0,target:window},Affix.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(Affix.RESET).addClass("affix");var scrollTop=this.$target.scrollTop(),position=this.$element.offset();return this.pinnedOffset=position.top-scrollTop},Affix.prototype.checkPositionWithEventLoop=function(){setTimeout($.proxy(this.checkPosition,this),1)},Affix.prototype.checkPosition=function(){if(this.$element.is(":visible")){var scrollHeight=$(document).height(),scrollTop=this.$target.scrollTop(),position=this.$element.offset(),offset=this.options.offset,offsetTop=offset.top,offsetBottom=offset.bottom;"object"!=typeof offset&&(offsetBottom=offsetTop=offset),"function"==typeof offsetTop&&(offsetTop=offset.top(this.$element)),"function"==typeof offsetBottom&&(offsetBottom=offset.bottom(this.$element));var affix=null!=this.unpin&&scrollTop+this.unpin<=position.top?!1:null!=offsetBottom&&position.top+this.$element.height()>=scrollHeight-offsetBottom?"bottom":null!=offsetTop&&offsetTop>=scrollTop?"top":!1;if(this.affixed!==affix){null!=this.unpin&&this.$element.css("top","");var affixType="affix"+(affix?"-"+affix:""),e=$.Event(affixType+".bs.affix");this.$element.trigger(e),e.isDefaultPrevented()||(this.affixed=affix,this.unpin="bottom"==affix?this.getPinnedOffset():null,this.$element.removeClass(Affix.RESET).addClass(affixType).trigger($.Event(affixType.replace("affix","affixed"))),"bottom"==affix&&this.$element.offset({top:scrollHeight-this.$element.height()-offsetBottom}))}}};var old=$.fn.affix;$.fn.affix=Plugin,$.fn.affix.Constructor=Affix,$.fn.affix.noConflict=function(){return $.fn.affix=old,this},$(window).on("load",function(){$('[data-spy="affix"]').each(function(){var $spy=$(this),data=$spy.data();data.offset=data.offset||{},data.offsetBottom&&(data.offset.bottom=data.offsetBottom),data.offsetTop&&(data.offset.top=data.offsetTop),Plugin.call($spy,data)})})}(jQuery),function($){$.color={},$.color.make=function(r,g,b,a){var o={};return o.r=r||0,o.g=g||0,o.b=b||0,o.a=null!=a?a:1,o.add=function(c,d){for(var i=0;i=1?"rgb("+[o.r,o.g,o.b].join(",")+")":"rgba("+[o.r,o.g,o.b,o.a].join(",")+")"},o.normalize=function(){function clamp(min,value,max){return min>value?min:value>max?max:value}return o.r=clamp(0,parseInt(o.r),255),o.g=clamp(0,parseInt(o.g),255),o.b=clamp(0,parseInt(o.b),255),o.a=clamp(0,o.a,1),o},o.clone=function(){return $.color.make(o.r,o.b,o.g,o.a)},o.normalize()},$.color.extract=function(elem,css){var c;do{if(c=elem.css(css).toLowerCase(),""!=c&&"transparent"!=c)break;elem=elem.parent()}while(elem.length&&!$.nodeName(elem.get(0),"body"));return"rgba(0, 0, 0, 0)"==c&&(c="transparent"),$.color.parse(c)},$.color.parse=function(str){var res,m=$.color.make;if(res=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10));if(res=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10),parseFloat(res[4]));if(res=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str))return m(2.55*parseFloat(res[1]),2.55*parseFloat(res[2]),2.55*parseFloat(res[3]));if(res=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(2.55*parseFloat(res[1]),2.55*parseFloat(res[2]),2.55*parseFloat(res[3]),parseFloat(res[4]));if(res=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str))return m(parseInt(res[1],16),parseInt(res[2],16),parseInt(res[3],16));if(res=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str))return m(parseInt(res[1]+res[1],16),parseInt(res[2]+res[2],16),parseInt(res[3]+res[3],16));var name=$.trim(str).toLowerCase();return"transparent"==name?m(255,255,255,0):(res=lookupColors[name]||[0,0,0],m(res[0],res[1],res[2]))};var lookupColors={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}}(jQuery),function($){function Canvas(cls,container){var element=container.children("."+cls)[0];if(null==element&&(element=document.createElement("canvas"),element.className=cls,$(element).css({direction:"ltr",position:"absolute",left:0,top:0}).appendTo(container),!element.getContext)){if(!window.G_vmlCanvasManager)throw new Error("Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode.");element=window.G_vmlCanvasManager.initElement(element)}this.element=element;var context=this.context=element.getContext("2d"),devicePixelRatio=window.devicePixelRatio||1,backingStoreRatio=context.webkitBackingStorePixelRatio||context.mozBackingStorePixelRatio||context.msBackingStorePixelRatio||context.oBackingStorePixelRatio||context.backingStorePixelRatio||1;this.pixelRatio=devicePixelRatio/backingStoreRatio,this.resize(container.width(),container.height()),this.textContainer=null,this.text={},this._textCache={}}function Plot(placeholder,data_,options_,plugins){function executeHooks(hook,args){args=[plot].concat(args);for(var i=0;ii;++i)axisOptions=options.xaxes[i],axisOptions&&!axisOptions.tickColor&&(axisOptions.tickColor=axisOptions.color),axisOptions=$.extend(!0,{},options.xaxis,axisOptions),options.xaxes[i]=axisOptions,axisOptions.font&&(axisOptions.font=$.extend({},fontDefaults,axisOptions.font),axisOptions.font.color||(axisOptions.font.color=axisOptions.color),axisOptions.font.lineHeight||(axisOptions.font.lineHeight=Math.round(1.15*axisOptions.font.size)));for(axisCount=options.yaxes.length||1,i=0;axisCount>i;++i)axisOptions=options.yaxes[i],axisOptions&&!axisOptions.tickColor&&(axisOptions.tickColor=axisOptions.color),axisOptions=$.extend(!0,{},options.yaxis,axisOptions),options.yaxes[i]=axisOptions,axisOptions.font&&(axisOptions.font=$.extend({},fontDefaults,axisOptions.font),axisOptions.font.color||(axisOptions.font.color=axisOptions.color),axisOptions.font.lineHeight||(axisOptions.font.lineHeight=Math.round(1.15*axisOptions.font.size)));for(options.xaxis.noTicks&&null==options.xaxis.ticks&&(options.xaxis.ticks=options.xaxis.noTicks),options.yaxis.noTicks&&null==options.yaxis.ticks&&(options.yaxis.ticks=options.yaxis.noTicks),options.x2axis&&(options.xaxes[1]=$.extend(!0,{},options.xaxis,options.x2axis),options.xaxes[1].position="top",null==options.x2axis.min&&(options.xaxes[1].min=null),null==options.x2axis.max&&(options.xaxes[1].max=null)),options.y2axis&&(options.yaxes[1]=$.extend(!0,{},options.yaxis,options.y2axis),options.yaxes[1].position="right",null==options.y2axis.min&&(options.yaxes[1].min=null),null==options.y2axis.max&&(options.yaxes[1].max=null)),options.grid.coloredAreas&&(options.grid.markings=options.grid.coloredAreas),options.grid.coloredAreasColor&&(options.grid.markingsColor=options.grid.coloredAreasColor),options.lines&&$.extend(!0,options.series.lines,options.lines),options.points&&$.extend(!0,options.series.points,options.points),options.bars&&$.extend(!0,options.series.bars,options.bars),null!=options.shadowSize&&(options.series.shadowSize=options.shadowSize),null!=options.highlightColor&&(options.series.highlightColor=options.highlightColor),i=0;imaxIndex&&(maxIndex=sc))}maxIndex>=neededColors&&(neededColors=maxIndex+1);var c,colors=[],colorPool=options.colors,colorPoolSize=colorPool.length,variation=0;for(i=0;neededColors>i;i++)c=$.color.parse(colorPool[i%colorPoolSize]||"#666"),i%colorPoolSize==0&&i&&(variation=variation>=0?.5>variation?-variation-.2:0:-variation),colors[i]=c.scale("rgb",1+variation);var s,colori=0;for(i=0;iaxis.datamax&&max!=fakeInfinity&&(axis.datamax=max)}var i,j,k,m,s,points,ps,val,f,p,data,format,topSentry=Number.POSITIVE_INFINITY,bottomSentry=Number.NEGATIVE_INFINITY,fakeInfinity=Number.MAX_VALUE;for($.each(allAxes(),function(_,axis){axis.datamin=topSentry,axis.datamax=bottomSentry,axis.used=!1}),i=0;im;++m)val=p[m],f=format[m],f&&(f.number&&null!=val&&(val=+val,isNaN(val)?val=null:val==1/0?val=fakeInfinity:val==-(1/0)&&(val=-fakeInfinity)),null==val&&(f.required&&(nullify=!0),null!=f.defaultValue&&(val=f.defaultValue))),points[k+m]=val;if(nullify)for(m=0;ps>m;++m)val=points[k+m],null!=val&&(f=format[m],f.autoscale!==!1&&(f.x&&updateAxis(s.xaxis,val,val),f.y&&updateAxis(s.yaxis,val,val))),points[k+m]=null;else if(insertSteps&&k>0&&null!=points[k-ps]&&points[k-ps]!=points[k]&&points[k-ps+1]!=points[k+1]){for(m=0;ps>m;++m)points[k+ps+m]=points[k+m];points[k+1]=points[k-ps+1],k+=ps}}}}for(i=0;im;++m)val=points[j+m],f=format[m],f&&f.autoscale!==!1&&val!=fakeInfinity&&val!=-fakeInfinity&&(f.x&&(xmin>val&&(xmin=val),val>xmax&&(xmax=val)),f.y&&(ymin>val&&(ymin=val),val>ymax&&(ymax=val)));if(s.bars.show){var delta;switch(s.bars.align){case"left":delta=0;break;case"right":delta=-s.bars.barWidth;break;default:delta=-s.bars.barWidth/2}s.bars.horizontal?(ymin+=delta,ymax+=delta+s.bars.barWidth):(xmin+=delta,xmax+=delta+s.bars.barWidth)}updateAxis(s.xaxis,xmin,xmax),updateAxis(s.yaxis,ymin,ymax)}$.each(allAxes(),function(_,axis){axis.datamin==topSentry&&(axis.datamin=null),axis.datamax==bottomSentry&&(axis.datamax=null)})}function setupCanvases(){placeholder.css("padding",0).children().filter(function(){return!$(this).hasClass("flot-overlay")&&!$(this).hasClass("flot-base")}).remove(),"static"==placeholder.css("position")&&placeholder.css("position","relative"),surface=new Canvas("flot-base",placeholder),overlay=new Canvas("flot-overlay",placeholder),ctx=surface.context,octx=overlay.context,eventHolder=$(overlay.element).unbind();var existing=placeholder.data("plot");existing&&(existing.shutdown(),overlay.clear()),placeholder.data("plot",plot)}function bindEvents(){options.grid.hoverable&&(eventHolder.mousemove(onMouseMove),eventHolder.bind("mouseleave",onMouseLeave)),options.grid.clickable&&eventHolder.click(onClick),executeHooks(hooks.bindEvents,[eventHolder])}function shutdown(){redrawTimeout&&clearTimeout(redrawTimeout),eventHolder.unbind("mousemove",onMouseMove),eventHolder.unbind("mouseleave",onMouseLeave),eventHolder.unbind("click",onClick),executeHooks(hooks.shutdown,[eventHolder])}function setTransformationHelpers(axis){function identity(x){return x}var s,m,t=axis.options.transform||identity,it=axis.options.inverseTransform;"x"==axis.direction?(s=axis.scale=plotWidth/Math.abs(t(axis.max)-t(axis.min)),m=Math.min(t(axis.max),t(axis.min))):(s=axis.scale=plotHeight/Math.abs(t(axis.max)-t(axis.min)),s=-s,m=Math.max(t(axis.max),t(axis.min))),t==identity?axis.p2c=function(p){return(p-m)*s}:axis.p2c=function(p){return(t(p)-m)*s},it?axis.c2p=function(c){return it(m+c/s)}:axis.c2p=function(c){return m+c/s}}function measureTickLabels(axis){for(var opts=axis.options,ticks=axis.ticks||[],labelWidth=opts.labelWidth||0,labelHeight=opts.labelHeight||0,maxWidth=labelWidth||("x"==axis.direction?Math.floor(surface.width/(ticks.length||1)):null),legacyStyles=axis.direction+"Axis "+axis.direction+axis.n+"Axis",layer="flot-"+axis.direction+"-axis flot-"+axis.direction+axis.n+"-axis "+legacyStyles,font=opts.font||"flot-tick-label tickLabel",i=0;i=0;--i)allocateAxisBoxFirstPhase(allocatedAxes[i]);adjustLayoutForThingsStickingOut(),$.each(allocatedAxes,function(_,axis){allocateAxisBoxSecondPhase(axis)})}plotWidth=surface.width-plotOffset.left-plotOffset.right,plotHeight=surface.height-plotOffset.bottom-plotOffset.top,$.each(axes,function(_,axis){setTransformationHelpers(axis)}),showGrid&&drawAxisLabels(),insertLegend()}function setRange(axis){var opts=axis.options,min=+(null!=opts.min?opts.min:axis.datamin),max=+(null!=opts.max?opts.max:axis.datamax),delta=max-min;if(0==delta){var widen=0==max?1:.01;null==opts.min&&(min-=widen),(null==opts.max||null!=opts.min)&&(max+=widen)}else{var margin=opts.autoscaleMargin;null!=margin&&(null==opts.min&&(min-=delta*margin,0>min&&null!=axis.datamin&&axis.datamin>=0&&(min=0)),null==opts.max&&(max+=delta*margin,max>0&&null!=axis.datamax&&axis.datamax<=0&&(max=0)))}axis.min=min,axis.max=max}function setupTickGeneration(axis){var noTicks,opts=axis.options;noTicks="number"==typeof opts.ticks&&opts.ticks>0?opts.ticks:.3*Math.sqrt("x"==axis.direction?surface.width:surface.height);var delta=(axis.max-axis.min)/noTicks,dec=-Math.floor(Math.log(delta)/Math.LN10),maxDec=opts.tickDecimals;null!=maxDec&&dec>maxDec&&(dec=maxDec);var size,magn=Math.pow(10,-dec),norm=delta/magn;if(1.5>norm?size=1:3>norm?(size=2,norm>2.25&&(null==maxDec||maxDec>=dec+1)&&(size=2.5,++dec)):size=7.5>norm?5:10,size*=magn,null!=opts.minTickSize&&size0&&(null==opts.min&&(axis.min=Math.min(axis.min,niceTicks[0])),null==opts.max&&niceTicks.length>1&&(axis.max=Math.max(axis.max,niceTicks[niceTicks.length-1]))),axis.tickGenerator=function(axis){var v,i,ticks=[];for(i=0;i1&&/\..*0$/.test((ts[1]-ts[0]).toFixed(extraDec))||(axis.tickDecimals=extraDec)}}}}function setTicks(axis){var oticks=axis.options.ticks,ticks=[];null==oticks||"number"==typeof oticks&&oticks>0?ticks=axis.tickGenerator(axis):oticks&&(ticks=$.isFunction(oticks)?oticks(axis):oticks);var i,v;for(axis.ticks=[],i=0;i1&&(label=t[1])):v=+t,null==label&&(label=axis.tickFormatter(v,axis)),isNaN(v)||axis.ticks.push({v:v,label:label})}}function snapRangeToTicks(axis,ticks){axis.options.autoscaleMargin&&ticks.length>0&&(null==axis.options.min&&(axis.min=Math.min(axis.min,ticks[0].v)),null==axis.options.max&&ticks.length>1&&(axis.max=Math.max(axis.max,ticks[ticks.length-1].v)))}function draw(){surface.clear(),executeHooks(hooks.drawBackground,[ctx]);var grid=options.grid;grid.show&&grid.backgroundColor&&drawBackground(),grid.show&&!grid.aboveData&&drawGrid();for(var i=0;ito){var tmp=from;from=to,to=tmp}return{from:from,to:to,axis:axis}}function drawBackground(){ctx.save(),ctx.translate(plotOffset.left,plotOffset.top),ctx.fillStyle=getColorOrGradient(options.grid.backgroundColor,plotHeight,0,"rgba(255, 255, 255, 0)"),ctx.fillRect(0,0,plotWidth,plotHeight),ctx.restore()}function drawGrid(){var i,axes,bw,bc;ctx.save(),ctx.translate(plotOffset.left,plotOffset.top);var markings=options.grid.markings;if(markings)for($.isFunction(markings)&&(axes=plot.getAxes(),axes.xmin=axes.xaxis.min,axes.xmax=axes.xaxis.max,axes.ymin=axes.yaxis.min,axes.ymax=axes.yaxis.max,markings=markings(axes)),i=0;ixrange.axis.max||yrange.toyrange.axis.max)){xrange.from=Math.max(xrange.from,xrange.axis.min),xrange.to=Math.min(xrange.to,xrange.axis.max),yrange.from=Math.max(yrange.from,yrange.axis.min),yrange.to=Math.min(yrange.to,yrange.axis.max);var xequal=xrange.from===xrange.to,yequal=yrange.from===yrange.to;if(!xequal||!yequal)if(xrange.from=Math.floor(xrange.axis.p2c(xrange.from)),xrange.to=Math.floor(xrange.axis.p2c(xrange.to)),yrange.from=Math.floor(yrange.axis.p2c(yrange.from)),yrange.to=Math.floor(yrange.axis.p2c(yrange.to)),xequal||yequal){var lineWidth=m.lineWidth||options.grid.markingsLineWidth,subPixel=lineWidth%2?.5:0;ctx.beginPath(),ctx.strokeStyle=m.color||options.grid.markingsColor,ctx.lineWidth=lineWidth,xequal?(ctx.moveTo(xrange.to+subPixel,yrange.from),ctx.lineTo(xrange.to+subPixel,yrange.to)):(ctx.moveTo(xrange.from,yrange.to+subPixel),ctx.lineTo(xrange.to,yrange.to+subPixel)),ctx.stroke()}else ctx.fillStyle=m.color||options.grid.markingsColor,ctx.fillRect(xrange.from,yrange.to,xrange.to-xrange.from,yrange.from-yrange.to)}}axes=allAxes(),bw=options.grid.borderWidth;for(var j=0;jaxis.max||"full"==t&&("object"==typeof bw&&bw[axis.position]>0||bw>0)&&(v==axis.min||v==axis.max)||("x"==axis.direction?(x=axis.p2c(v),yoff="full"==t?-plotHeight:t,"top"==axis.position&&(yoff=-yoff)):(y=axis.p2c(v),xoff="full"==t?-plotWidth:t,"left"==axis.position&&(xoff=-xoff)),1==ctx.lineWidth&&("x"==axis.direction?x=Math.floor(x)+.5:y=Math.floor(y)+.5),ctx.moveTo(x,y),ctx.lineTo(x+xoff,y+yoff))}ctx.stroke()}}bw&&(bc=options.grid.borderColor,"object"==typeof bw||"object"==typeof bc?("object"!=typeof bw&&(bw={top:bw,right:bw,bottom:bw,left:bw}),"object"!=typeof bc&&(bc={top:bc,right:bc,bottom:bc,left:bc}),bw.top>0&&(ctx.strokeStyle=bc.top,ctx.lineWidth=bw.top,ctx.beginPath(),ctx.moveTo(0-bw.left,0-bw.top/2),ctx.lineTo(plotWidth,0-bw.top/2),ctx.stroke()),bw.right>0&&(ctx.strokeStyle=bc.right,ctx.lineWidth=bw.right,ctx.beginPath(),ctx.moveTo(plotWidth+bw.right/2,0-bw.top),ctx.lineTo(plotWidth+bw.right/2,plotHeight),ctx.stroke()),bw.bottom>0&&(ctx.strokeStyle=bc.bottom,ctx.lineWidth=bw.bottom,ctx.beginPath(),ctx.moveTo(plotWidth+bw.right,plotHeight+bw.bottom/2),ctx.lineTo(0,plotHeight+bw.bottom/2),ctx.stroke()),bw.left>0&&(ctx.strokeStyle=bc.left,ctx.lineWidth=bw.left,ctx.beginPath(),ctx.moveTo(0-bw.left/2,plotHeight+bw.bottom),ctx.lineTo(0-bw.left/2,0),ctx.stroke())):(ctx.lineWidth=bw,ctx.strokeStyle=options.grid.borderColor,ctx.strokeRect(-bw/2,-bw/2,plotWidth+bw,plotHeight+bw))),ctx.restore()}function drawAxisLabels(){$.each(allAxes(),function(_,axis){var tick,x,y,halign,valign,box=axis.box,legacyStyles=axis.direction+"Axis "+axis.direction+axis.n+"Axis",layer="flot-"+axis.direction+"-axis flot-"+axis.direction+axis.n+"-axis "+legacyStyles,font=axis.options.font||"flot-tick-label tickLabel";if(surface.removeText(layer),axis.show&&0!=axis.ticks.length)for(var i=0;iaxis.max||("x"==axis.direction?(halign="center",x=plotOffset.left+axis.p2c(tick.v),"bottom"==axis.position?y=box.top+box.padding:(y=box.top+box.height-box.padding,valign="bottom")):(valign="middle",y=plotOffset.top+axis.p2c(tick.v),"left"==axis.position?(x=box.left+box.width-box.padding,halign="right"):x=box.left+box.padding),surface.addText(layer,x,y,tick.label,font,null,null,halign,valign))})}function drawSeries(series){series.lines.show&&drawSeriesLines(series),series.bars.show&&drawSeriesBars(series),series.points.show&&drawSeriesPoints(series)}function drawSeriesLines(series){function plotLine(datapoints,xoffset,yoffset,axisx,axisy){var points=datapoints.points,ps=datapoints.pointsize,prevx=null,prevy=null;ctx.beginPath();for(var i=ps;i=y1&&y1=y2&&y2=y2&&y1>axisy.max){if(y2>axisy.max)continue;x1=(axisy.max-y1)/(y2-y1)*(x2-x1)+x1,y1=axisy.max}else if(y2>=y1&&y2>axisy.max){if(y1>axisy.max)continue;x2=(axisy.max-y1)/(y2-y1)*(x2-x1)+x1,y2=axisy.max}if(x2>=x1&&x1=x2&&x2=x2&&x1>axisx.max){if(x2>axisx.max)continue;y1=(axisx.max-x1)/(x2-x1)*(y2-y1)+y1,x1=axisx.max}else if(x2>=x1&&x2>axisx.max){if(x1>axisx.max)continue;y2=(axisx.max-x1)/(x2-x1)*(y2-y1)+y1,x2=axisx.max}(x1!=prevx||y1!=prevy)&&ctx.moveTo(axisx.p2c(x1)+xoffset,axisy.p2c(y1)+yoffset),prevx=x2,prevy=y2,ctx.lineTo(axisx.p2c(x2)+xoffset,axisy.p2c(y2)+yoffset)}}ctx.stroke()}function plotLineArea(datapoints,axisx,axisy){for(var points=datapoints.points,ps=datapoints.pointsize,bottom=Math.min(Math.max(0,axisy.min),axisy.max),i=0,areaOpen=!1,ypos=1,segmentStart=0,segmentEnd=0;;){if(ps>0&&i>points.length+ps)break;i+=ps;var x1=points[i-ps],y1=points[i-ps+ypos],x2=points[i],y2=points[i+ypos];if(areaOpen){if(ps>0&&null!=x1&&null==x2){segmentEnd=i,ps=-ps,ypos=2;continue}if(0>ps&&i==segmentStart+ps){ctx.fill(),areaOpen=!1,ps=-ps,ypos=1,i=segmentStart=segmentEnd+ps;continue}}if(null!=x1&&null!=x2){if(x2>=x1&&x1=x2&&x2=x2&&x1>axisx.max){if(x2>axisx.max)continue;y1=(axisx.max-x1)/(x2-x1)*(y2-y1)+y1,x1=axisx.max}else if(x2>=x1&&x2>axisx.max){if(x1>axisx.max)continue;y2=(axisx.max-x1)/(x2-x1)*(y2-y1)+y1,x2=axisx.max}if(areaOpen||(ctx.beginPath(),ctx.moveTo(axisx.p2c(x1),axisy.p2c(bottom)),areaOpen=!0),y1>=axisy.max&&y2>=axisy.max)ctx.lineTo(axisx.p2c(x1),axisy.p2c(axisy.max)),ctx.lineTo(axisx.p2c(x2),axisy.p2c(axisy.max));else if(y1<=axisy.min&&y2<=axisy.min)ctx.lineTo(axisx.p2c(x1),axisy.p2c(axisy.min)),ctx.lineTo(axisx.p2c(x2),axisy.p2c(axisy.min));else{var x1old=x1,x2old=x2;y2>=y1&&y1=axisy.min?(x1=(axisy.min-y1)/(y2-y1)*(x2-x1)+x1,y1=axisy.min):y1>=y2&&y2=axisy.min&&(x2=(axisy.min-y1)/(y2-y1)*(x2-x1)+x1,y2=axisy.min),y1>=y2&&y1>axisy.max&&y2<=axisy.max?(x1=(axisy.max-y1)/(y2-y1)*(x2-x1)+x1,y1=axisy.max):y2>=y1&&y2>axisy.max&&y1<=axisy.max&&(x2=(axisy.max-y1)/(y2-y1)*(x2-x1)+x1,y2=axisy.max),x1!=x1old&&ctx.lineTo(axisx.p2c(x1old),axisy.p2c(y1)),ctx.lineTo(axisx.p2c(x1),axisy.p2c(y1)),ctx.lineTo(axisx.p2c(x2),axisy.p2c(y2)),x2!=x2old&&(ctx.lineTo(axisx.p2c(x2),axisy.p2c(y2)),ctx.lineTo(axisx.p2c(x2old),axisy.p2c(y2)))}}}}ctx.save(),ctx.translate(plotOffset.left,plotOffset.top),ctx.lineJoin="round";var lw=series.lines.lineWidth,sw=series.shadowSize;if(lw>0&&sw>0){ctx.lineWidth=sw,ctx.strokeStyle="rgba(0,0,0,0.1)";var angle=Math.PI/18;plotLine(series.datapoints,Math.sin(angle)*(lw/2+sw/2),Math.cos(angle)*(lw/2+sw/2),series.xaxis,series.yaxis),ctx.lineWidth=sw/2,plotLine(series.datapoints,Math.sin(angle)*(lw/2+sw/4),Math.cos(angle)*(lw/2+sw/4),series.xaxis,series.yaxis)}ctx.lineWidth=lw,ctx.strokeStyle=series.color;var fillStyle=getFillStyle(series.lines,series.color,0,plotHeight);fillStyle&&(ctx.fillStyle=fillStyle,plotLineArea(series.datapoints,series.xaxis,series.yaxis)),lw>0&&plotLine(series.datapoints,0,0,series.xaxis,series.yaxis),ctx.restore()}function drawSeriesPoints(series){function plotPoints(datapoints,radius,fillStyle,offset,shadow,axisx,axisy,symbol){for(var points=datapoints.points,ps=datapoints.pointsize,i=0;iaxisx.max||yaxisy.max||(ctx.beginPath(),x=axisx.p2c(x),y=axisy.p2c(y)+offset,"circle"==symbol?ctx.arc(x,y,radius,0,shadow?Math.PI:2*Math.PI,!1):symbol(ctx,x,y,radius,shadow),ctx.closePath(),fillStyle&&(ctx.fillStyle=fillStyle,ctx.fill()),ctx.stroke())}}ctx.save(),ctx.translate(plotOffset.left,plotOffset.top);var lw=series.points.lineWidth,sw=series.shadowSize,radius=series.points.radius,symbol=series.points.symbol;if(0==lw&&(lw=1e-4),lw>0&&sw>0){var w=sw/2;ctx.lineWidth=w,ctx.strokeStyle="rgba(0,0,0,0.1)",plotPoints(series.datapoints,radius,null,w+w/2,!0,series.xaxis,series.yaxis,symbol),ctx.strokeStyle="rgba(0,0,0,0.2)",plotPoints(series.datapoints,radius,null,w/2,!0,series.xaxis,series.yaxis,symbol)}ctx.lineWidth=lw,ctx.strokeStyle=series.color,plotPoints(series.datapoints,radius,getFillStyle(series.points,series.color),0,!1,series.xaxis,series.yaxis,symbol),ctx.restore()}function drawBar(x,y,b,barLeft,barRight,fillStyleCallback,axisx,axisy,c,horizontal,lineWidth){var left,right,bottom,top,drawLeft,drawRight,drawTop,drawBottom,tmp;horizontal?(drawBottom=drawRight=drawTop=!0,drawLeft=!1,left=b,right=x,top=y+barLeft,bottom=y+barRight,left>right&&(tmp=right,right=left,left=tmp,drawLeft=!0,drawRight=!1)):(drawLeft=drawRight=drawTop=!0,drawBottom=!1,left=x+barLeft,right=x+barRight,bottom=b,top=y,bottom>top&&(tmp=top,top=bottom,bottom=tmp,drawBottom=!0,drawTop=!1)),rightaxisx.max||topaxisy.max||(leftaxisx.max&&(right=axisx.max,drawRight=!1),bottomaxisy.max&&(top=axisy.max,drawTop=!1),left=axisx.p2c(left),bottom=axisy.p2c(bottom),right=axisx.p2c(right),top=axisy.p2c(top),fillStyleCallback&&(c.fillStyle=fillStyleCallback(bottom,top),c.fillRect(left,top,right-left,bottom-top)),lineWidth>0&&(drawLeft||drawRight||drawTop||drawBottom)&&(c.beginPath(),c.moveTo(left,bottom),drawLeft?c.lineTo(left,top):c.moveTo(left,top),drawTop?c.lineTo(right,top):c.moveTo(right,top),drawRight?c.lineTo(right,bottom):c.moveTo(right,bottom),drawBottom?c.lineTo(left,bottom):c.moveTo(left,bottom),c.stroke()))}function drawSeriesBars(series){function plotBars(datapoints,barLeft,barRight,fillStyleCallback,axisx,axisy){for(var points=datapoints.points,ps=datapoints.pointsize,i=0;i"),fragments.push(""),rowStarted=!0),fragments.push(''+entry.label+" ")}if(rowStarted&&fragments.push(" "),0!=fragments.length){var table='";if(null!=options.legend.container)$(options.legend.container).html(table);else{var pos="",p=options.legend.position,m=options.legend.margin;null==m[0]&&(m=[m,m]),"n"==p.charAt(0)?pos+="top:"+(m[1]+plotOffset.top)+"px;":"s"==p.charAt(0)&&(pos+="bottom:"+(m[1]+plotOffset.bottom)+"px;"),"e"==p.charAt(1)?pos+="right:"+(m[0]+plotOffset.right)+"px;":"w"==p.charAt(1)&&(pos+="left:"+(m[0]+plotOffset.left)+"px;");var legend=$(''+table.replace('style="','style="position:absolute;'+pos+";")+"
").appendTo(placeholder);if(0!=options.legend.backgroundOpacity){var c=options.legend.backgroundColor;null==c&&(c=options.grid.backgroundColor,c=c&&"string"==typeof c?$.color.parse(c):$.color.extract(legend,"background-color"),c.a=1,c=c.toString());var div=legend.children();$('
').prependTo(legend).css("opacity",options.legend.backgroundOpacity)}}}}}function findNearbyItem(mouseX,mouseY,seriesFilter){var i,j,ps,maxDistance=options.grid.mouseActiveRadius,smallestDistance=maxDistance*maxDistance+1,item=null;for(i=series.length-1;i>=0;--i)if(seriesFilter(series[i])){var s=series[i],axisx=s.xaxis,axisy=s.yaxis,points=s.datapoints.points,mx=axisx.c2p(mouseX),my=axisy.c2p(mouseY),maxx=maxDistance/axisx.scale,maxy=maxDistance/axisy.scale;if(ps=s.datapoints.pointsize,axisx.options.inverseTransform&&(maxx=Number.MAX_VALUE),axisy.options.inverseTransform&&(maxy=Number.MAX_VALUE),s.lines.show||s.points.show)for(j=0;jmaxx||-maxx>x-mx||y-my>maxy||-maxy>y-my)){var dx=Math.abs(axisx.p2c(x)-mouseX),dy=Math.abs(axisy.p2c(y)-mouseY),dist=dx*dx+dy*dy;smallestDistance>dist&&(smallestDistance=dist,item=[i,j/ps])}}if(s.bars.show&&!item){var barLeft,barRight;switch(s.bars.align){case"left":barLeft=0;break;case"right":barLeft=-s.bars.barWidth;break;default:barLeft=-s.bars.barWidth/2}for(barRight=barLeft+s.bars.barWidth,j=0;j=Math.min(b,x)&&my>=y+barLeft&&y+barRight>=my:mx>=x+barLeft&&x+barRight>=mx&&my>=Math.min(b,y)&&my<=Math.max(b,y))&&(item=[i,j/ps])}}}return item?(i=item[0],j=item[1],ps=series[i].datapoints.pointsize,{datapoint:series[i].datapoints.points.slice(j*ps,(j+1)*ps),dataIndex:j,series:series[i],seriesIndex:i}):null}function onMouseMove(e){options.grid.hoverable&&triggerClickHoverEvent("plothover",e,function(s){return 0!=s.hoverable})}function onMouseLeave(e){options.grid.hoverable&&triggerClickHoverEvent("plothover",e,function(s){return!1})}function onClick(e){triggerClickHoverEvent("plotclick",e,function(s){return 0!=s.clickable})}function triggerClickHoverEvent(eventname,event,seriesFilter){var offset=eventHolder.offset(),canvasX=event.pageX-offset.left-plotOffset.left,canvasY=event.pageY-offset.top-plotOffset.top,pos=canvasToAxisCoords({left:canvasX,top:canvasY});pos.pageX=event.pageX,pos.pageY=event.pageY;var item=findNearbyItem(canvasX,canvasY,seriesFilter);if(item&&(item.pageX=parseInt(item.series.xaxis.p2c(item.datapoint[0])+offset.left+plotOffset.left,10),item.pageY=parseInt(item.series.yaxis.p2c(item.datapoint[1])+offset.top+plotOffset.top,10)),options.grid.autoHighlight){for(var i=0;iaxisx.max||yaxisy.max)){var pointRadius=series.points.radius+series.points.lineWidth/2;octx.lineWidth=pointRadius,octx.strokeStyle=highlightColor;var radius=1.5*pointRadius;x=axisx.p2c(x),y=axisy.p2c(y),octx.beginPath(),"circle"==series.points.symbol?octx.arc(x,y,radius,0,2*Math.PI,!1):series.points.symbol(octx,x,y,radius,!1),octx.closePath(),octx.stroke()}}function drawBarHighlight(series,point){var barLeft,highlightColor="string"==typeof series.highlightColor?series.highlightColor:$.color.parse(series.color).scale("a",.5).toString(),fillStyle=highlightColor;switch(series.bars.align){case"left":barLeft=0;break;case"right":barLeft=-series.bars.barWidth;break;default:barLeft=-series.bars.barWidth/2}octx.lineWidth=series.bars.lineWidth,octx.strokeStyle=highlightColor,drawBar(point[0],point[1],point[2]||0,barLeft,barLeft+series.bars.barWidth,function(){return fillStyle},series.xaxis,series.yaxis,octx,series.bars.horizontal,series.bars.lineWidth)}function getColorOrGradient(spec,bottom,top,defaultColor){if("string"==typeof spec)return spec;for(var gradient=ctx.createLinearGradient(0,top,0,bottom),i=0,l=spec.colors.length;l>i;++i){var c=spec.colors[i];if("string"!=typeof c){var co=$.color.parse(defaultColor);null!=c.brightness&&(co=co.scale("rgb",c.brightness)),null!=c.opacity&&(co.a*=c.opacity),c=co.toString()}gradient.addColorStop(i/(l-1),c)}return gradient}var series=[],options={colors:["#edc240","#afd8f8","#cb4b4b","#4da74d","#9440ed"],legend:{show:!0,noColumns:1,labelFormatter:null,labelBoxBorderColor:"#ccc",container:null,position:"ne",margin:5,backgroundColor:null,backgroundOpacity:.85,sorted:null},xaxis:{show:null,position:"bottom",mode:null,font:null,color:null,tickColor:null,transform:null,inverseTransform:null,min:null,max:null,autoscaleMargin:null,ticks:null,tickFormatter:null,labelWidth:null,labelHeight:null,reserveSpace:null,tickLength:null,alignTicksWithAxis:null,tickDecimals:null,tickSize:null,minTickSize:null},yaxis:{autoscaleMargin:.02,position:"left"},xaxes:[],yaxes:[],series:{points:{show:!1,radius:3,lineWidth:2,fill:!0,fillColor:"#ffffff",symbol:"circle"},lines:{lineWidth:2,fill:!1,fillColor:null,steps:!1},bars:{show:!1,lineWidth:2,barWidth:1,fill:!0,fillColor:null,align:"left",horizontal:!1,zero:!0},shadowSize:3,highlightColor:null},grid:{show:!0,aboveData:!1,color:"#545454",backgroundColor:null,borderColor:null,tickColor:null,margin:0,labelMargin:5,axisMargin:8,borderWidth:2,minBorderMargin:null,markings:null,markingsColor:"#f4f4f4",markingsLineWidth:2,clickable:!1,hoverable:!1,autoHighlight:!0,mouseActiveRadius:10},interaction:{redrawOverlayInterval:1e3/60},hooks:{}},surface=null,overlay=null,eventHolder=null,ctx=null,octx=null,xaxes=[],yaxes=[],plotOffset={left:0,right:0,top:0,bottom:0},plotWidth=0,plotHeight=0,hooks={processOptions:[],processRawData:[],processDatapoints:[],processOffset:[],drawBackground:[],drawSeries:[],draw:[],bindEvents:[],drawOverlay:[],shutdown:[]},plot=this;plot.setData=setData,plot.setupGrid=setupGrid,plot.draw=draw,plot.getPlaceholder=function(){return placeholder},plot.getCanvas=function(){return surface.element},plot.getPlotOffset=function(){return plotOffset},plot.width=function(){return plotWidth},plot.height=function(){return plotHeight},plot.offset=function(){var o=eventHolder.offset();return o.left+=plotOffset.left,o.top+=plotOffset.top,o},plot.getData=function(){return series},plot.getAxes=function(){var res={};return $.each(xaxes.concat(yaxes),function(_,axis){axis&&(res[axis.direction+(1!=axis.n?axis.n:"")+"axis"]=axis)}),res},plot.getXAxes=function(){return xaxes},plot.getYAxes=function(){return yaxes},plot.c2p=canvasToAxisCoords,plot.p2c=axisToCanvasCoords,plot.getOptions=function(){return options},plot.highlight=highlight,plot.unhighlight=unhighlight,plot.triggerRedrawOverlay=triggerRedrawOverlay,plot.pointOffset=function(point){return{left:parseInt(xaxes[axisNumber(point,"x")-1].p2c(+point.x)+plotOffset.left,10),top:parseInt(yaxes[axisNumber(point,"y")-1].p2c(+point.y)+plotOffset.top,10)}},plot.shutdown=shutdown,plot.destroy=function(){shutdown(),placeholder.removeData("plot").empty(),series=[],options=null,surface=null,overlay=null,eventHolder=null,ctx=null,octx=null,xaxes=[],yaxes=[],hooks=null,highlights=[],plot=null},plot.resize=function(){var width=placeholder.width(),height=placeholder.height();surface.resize(width,height),overlay.resize(width,height)},plot.hooks=hooks,initPlugins(plot),parseOptions(options_),setupCanvases(),setData(data_),setupGrid(),draw(),bindEvents();var highlights=[],redrawTimeout=null}function floorInBase(n,base){return base*Math.floor(n/base)}var hasOwnProperty=Object.prototype.hasOwnProperty;$.fn.detach||($.fn.detach=function(){return this.each(function(){this.parentNode&&this.parentNode.removeChild(this)})}),Canvas.prototype.resize=function(width,height){if(0>=width||0>=height)throw new Error("Invalid dimensions for plot, width = "+width+", height = "+height);var element=this.element,context=this.context,pixelRatio=this.pixelRatio;this.width!=width&&(element.width=width*pixelRatio,element.style.width=width+"px",this.width=width),this.height!=height&&(element.height=height*pixelRatio,
-element.style.height=height+"px",this.height=height),context.restore(),context.save(),context.scale(pixelRatio,pixelRatio)},Canvas.prototype.clear=function(){this.context.clearRect(0,0,this.width,this.height)},Canvas.prototype.render=function(){var cache=this._textCache;for(var layerKey in cache)if(hasOwnProperty.call(cache,layerKey)){var layer=this.getTextLayer(layerKey),layerCache=cache[layerKey];layer.hide();for(var styleKey in layerCache)if(hasOwnProperty.call(layerCache,styleKey)){var styleCache=layerCache[styleKey];for(var key in styleCache)if(hasOwnProperty.call(styleCache,key)){for(var position,positions=styleCache[key].positions,i=0;position=positions[i];i++)position.active?position.rendered||(layer.append(position.element),position.rendered=!0):(positions.splice(i--,1),position.rendered&&position.element.detach());0==positions.length&&delete styleCache[key]}}layer.show()}},Canvas.prototype.getTextLayer=function(classes){var layer=this.text[classes];return null==layer&&(null==this.textContainer&&(this.textContainer=$("
").css({position:"absolute",top:0,left:0,bottom:0,right:0,"font-size":"smaller",color:"#545454"}).insertAfter(this.element)),layer=this.text[classes]=$("
").addClass(classes).css({position:"absolute",top:0,left:0,bottom:0,right:0}).appendTo(this.textContainer)),layer},Canvas.prototype.getTextInfo=function(layer,text,font,angle,width){var textStyle,layerCache,styleCache,info;if(text=""+text,textStyle="object"==typeof font?font.style+" "+font.variant+" "+font.weight+" "+font.size+"px/"+font.lineHeight+"px "+font.family:font,layerCache=this._textCache[layer],null==layerCache&&(layerCache=this._textCache[layer]={}),styleCache=layerCache[textStyle],null==styleCache&&(styleCache=layerCache[textStyle]={}),info=styleCache[text],null==info){var element=$("
").html(text).css({position:"absolute","max-width":width,top:-9999}).appendTo(this.getTextLayer(layer));"object"==typeof font?element.css({font:textStyle,color:font.color}):"string"==typeof font&&element.addClass(font),info=styleCache[text]={width:element.outerWidth(!0),height:element.outerHeight(!0),element:element,positions:[]},element.detach()}return info},Canvas.prototype.addText=function(layer,x,y,text,font,angle,width,halign,valign){var info=this.getTextInfo(layer,text,font,angle,width),positions=info.positions;"center"==halign?x-=info.width/2:"right"==halign&&(x-=info.width),"middle"==valign?y-=info.height/2:"bottom"==valign&&(y-=info.height);for(var position,i=0;position=positions[i];i++)if(position.x==x&&position.y==y)return void(position.active=!0);position={active:!0,rendered:!1,element:positions.length?info.element.clone():info.element,x:x,y:y},positions.push(position),position.element.css({top:Math.round(y),left:Math.round(x),"text-align":halign})},Canvas.prototype.removeText=function(layer,x,y,text,font,angle){if(null==text){var layerCache=this._textCache[layer];if(null!=layerCache)for(var styleKey in layerCache)if(hasOwnProperty.call(layerCache,styleKey)){var styleCache=layerCache[styleKey];for(var key in styleCache)if(hasOwnProperty.call(styleCache,key))for(var position,positions=styleCache[key].positions,i=0;position=positions[i];i++)position.active=!1}}else for(var position,positions=this.getTextInfo(layer,text,font,angle).positions,i=0;position=positions[i];i++)position.x==x&&position.y==y&&(position.active=!1)},$.plot=function(placeholder,data,options){var plot=new Plot($(placeholder),data,options,$.plot.plugins);return plot},$.plot.version="0.8.3",$.plot.plugins=[],$.fn.plot=function(data,options){return this.each(function(){$.plot(this,data,options)})}}(jQuery),function($){function floorInBase(n,base){return base*Math.floor(n/base)}function formatDate(d,fmt,monthNames,dayNames){if("function"==typeof d.strftime)return d.strftime(fmt);var leftPad=function(n,pad){return n=""+n,pad=""+(null==pad?"0":pad),1==n.length?pad+n:n},r=[],escape=!1,hours=d.getHours(),isAM=12>hours;null==monthNames&&(monthNames=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]),null==dayNames&&(dayNames=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]);var hours12;hours12=hours>12?hours-12:0==hours?12:hours;for(var i=0;i=minSize);++i);var size=spec[i][0],unit=spec[i][1];if("year"==unit){if(null!=opts.minTickSize&&"year"==opts.minTickSize[1])size=Math.floor(opts.minTickSize[0]);else{var magn=Math.pow(10,Math.floor(Math.log(axis.delta/timeUnitSize.year)/Math.LN10)),norm=axis.delta/timeUnitSize.year/magn;size=1.5>norm?1:3>norm?2:7.5>norm?5:10,size*=magn}1>size&&(size=1)}axis.tickSize=opts.tickSize||[size,unit];var tickSize=axis.tickSize[0];unit=axis.tickSize[1];var step=tickSize*timeUnitSize[unit];"second"==unit?d.setSeconds(floorInBase(d.getSeconds(),tickSize)):"minute"==unit?d.setMinutes(floorInBase(d.getMinutes(),tickSize)):"hour"==unit?d.setHours(floorInBase(d.getHours(),tickSize)):"month"==unit?d.setMonth(floorInBase(d.getMonth(),tickSize)):"quarter"==unit?d.setMonth(3*floorInBase(d.getMonth()/3,tickSize)):"year"==unit&&d.setFullYear(floorInBase(d.getFullYear(),tickSize)),d.setMilliseconds(0),step>=timeUnitSize.minute&&d.setSeconds(0),step>=timeUnitSize.hour&&d.setMinutes(0),step>=timeUnitSize.day&&d.setHours(0),step>=4*timeUnitSize.day&&d.setDate(1),step>=2*timeUnitSize.month&&d.setMonth(floorInBase(d.getMonth(),3)),step>=2*timeUnitSize.quarter&&d.setMonth(floorInBase(d.getMonth(),6)),step>=timeUnitSize.year&&d.setMonth(0);var prev,carry=0,v=Number.NaN;do if(prev=v,v=d.getTime(),ticks.push(v),"month"==unit||"quarter"==unit)if(1>tickSize){d.setDate(1);var start=d.getTime();d.setMonth(d.getMonth()+("quarter"==unit?3:1));var end=d.getTime();d.setTime(v+carry*timeUnitSize.hour+(end-start)*tickSize),carry=d.getHours(),d.setHours(0)}else d.setMonth(d.getMonth()+tickSize*("quarter"==unit?3:1));else"year"==unit?d.setFullYear(d.getFullYear()+tickSize):d.setTime(v+step);while(vt?e:t>o?o:t}function l(e,o){var n=t.getOptions(),i=t.getPlaceholder().offset(),s=t.getPlotOffset();e.x=c(0,o.pageX-i.left-s.left,t.width()),e.y=c(0,o.pageY-i.top-s.top,t.height()),"y"==n.selection.mode&&(e.x=e==h.first?0:t.width()),"x"==n.selection.mode&&(e.y=e==h.first?0:t.height())}function a(e){null!=e.pageX&&(l(h.second,e),g()?(h.show=!0,t.triggerRedrawOverlay()):u(!0))}function u(e){h.show&&(h.show=!1,t.triggerRedrawOverlay(),e||t.getPlaceholder().trigger("plotunselected",[]))}function d(e,o){var n,i,s,r,c=t.getAxes();for(var l in c)if(n=c[l],n.direction==o&&(r=o+n.n+"axis",e[r]||1!=n.n||(r=o+"axis"),e[r])){i=e[r].from,s=e[r].to;break}if(e[r]||(n="x"==o?t.getXAxes()[0]:t.getYAxes()[0],i=e[o+"1"],s=e[o+"2"]),null!=i&&null!=s&&i>s){var a=i;i=s,s=a}return{from:i,to:s,axis:n}}function f(e,o){var n,i=t.getOptions();"y"==i.selection.mode?(h.first.x=0,h.second.x=t.width()):(n=d(e,"x"),h.first.x=n.axis.p2c(n.from),h.second.x=n.axis.p2c(n.to)),"x"==i.selection.mode?(h.first.y=0,h.second.y=t.height()):(n=d(e,"y"),h.first.y=n.axis.p2c(n.from),h.second.y=n.axis.p2c(n.to)),h.show=!0,t.triggerRedrawOverlay(),!o&&g()&&r()}function g(){var e=t.getOptions().selection.minSize;return Math.abs(h.second.x-h.first.x)>=e&&Math.abs(h.second.y-h.first.y)>=e}var h={first:{x:-1,y:-1},second:{x:-1,y:-1},show:!1,active:!1},m={},x=null;t.clearSelection=u,t.setSelection=f,t.getSelection=s,t.hooks.bindEvents.push(function(e,t){var i=e.getOptions();null!=i.selection.mode&&(t.mousemove(o),t.mousedown(n))}),t.hooks.drawOverlay.push(function(t,o){if(h.show&&g()){var n=t.getPlotOffset(),i=t.getOptions();o.save(),o.translate(n.left,n.top);var s=e.color.parse(i.selection.color);o.strokeStyle=s.scale("a",.8).toString(),o.lineWidth=1,o.lineJoin=i.selection.shape,o.fillStyle=s.scale("a",.4).toString();var r=Math.min(h.first.x,h.second.x)+.5,c=Math.min(h.first.y,h.second.y)+.5,l=Math.abs(h.second.x-h.first.x)-1,a=Math.abs(h.second.y-h.first.y)-1;o.fillRect(r,c,l,a),o.strokeRect(r,c,l,a),o.restore()}}),t.hooks.shutdown.push(function(t,i){i.unbind("mousemove",o),i.unbind("mousedown",n),x&&e(document).unbind("mouseup",x)})}e.plot.plugins.push({init:t,options:{selection:{mode:null,color:"#e8cfac",shape:"round",minSize:5}},name:"selection",version:"1.1"})}(jQuery),function(J,r,f){function s(a,b,d){a.addEventListener?a.addEventListener(b,d,!1):a.attachEvent("on"+b,d)}function A(a){if("keypress"==a.type){var b=String.fromCharCode(a.which);return a.shiftKey||(b=b.toLowerCase()),b}return h[a.which]?h[a.which]:B[a.which]?B[a.which]:String.fromCharCode(a.which).toLowerCase()}function t(a){a=a||{};var d,b=!1;for(d in n)a[d]?b=!0:n[d]=0;b||(u=!1)}function C(a,b,d,c,e,v){var g,k,f=[],h=d.type;if(!l[a])return[];for("keyup"==h&&w(a)&&(b=[a]),g=0;g95&&112>g||h.hasOwnProperty(g)&&(p[h[g]]=g)}e=p[d]?"keydown":"keypress"}return"keypress"==e&&f.length&&(e="keydown"),{key:c,modifiers:f,action:e}}function F(a,b,d,c,e){q[a+":"+d]=b,a=a.replace(/\s+/g," ");var f=a.split(" ");1":".","?":"/","|":"\\"},G={option:"alt",command:"meta","return":"enter",escape:"esc",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"meta":"ctrl"},l={},q={},n={},z=!1,I=!1,u=!1;for(f=1;20>f;++f)h[111+f]="f"+f;for(f=0;9>=f;++f)h[f+96]=f;s(r,"keypress",y),s(r,"keydown",y),s(r,"keyup",y);var m={bind:function(a,b,d){a=a instanceof Array?a:[a];for(var c=0;c=0&&"try-comm-central"!==name?name+"-thunderbird":name},getRepoName=function(name){return name.replace("-thunderbird","")},get=function(repoName){var url=urlBase+getTreeStatusName(repoName);return $http.get(url,{params:{format:"json"}})};return{get:get,getTreeStatusName:getTreeStatusName,getRepoName:getRepoName}}]),treeherder.provider("thServiceDomain",function(){this.$get=function(){return window.thServiceDomain?window.thServiceDomain:""}}),treeherder.provider("thResultStatusList",function(){var all=function(){return["success","testfailed","busted","exception","retry","usercancel","running","pending","coalesced"]},defaultFilters=function(){return["success","testfailed","busted","exception","retry","usercancel","running","pending"]};this.$get=function(){return{all:all,defaultFilters:defaultFilters}}}),treeherder.provider("thResultStatus",function(){this.$get=function(){return function(job){return"completed"===job.state?job.result:null!==job.job_coalesced_to_guid?"coalesced":job.state}}}),treeherder.provider("thResultStatusObject",function(){var getResultStatusObject=function(){return{running:0,pending:0,completed:0}};this.$get=function(){return{getResultStatusObject:getResultStatusObject}}}),treeherder.provider("thResultStatusInfo",function(){this.$get=function(){return function(resultState){var resultStatusInfo={severity:100,btnClass:"btn-default",jobButtonIcon:""};switch(resultState){case"busted":resultStatusInfo={severity:1,btnClass:"btn-red",btnClassClassified:"btn-red-classified",jobButtonIcon:"glyphicon glyphicon-fire",countText:"busted"};break;case"exception":resultStatusInfo={severity:2,btnClass:"btn-purple",btnClassClassified:"btn-purple-classified",jobButtonIcon:"glyphicon glyphicon-fire",countText:"exception"};break;case"testfailed":resultStatusInfo={severity:3,btnClass:"btn-orange",btnClassClassified:"btn-orange-classified",jobButtonIcon:"glyphicon glyphicon-warning-sign",countText:"failed"};break;case"unknown":resultStatusInfo={severity:4,btnClass:"btn-black",btnClassClassified:"btn-black-classified",jobButtonIcon:"",countText:"unknown"};break;case"usercancel":resultStatusInfo={severity:5,btnClass:"btn-pink",jobButtonIcon:"",countText:"cancel"};break;case"retry":resultStatusInfo={severity:6,btnClass:"btn-dkblue",jobButtonIcon:"",countText:"retry"};break;case"success":resultStatusInfo={severity:7,btnClass:"btn-green",jobButtonIcon:"",countText:"success"};break;case"running":resultStatusInfo={severity:8,btnClass:"btn-dkgray",jobButtonIcon:"",countText:"running"};break;case"pending":resultStatusInfo={severity:100,btnClass:"btn-ltgray",jobButtonIcon:"",countText:"pending"};break;case"coalesced":resultStatusInfo={severity:101,btnClass:"btn-yellow",jobButtonIcon:"",countText:"coalesced"}}return resultStatusInfo}}}),treeherder.provider("thEvents",function(){this.$get=function(){return{revisionsLoaded:"revisions-loaded-EVT",jobClick:"job-click-EVT",jobDetailLoaded:"job-detail-loaded-EVT",jobPin:"job-pin-EVT",jobRetrigger:"job-retrigger-EVT",jobContextMenu:"job-context-menu-EVT",jobsClassified:"jobs-classified-EVT",bugsAssociated:"bugs-associated-EVT",jobsLoaded:"jobs-loaded-EVT",clearSelectedJob:"clear-selected-job-EVT",globalFilterChanged:"status-filter-changed-EVT",toggleRevisions:"toggle-revisions-EVT",toggleAllRevisions:"toggle-all-revisions-EVT",toggleUnclassifiedFailures:"toggle-unclassified-failures-EVT",changeSelection:"next-previous-job-EVT",addRelatedBug:"add-related-bug-EVT",saveClassification:"save-classification-EVT",deleteClassification:"delete-classification-EVT",clearPinboard:"clear-pinboard-EVT",searchPage:"search-page-EVT",selectJob:"select-job-EVT",mapResultSetJobs:"map-result-set-jobs-EVT",applyNewJobs:"apply-new-jobs-EVT",initSheriffPanel:"init-sheriff-panel-EVT",openLogviewer:"open-logviewer-EVT"}}}),treeherder.provider("thAggregateIds",function(){var escape=function(id){return id.replace(/(:|\[|\]|\?|,|\.|\s+)/g,"-")},getPlatformRowId=function(repoName,resultsetId,platformName,platformOptions){return escape(repoName+resultsetId+platformName+platformOptions)},getResultsetTableId=function(repoName,resultsetId,revision){return escape(repoName+resultsetId+revision)};this.$get=function(){return{getPlatformRowId:getPlatformRowId,getResultsetTableId:getResultsetTableId}}}),treeherder.provider("thReftestStatus",function(){this.$get=function(){return function(job){return job.job_group_name?-1!==job.job_group_name.toLowerCase().indexOf("reftest"):void 0}}}),treeherder.value("thPlatformNameMap",{linux32:"Linux",linux64:"Linux x64","osx-10-6":"OS X 10.6","osx-10-7":"OS X 10.7","osx-10-8":"OS X 10.8","osx-10-9":"OS X 10.9","osx-10-10":"OS X 10.10",windowsxp:"Windows XP","windows7-32":"Windows 7","windows7-64":"Windows 7 x64","windows8-32":"Windows 8","windows8-64":"Windows 8 x64","windows2012-64":"Windows 2012 x64","android-2-2-armv6":"Android 2.2 Armv6","android-2-2":"Android 2.2","android-2-3-armv6":"Android 2.3 Armv6","android-2-3":"Android 2.3","android-2-3-armv7-api9":"Android 2.3 API9","android-4-0":"Android 4.0","android-4-0-armv7-api10":"Android 4.0 API10+","android-4-0-armv7-api11":"Android 4.0 API11+","android-4-2-x86":"Android 4.2 x86","android-4-2":"Android 4.2","android-4-2-armv7-api11":"Android 4.2 API11+","android-4-3":"Android 4.3","android-4-3-armv7-api11":"Android 4.3 API11+","android-4-4":"Android 4.4","android-4-4-armv7-api11":"Android 4.4 API11+","android-5-0-armv7-api11":"Android 5.0 API11+","b2g-linux32":"B2G Desktop Linux","b2g-linux64":"B2G Desktop Linux x64","b2g-osx":"B2G Desktop OS X","b2g-win32":"B2G Desktop Windows","b2g-emu-ics":"B2G ICS Emulator","b2g-emu-jb":"B2G JB Emulator","b2g-emu-kk":"B2G KK Emulator","b2g-emu-l":"B2G L Emulator","b2g-device-image":"B2G Device Image","mulet-linux32":"Mulet Linux","mulet-linux64":"Mulet Linux x64","mulet-osx":"Mulet OS X","mulet-win32":"Mulet Windows","graphene-linux64":"Graphene Linux x64","graphene-osx":"Graphene OS X","graphene-win64":"Graphene Windows x64","horizon-linux64":"Horizon Linux x64","horizon-osx":"Horizon OS X","horizon-win64":"Horizon Windows x64",other:"Other"}),treeherder.value("thPlatformOrder",{linux32:0,linux64:1,"osx-10-6":10,"osx-10-7":11,"osx-10-8":12,"osx-10-9":13,"osx-10-10":14,windowsxp:20,"windows7-32":21,"windows7-64":22,"windows8-32":23,"windows8-64":24,"windows2012-64":25,"android-2-2-armv6":30,"android-2-2":31,"android-2-3-armv6":32,"android-2-3":33,"android-2-3-armv7-api9":34,"android-4-0":35,"android-4-0-armv7-api10":36,"android-4-0-armv7-api11":37,"android-4-2-x86":38,"android-4-2":39,"android-4-2-armv7-api11":40,"android-4-3":41,"android-4-3-armv7-api11":42,"android-4-4":43,"android-4-4-armv7-api11":44,"android-5-0-armv7-api11":45,"b2g-linux32":50,"b2g-linux64":51,"b2g-osx":52,"b2g-win32":53,"b2g-emu-ics":54,"b2g-emu-jb":55,"b2g-emu-kk":56,"b2g-emu-l":57,"b2g-device-image":58,"mulet-linux32":60,"mulet-linux64":61,"mulet-osx":62,"mulet-win32":63,"graphene-linux64":71,"graphene-osx":72,"graphene-win64":73,"horizon-linux64":74,"horizon-osx":75,"horizon-win64":76,other:99}),treeherder.value("thOptionOrder",{opt:0,pgo:1,asan:2,debug:3,cc:4}),treeherder.value("thFailureResults",["testfailed","busted","exception"]),treeherder.value("thFavicons",{closed:"img/tree_closed.png",open:"img/tree_open.png","approval required":"img/tree_open.png",unavailable:"img/tree_open.png"}),treeherder.value("thRepoGroupOrder",{development:1,"project repositories":2,"try":3,"release-stabilization":4,taskcluster:5,"qa automation tests":6}),treeherder.value("thDefaultRepo","mozilla-inbound"),treeherder.value("thDateFormat","EEE MMM d, H:mm:ss"),treeherder.value("phTimeRanges",[{value:86400,text:"Last day"},{value:604800,text:"Last 7 days"},{value:1209600,text:"Last 14 days"},{value:2592e3,text:"Last 30 days"},{value:5184e3,text:"Last 60 days"},{value:7776e3,text:"Last 90 days"},{value:31536e3,text:"Last year"}]),treeherder.value("thJobNavSelectors",{ALL_JOBS:{name:"jobs",selector:".job-btn"},UNCLASSIFIED_FAILURES:{name:"unclassified failures",selector:".selected-job, .job-btn.btn-red, .job-btn.btn-orange, .job-btn.btn-purple"}}),treeherder.factory("ThOptionCollectionModel",["$http","$log","thUrl",function($http,$log,thUrl){var get_list=function(options){options=options||{};var query_string=$.param(options);return $http.get(thUrl.getRootUrl("/optioncollectionhash/")+"?"+query_string)},get_map=function(options){return get_list(options).then(function(optCollectionData){var optionCollectionMap={};return _.each(optCollectionData.data,function(optColl){optionCollectionMap[optColl.option_collection_hash]=_.uniq(_.map(optColl.options,function(option){return option.name})).sort().join()}),optionCollectionMap})};return{get_list:get_list,get_map:get_map}}]),treeherder.factory("thUrl",["$rootScope","thServiceDomain","ThLog",function($rootScope,thServiceDomain,ThLog){var thUrl={getRootUrl:function(uri){return thServiceDomain+"/api"+uri},getProjectUrl:function(uri,repoName){return _.isUndefined(repoName)&&(repoName=$rootScope.repoName),thServiceDomain+"/api/project/"+repoName+uri},getLogViewerUrl:function(job_id){return"logviewer.html#?job_id="+job_id+"&repo="+$rootScope.repoName}};return thUrl}]),treeherder.factory("thCloneHtml",["$interpolate",function($interpolate){var templateId,templateName,templateTxt,i,cloneTemplateIds=["revisionsClone.html","resultsetClone.html","platformClone.html","jobTdClone.html","jobGroupBeginClone.html","jobBtnClone.html","revisionUrlClone.html","pushlogRevisionsClone.html"],cloneHtmlObjs={};for(i=0;imaxNsNotifications)return void $timeout(thNotify.shift);$timeout(thNotify.shift,4e3,!0)}},shift:function(){for(var i=0;itreestatus.mozilla.org ',reason:"",tree:repoName}},getErrorTreeStatus=function(repoName){return{status:"error",message_of_the_day:'Error reaching treestatus.mozilla.org ',reason:'Error reaching treestatus.mozilla.org ',tree:repoName}},updateTreeStatus=function(repoName){var repoNames=watchedRepos[repoName]?[repoName]:_.keys(watchedRepos);repoNames=_.filter(repoNames,function(repo){return watchedRepos[repo]&&"unsupported"!==watchedRepos[repo].treeStatus.status?repo:void 0});var newStatuses={},getStatus=function(repo){$log.debug("updateTreeStatus","getStatus","updating",repo),treeStatus.get(repo).then(function(data){newStatuses[repo]=data.data,updateStatusesIfDone()},function(data){null!=data.data?newStatuses[repo]=getUnsupportedTreeStatus(repo):newStatuses[repo]=getErrorTreeStatus(repo),updateStatusesIfDone()})},updateStatusesIfDone=function(){_.size(newStatuses)===repoNames.length&&_.defer(function(){_.each(newStatuses,function(status){$log.debug("updateTreeStatus","updateStatusesIfDone",status.tree,status.status),watchedRepos[treeStatus.getRepoName(status.tree)].treeStatus=status})})};_.each(repoNames,getStatus)};return{load:load,get_list:get_list,getCurrent:getCurrent,setCurrent:setCurrent,getRepo:getByName,getOrderedRepoGroups:getOrderedRepoGroups,getCurrentTreeStatus:getCurrentTreeStatus,repos:repos,watchedRepos:watchedRepos,loadWatchedRepos:loadWatchedRepos,saveWatchedRepos:saveWatchedRepos,unwatchRepo:unwatchRepo,toggleWatched:toggleWatched}}]),treeherder.factory("ThJobModel",["$http","ThLog","thUrl","$q",function($http,ThLog,thUrl,$q){var ThJobModel=function(data){angular.extend(this,data)};return ThJobModel.prototype.get_current_eta=function(){var timestampSeconds=(new Date).getTime()/1e3;return Math.round((timestampSeconds-(parseInt(this.submit_timestamp)+parseInt(this.running_eta)))/60)},ThJobModel.prototype.get_typical_eta=function(){return Math.round(parseInt(this.running_eta)/60)},ThJobModel.get_uri=function(repoName){return thUrl.getProjectUrl("/jobs/",repoName)},ThJobModel.get_list=function(repoName,options,config){config=config||{};var timeout=config.timeout||null,fetch_all=config.fetch_all||!1;return $http.get(ThJobModel.get_uri(repoName),{params:options,timeout:timeout}).then(function(response){var item_list,next_pages_jobs=[];if(fetch_all&&response.data.results.length===response.data.meta.count){var current_offset=parseInt(response.data.meta.offset),page_size=parseInt(response.data.meta.count),new_options=angular.copy(options);new_options.offset=page_size+current_offset,new_options.count=page_size,next_pages_jobs=ThJobModel.get_list(repoName,new_options,config)}return item_list=_.has(response.data,"job_property_names")?_.map(response.data.results,function(elem){var job_obj=_.object(response.data.job_property_names,elem);return new ThJobModel(job_obj)}):_.map(response.data.results,function(job_obj){return new ThJobModel(job_obj)}),$q.when(next_pages_jobs).then(function(maybe_job_list){return item_list.concat(maybe_job_list)})})},ThJobModel.get=function(repoName,pk,config){config=config||{};var timeout=config.timeout||null;return $http.get(ThJobModel.get_uri(repoName)+pk+"/",{timeout:timeout}).then(function(response){return new ThJobModel(response.data)})},ThJobModel.retrigger=function(repoName,pk,config){config=config||{};var timeout=config.timeout||null;return $http.post(ThJobModel.get_uri(repoName)+pk+"/retrigger/",{timeout:timeout}).then(function(response){return new ThJobModel(response.data)})},ThJobModel.backfill=function(repoName,pk,config){config=config||{};var timeout=config.timeout||null;return $http.post(ThJobModel.get_uri(repoName)+pk+"/backfill/",{timeout:timeout})},ThJobModel.cancel=function(repoName,pk,config){config=config||{};var timeout=config.timeout||null;return $http.post(ThJobModel.get_uri(repoName)+pk+"/cancel/",{timeout:timeout}).then(function(response){return new ThJobModel(response.data)})},ThJobModel}]),treeherder.factory("ThResultSetModel",["$rootScope","$http","$location","$q","thUrl","thResultStatusObject","thEvents","thServiceDomain","ThLog","thNotify","ThJobModel","thPlatformOrder","thOptionOrder",function($rootScope,$http,$location,$q,thUrl,thResultStatusObject,thEvents,thServiceDomain,ThLog,thNotify,ThJobModel,thPlatformOrder,thOptionOrder){var $log=new ThLog("ThResultSetModel"),MAX_RESULTSET_FETCH_SIZE=100,convertDates=function(locationParams){return $log.debug("locationParams",locationParams),_.has(locationParams,"startdate")&&(locationParams.push_timestamp__gte=Date.parse(locationParams.startdate)/1e3,delete locationParams.startdate),_.has(locationParams,"enddate")&&(locationParams.push_timestamp__lt=Date.parse(locationParams.enddate)/1e3+84600,delete locationParams.enddate),locationParams},hasLowerRange=function(locationParams){return locationParams.fromchange||locationParams.startdate};return{getResultSetsFromChange:function(repoName,revision,locationParams){return locationParams=convertDates(locationParams),_.extend(locationParams,{fromchange:revision}),$http.get(thUrl.getProjectUrl("/resultset/",repoName),{params:locationParams})},getResultSets:function(repoName,rsOffsetTimestamp,count,resultsetlist,full,keep_filters){rsOffsetTimestamp="undefined"==typeof rsOffsetTimestamp?0:rsOffsetTimestamp,full=_.isUndefined(full)?!0:full,keep_filters=_.isUndefined(keep_filters)?!0:keep_filters;var params={full:full};if(params.count=count?Math.min(count,MAX_RESULTSET_FETCH_SIZE):10,rsOffsetTimestamp&&(params.push_timestamp__lte=rsOffsetTimestamp,params.count++),keep_filters){var locationParams=_.clone($location.search());delete locationParams.repo,rsOffsetTimestamp?(delete locationParams.tochange,delete locationParams.fromchange):hasLowerRange(locationParams)&&(params.count=MAX_RESULTSET_FETCH_SIZE),locationParams=convertDates(locationParams),$log.debug("updated params",params),_.extend(params,locationParams)}return resultsetlist&&_.extend(params,{offset:0,count:resultsetlist.length,id__in:resultsetlist.join()}),$http.get(thUrl.getProjectUrl("/resultset/",repoName),{params:params})},getResultSet:function(repoName,pk){return $http.get(thUrl.getProjectUrl("/resultset/"+pk+"/",repoName))},get:function(uri){return $http.get(thServiceDomain+uri)},getResultSetJobsUpdates:function(resultSetIdList,repoName,exclusionProfile,lastModified){angular.isDate(lastModified)&&(lastModified=lastModified.toISOString().replace("Z",""));var params={result_set_id__in:resultSetIdList.join(","),count:2e3,last_modified__gt:lastModified,return_type:"list"};return exclusionProfile&&(params.exclusion_profile=exclusionProfile),ThJobModel.get_list(repoName,params,{fetch_all:!0})},getResultSetJobs:function(resultSets,repoName,exclusionProfile){var jobsPromiseList=[];return _.each(resultSets.results,function(rs,index){var params={return_type:"list",result_set_id:rs.id,count:2e3};exclusionProfile&&(params.exclusion_profile=exclusionProfile),jobsPromiseList.push(ThJobModel.get_list(repoName,params,{fetch_all:!0}))}),jobsPromiseList},getRevisions:function(projectName,resultSetId){return $http.get(thUrl.getProjectUrl("/resultset/"+resultSetId+"/",projectName),{cache:!0}).then(function(response){return response.data.revisions.length>0?_.map(response.data.revisions,function(r){return r.revision}):$q.reject("No revisions found for result set "+resultSetId+" in project "+projectName)})},getResultSetsFromRevision:function(projectName,revision){return $http.get(thUrl.getProjectUrl("/resultset/?revision="+revision,projectName),{cache:!0}).then(function(response){return response.data.results.length>0?response.data.results:$q.reject("No results found for revision "+revision+" on project "+projectName)})},cancelAll:function(resultset_id,repoName){var uri=resultset_id+"/cancel_all/";return $http.post(thUrl.getProjectUrl("/resultset/",repoName)+uri)},triggerMissingJobs:function(resultset_id,repoName){var uri=resultset_id+"/trigger_missing_jobs/";return $http.post(thUrl.getProjectUrl("/resultset/",repoName)+uri)}}}]);var perf=angular.module("perf",["ui.router","ui.bootstrap","treeherder"]);perf.factory("PhSeries",["$http","thServiceDomain",function($http,thServiceDomain){var _getSeriesSummary=function(signature,signatureProps,optionCollectionMap){var subtestSignatures,platform=signatureProps.machine_platform,testName=signatureProps.test;void 0===testName&&(testName="summary",subtestSignatures=signatureProps.subtest_signatures);var name=signatureProps.suite+" "+testName,options=[optionCollectionMap[signatureProps.option_collection_hash]];return signatureProps.test_options&&(options=options.concat(signatureProps.test_options)),name=name+" "+options.join(" "),{name:name,signature:signature,platform:platform,options:options,subtestSignatures:subtestSignatures}},_getAllSeries=function(projectName,timeRange,optionMap){var signatureURL=thServiceDomain+"/api/project/"+projectName+"/performance-data/get_performance_series_summary/?interval="+timeRange;return $http.get(signatureURL).then(function(response){var seriesList=[],platformList=[],testList=[];return Object.keys(response.data).forEach(function(signature){var seriesSummary=_getSeriesSummary(signature,response.data[signature],optionMap);seriesList.push(seriesSummary),_.contains(platformList,seriesSummary.platform)||platformList.push(seriesSummary.platform),_.contains(testList,seriesSummary.name)||testList.push(seriesSummary.name)}),{seriesList:seriesList,platformList:platformList,testList:testList}})};return{getSeriesSummary:function(signature,signatureProps,optionCollectionMap){return _getSeriesSummary(signature,signatureProps,optionCollectionMap)},getSubtestSummaries:function(projectName,timeRange,optionMap,targetSignature){return _getAllSeries(projectName,timeRange,optionMap).then(function(lists){var suiteName,seriesList=[],platformList=[],subtestSignatures=[],series=_.find(lists.seriesList,function(series){return series.signature==targetSignature});series&&(series=series.subtestSignatures?[series]:_.filter(lists.seriesList,function(s){return _.find(s.subtestSignatures,function(signature){return signature==targetSignature})}),subtestSignatures=_.union(_.map(series,"subtestSignatures"))[0],suiteName=_.union(_.map(series,"name"))[0]),subtestSignatures.forEach(function(signature){var seriesSubtest=_.find(lists.seriesList,function(series){return series.signature==signature});seriesList.push(seriesSubtest),_.contains(platformList,seriesSubtest.platform)||platformList.push(seriesSubtest.platform)});var testList=[];return suiteName&&(testList=[suiteName]),{seriesList:seriesList,platformList:platformList,testList:testList}})},getAllSeries:function(projectName,timeRange,optionMap){return _getAllSeries(projectName,timeRange,optionMap)},getSeriesSummaries:function(projectName,timeRange,optionMap,userOptions){var seriesList=[],platformList=[],testList=[];return _getAllSeries(projectName,timeRange,optionMap).then(function(lists){return lists.seriesList.forEach(function(seriesSummary){!seriesSummary.subtestSignatures||userOptions.e10s&&!_.contains(seriesSummary.options,"e10s")||!userOptions.e10s&&_.contains(seriesSummary.options,"e10s")||_.contains(seriesSummary.name,"tp5n")||(seriesList.push(seriesSummary),_.contains(platformList,seriesSummary.platform)||platformList.push(seriesSummary.platform),_.contains(testList,seriesSummary.name)||testList.push(seriesSummary.name))}),{seriesList:seriesList,platformList:platformList,testList:testList}})}}}]),perf.factory("isReverseTest",[function(){return function(testName){var reverseTests=["dromaeo_dom","dromaeo_css","v8_7","canvasmark"],found=!1;return reverseTests.forEach(function(rt){testName.indexOf(rt)>=0&&(found=!0)}),found}}]),perf.factory("PhCompare",["$q","$http","thServiceDomain","PhSeries","math","isReverseTest","phTimeRanges",function($q,$http,thServiceDomain,PhSeries,math,isReverseTest,phTimeRanges){function getClassName(newIsBetter,oldVal,newVal,abs_t_value){var ratio=newVal/oldVal;return 1>ratio&&(ratio=1/ratio),RATIO_CARE_MIN>ratio||T_VALUE_CARE_MIN>abs_t_value?"":T_VALUE_CONFIDENT>abs_t_value?newIsBetter?"":"compare-notsure":newIsBetter?"compare-improvement":"compare-regression"}var STDDEV_DEFAULT_FACTOR=.15,RATIO_CARE_MIN=1.015,T_VALUE_CARE_MIN=.5,T_VALUE_CONFIDENT=1;return{getCompareClasses:function(cr,type){return cr.hideMinorChanges&&!cr.isMeaningful?"subtest-empty":cr.isEmpty?"subtest-empty":"row"==type&&cr.highlightedTest?"active subtest-highlighted":"row"==type?"":"bar"==type&&cr.isRegression?"bar-regression":"bar"==type&&cr.isImprovement?"bar-improvement":"bar"==type?"":cr.className},getCounterMap:function(testName,originalData,newData){function removeZeroes(values){return _.filter(values,function(v){return!!v})}function numericCompare(a,b){return b>a?-1:a>b?1:0}function analyzeSet(values){var average=math.average(values),stddev=math.stddev(values,average);return{geomean:average,stddev:stddev,stddevPct:math.percentOf(stddev,average),runs:values.slice().sort(numericCompare)}}var cmap={isEmpty:!0};originalData&&(originalData.values=removeZeroes(originalData.values)),newData&&(newData.values=removeZeroes(newData.values));var hasOrig=originalData&&originalData.values.length,hasNew=newData&&newData.values.length;if(!hasOrig&&!hasNew)return cmap;if(cmap.isEmpty=!1,hasOrig){var orig=analyzeSet(originalData.values);cmap.originalGeoMean=orig.geomean,cmap.originalRuns=orig.runs,cmap.originalStddev=orig.stddev,cmap.originalStddevPct=orig.stddevPct}if(hasNew){var newd=analyzeSet(newData.values);cmap.newGeoMean=newd.geomean,cmap.newRuns=newd.runs,cmap.newStddev=newd.stddev,cmap.newStddevPct=newd.stddevPct}if(!hasOrig||!hasNew)return cmap;cmap.delta=cmap.newGeoMean-cmap.originalGeoMean;var newIsBetter=cmap.delta<0;isReverseTest(testName)&&(newIsBetter=!newIsBetter),cmap.deltaPercentage=math.percentOf(cmap.delta,cmap.originalGeoMean),cmap.barGraphMargin=50-Math.min(50,Math.abs(Math.round(cmap.deltaPercentage)/2)),cmap.marginDirection=newIsBetter?"right":"left";var abs_t_value=Math.abs(math.t_test(originalData.values,newData.values,STDDEV_DEFAULT_FACTOR));return cmap.className=getClassName(newIsBetter,cmap.originalGeoMean,cmap.newGeoMean,abs_t_value),cmap.confidence=abs_t_value,cmap.confidenceText=T_VALUE_CARE_MIN>abs_t_value?"low":T_VALUE_CONFIDENT>abs_t_value?"med":"high",cmap.isRegression="compare-regression"==cmap.className,cmap.isImprovement="compare-improvement"==cmap.className,cmap.isMeaningful=""!=cmap.className,cmap},getInterval:function(oldTimestamp,newTimestamp){var now=(new Date).getTime()/1e3,timeRange=Math.min(oldTimestamp,newTimestamp);timeRange=Math.round(now-timeRange);var timeRange=_.find(phTimeRanges,function(i){return timeRange<=i.value});return timeRange.value},validateInput:function(originalProject,newProject,originalRevision,newRevision,originalSignature,newSignature){var errors=[];return originalProject||errors.push("Missing input: originalProject"),newProject||errors.push("Missing input: newProject"),originalRevision||errors.push("Missing input: originalRevision"),newRevision||errors.push("Missing input: newRevision"),originalSignature&&newSignature&&(originalSignature||errors.push("Missing input: originalSignature"),newSignature||errors.push("Missing input: newSignature")),$http.get(thServiceDomain+"/api/repository/").then(function(response){_.find(response.data,{name:originalProject})||errors.push("Invalid project, doesn't exist: "+originalProject),_.find(response.data,{name:newProject})||errors.push("Invalid project, doesn't exist: "+newProject)}),errors},getResultsMap:function(projectName,seriesList,timeRange,resultSetIds){var baseURL=thServiceDomain+"/api/project/"+projectName+"/performance-data/get_performance_data/?interval_seconds="+timeRange,resultsMap={};return $q.all(_.chunk(seriesList,20).map(function(seriesChunk){var signatures="";return seriesChunk.forEach(function(series){signatures+="&signatures="+series.signature}),$http.get(baseURL+signatures).then(function(response){resultSetIds.forEach(function(resultSetId){void 0===resultsMap[resultSetId]&&(resultsMap[resultSetId]={}),response.data.forEach(function(data){var values=[];_.where(data.blob,{result_set_id:resultSetId}).forEach(function(pdata){void 0===pdata.geomean?values.push(pdata.mean):values.push(pdata.geomean)});var seriesData=_.find(seriesChunk,{signature:data.series_signature});resultsMap[resultSetId][data.series_signature]={platform:seriesData.platform,name:seriesData.name,values:values}})})})})).then(function(){return resultsMap})}}}]),perf.factory("math",[function(){function percentOf(a,b){return b?100*a/b:0}function average(values){return values.length<1?0:_.sum(values)/values.length}function stddev(values,avg){return values.length<2?0:(avg||(avg=average(values)),Math.sqrt(values.map(function(v){return Math.pow(v-avg,2)}).reduce(function(a,b){return a+b})/(values.length-1)))}function t_test(valuesC,valuesT,stddev_default_factor){var lenC=valuesC.length,lenT=valuesT.length;if(1>lenC||1>lenT)return 0;var avgC=average(valuesC),avgT=average(valuesT),stddevC=lenC>1?stddev(valuesC,avgC):stddev_default_factor*avgC,stddevT=lenT>1?stddev(valuesT,avgT):stddev_default_factor*avgT;1==lenC?stddevC=valuesC[0]*stddevT/avgT:1==lenT&&(stddevT=valuesT[0]*stddevC/avgC);var delta=avgT-avgC,stdDiffErr=Math.sqrt(stddevC*stddevC/lenC+stddevT*stddevT/lenT);return delta/stdDiffErr}return{percentOf:percentOf,average:average,stddev:stddev,t_test:t_test}}]),perf.filter("displayPrecision",function(){return function(input){return isNaN(input)?"N/A":parseFloat(input).toFixed(2)}}),perf.controller("CompareChooserCtrl",["$state","$stateParams","$scope","ThRepositoryModel","ThResultSetModel",function($state,$stateParams,$scope,ThRepositoryModel,ThResultSetModel){ThRepositoryModel.get_list().success(function(projects){$scope.projects=projects,$scope.originalProject=$scope.newProject=projects[0],$scope.originalTipList=[],$scope.newTipList=[];var getRevisionTips=function(projectName,list){list.splice(0,list.length),ThResultSetModel.getResultSets(projectName).then(function(response){var resultsets=response.data.results;resultsets.forEach(function(revisionSet){list.push({revision:revisionSet.revision,author:revisionSet.author})})})};$scope.updateOriginalgRevisionTips=function(){getRevisionTips($scope.originalProject.name,$scope.originalTipList)},$scope.updateNewRevisionTips=function(){getRevisionTips($scope.newProject.name,$scope.newTipList)},$scope.updateOriginalgRevisionTips(),$scope.updateNewRevisionTips(),$scope.getOriginalTipRevision=function(tip){$scope.originalRevision=tip},$scope.getNewTipRevision=function(tip){$scope.newRevision=tip},$scope.runCompare=function(){ThResultSetModel.getResultSetsFromRevision($scope.originalProject.name,$scope.originalRevision).then(function(resultSets){$scope.originalRevisionError=void 0},function(error){$scope.originalRevisionError=error}),ThResultSetModel.getResultSetsFromRevision($scope.newProject.name,$scope.newRevision).then(function(resultSets){$scope.newRevisionError=void 0,void 0===$scope.originalRevisionError&&void 0===$scope.newRevisionError&&$state.go("compare",{originalProject:$scope.originalProject.name,originalRevision:$scope.originalRevision,newProject:$scope.newProject.name,newRevision:$scope.newRevision})},function(error){$scope.newRevisionError=error})}})}]),perf.controller("CompareResultsCtrl",["$state","$stateParams","$scope","$rootScope","$location","thServiceDomain","ThOptionCollectionModel","ThRepositoryModel","ThResultSetModel","$http","$q","$timeout","PhSeries","math","isReverseTest","PhCompare",function($state,$stateParams,$scope,$rootScope,$location,thServiceDomain,ThOptionCollectionModel,ThRepositoryModel,ThResultSetModel,$http,$q,$timeout,PhSeries,math,isReverseTest,PhCompare){function displayComparison(){$scope.testList=[],$scope.platformList=[];var timeRange=PhCompare.getInterval($scope.originalTimestamp,$scope.newTimestamp),resultSetIds=[$scope.originalResultSetID];_.isEqual($scope.originalProject,$scope.newProject)&&(resultSetIds=[$scope.originalResultSetID,$scope.newResultSetID]),PhSeries.getSeriesSummaries($scope.originalProject.name,timeRange,optionCollectionMap,{e10s:$scope.e10s}).then(function(originalSeriesData){return $scope.platformList=originalSeriesData.platformList,$scope.testList=originalSeriesData.testList,PhCompare.getResultsMap($scope.originalProject.name,originalSeriesData.seriesList,timeRange,resultSetIds)}).then(function(resultMaps){var originalResultsMap=resultMaps[$scope.originalResultSetID],newResultsMap=resultMaps[$scope.newResultSetID];return newResultsMap?($scope.dataLoading=!1,void displayResults(originalResultsMap,newResultsMap)):void PhSeries.getSeriesSummaries($scope.newProject.name,timeRange,optionCollectionMap,{e10s:$scope.e10s}).then(function(newSeriesData){return $scope.platformList=_.union($scope.platformList,newSeriesData.platformList).sort(),$scope.testList=_.union($scope.testList,newSeriesData.testList).sort(),PhCompare.getResultsMap($scope.newProject.name,newSeriesData.seriesList,timeRange,[$scope.newResultSetID])}).then(function(resultMaps){var newResultsMap=resultMaps[$scope.newResultSetID];$scope.dataLoading=!1,displayResults(originalResultsMap,newResultsMap)})})}function displayResults(rawResultsMap,newRawResultsMap){$scope.compareResults={},$scope.titles={},window.document.title="Comparison between "+$scope.originalRevision+" ("+$scope.originalProject.name+") and "+$scope.newRevision+" ("+$scope.newProject.name+")",$scope.testList.forEach(function(testName){$scope.titles[testName]=testName.replace("summary ",""),$scope.platformList.forEach(function(platform){var oldSig=_.find(Object.keys(rawResultsMap),function(sig){return rawResultsMap[sig].name==testName&&rawResultsMap[sig].platform==platform}),newSig=_.find(Object.keys(newRawResultsMap),function(sig){return newRawResultsMap[sig].name==testName&&newRawResultsMap[sig].platform==platform}),cmap=PhCompare.getCounterMap(testName,rawResultsMap[oldSig],newRawResultsMap[newSig]);if(!cmap.isEmpty){var detailsLink="perf.html#/comparesubtest?";detailsLink+=_.map(_.pairs({originalProject:$scope.originalProject.name,originalRevision:$scope.originalRevision,newProject:$scope.newProject.name,newRevision:$scope.newRevision,originalSignature:oldSig,newSignature:newSig}),function(kv){return kv[0]+"="+kv[1]}).join("&"),cmap.detailsLink=detailsLink,cmap.name=platform,cmap.hideMinorChanges=$scope.hideMinorChanges,Object.keys($scope.compareResults).indexOf(testName)<0&&($scope.compareResults[testName]=[]),$scope.compareResults[testName].push(cmap)}})}),$scope.testNoResults=_.difference($scope.testList,Object.keys($scope.compareResults)).map(function(name){return" "+name.replace(" summary","")}).sort().join(),$scope.testList=Object.keys($scope.compareResults).sort()}function verifyRevision(project,revision,rsid){return ThResultSetModel.getResultSetsFromRevision(project.name,revision).then(function(resultSets){var resultSet=resultSets[0];"original"==rsid?($scope.originalResultSetID=resultSet.id,$scope.originalTimestamp=resultSet.push_timestamp):($scope.newResultSetID=resultSet.id,$scope.newTimestamp=resultSet.push_timestamp)},function(error){$scope.errors.push(error)})}$scope.dataLoading=!0,$scope.getCompareClasses=PhCompare.getCompareClasses;var optionCollectionMap={},loadRepositories=ThRepositoryModel.load(),loadOptions=ThOptionCollectionModel.get_map().then(function(_optionCollectionMap){optionCollectionMap=_optionCollectionMap});$q.all([loadRepositories,loadOptions]).then(function(){return $scope.errors=PhCompare.validateInput($stateParams.originalProject,$stateParams.newProject,$stateParams.originalRevision,$stateParams.originalProject),$scope.errors.length>0?void($scope.dataLoading=!1):($stateParams.e10s=Boolean($stateParams.e10s),$scope.hideMinorChanges=Boolean($stateParams.hideMinorChanges),$scope.originalProject=ThRepositoryModel.getRepo($stateParams.originalProject),$scope.newProject=ThRepositoryModel.getRepo($stateParams.newProject),$scope.newRevision=$stateParams.newRevision,$scope.originalRevision=$stateParams.originalRevision,void verifyRevision($scope.originalProject,$scope.originalRevision,"original").then(function(){verifyRevision($scope.newProject,$scope.newRevision,"new").then(function(){return $scope.errors.length>0?void($scope.dataLoading=!1):void displayComparison()})}))})}]),perf.controller("CompareSubtestResultsCtrl",["$state","$stateParams","$scope","$rootScope","$location","thServiceDomain","ThOptionCollectionModel","ThRepositoryModel","ThResultSetModel","$http","$q","$timeout","PhSeries","math","isReverseTest","PhCompare",function($state,$stateParams,$scope,$rootScope,$location,thServiceDomain,ThOptionCollectionModel,ThRepositoryModel,ThResultSetModel,$http,$q,$timeout,PhSeries,math,isReverseTest,PhCompare){function verifyRevision(project,revision,rsid){return ThResultSetModel.getResultSetsFromRevision(project.name,revision).then(function(resultSets){var resultSet=resultSets[0];"original"==rsid?($scope.originalResultSetID=resultSet.id,$scope.originalTimestamp=resultSet.push_timestamp):($scope.newResultSetID=resultSet.id,$scope.newTimestamp=resultSet.push_timestamp)},function(error){$scope.errors.push(error)})}function displayResults(rawResultsMap,newRawResultsMap,timeRange){$scope.compareResults={},$scope.titles={},$scope.subtestTitle=$scope.platformList[0].split(" ")[0]+" "+$scope.testList[0].split(" ")[0],window.document.title=$scope.subtestTitle+" subtest comparison",$scope.testList.forEach(function(testName){$scope.titles[testName]=testName.replace("summary ",""),$scope.compareResults[testName]=[],$scope.pageList.sort(),$scope.pageList.forEach(function(page){var mapsigs=[];[rawResultsMap,newRawResultsMap].forEach(function(resultsMap){if(resultsMap)var tempsig=_.find(Object.keys(resultsMap),function(sig){return resultsMap[sig].name==page});else{var tempsig="undefined";resultsMap={},resultsMap[tempsig]={}}mapsigs.push(tempsig)});var oldSig=mapsigs[0],newSig=mapsigs[1],cmap=PhCompare.getCounterMap(testName,rawResultsMap[oldSig],newRawResultsMap[newSig]);(oldSig==$scope.originalSignature||oldSig==$scope.newSignature||newSig==$scope.originalSignature||newSig==$scope.newSignature)&&(cmap.highlightedTest=!0);var originalSeries="["+$scope.originalProject.name+","+oldSig+",1]",newSeries="["+$scope.newProject.name+","+newSig+",1]",detailsLink="perf.html#/graphs?timerange="+timeRange+"&series="+newSeries;oldSig!=newSig&&(detailsLink+="&series="+originalSeries),detailsLink+="&highlightedRevisions="+$scope.originalRevision,detailsLink+="&highlightedRevisions="+$scope.newRevision,cmap.detailsLink=detailsLink,cmap.name=page,cmap.hideMinorChanges=$scope.hideMinorChanges,$scope.compareResults[testName].push(cmap)})})}$scope.dataLoading=!0,$scope.getCompareClasses=PhCompare.getCompareClasses;var optionCollectionMap={},loadRepositories=ThRepositoryModel.load(),loadOptions=ThOptionCollectionModel.get_map().then(function(_optionCollectionMap){optionCollectionMap=_optionCollectionMap});$q.all([loadRepositories,loadOptions]).then(function(){return $scope.errors=PhCompare.validateInput($stateParams.originalProject,$stateParams.newProject,$stateParams.originalRevision,$stateParams.newRevision,$stateParams.originalSignature,$stateParams.newSignature),$scope.errors.length>0?void($scope.dataLoading=!1):($scope.hideMinorChanges=Boolean($stateParams.hideMinorChanges),$scope.originalProject=ThRepositoryModel.getRepo($stateParams.originalProject),$scope.newProject=ThRepositoryModel.getRepo($stateParams.newProject),$scope.newRevision=$stateParams.newRevision,$scope.originalRevision=$stateParams.originalRevision,$scope.originalSignature=$stateParams.originalSignature,$scope.newSignature=$stateParams.newSignature,void verifyRevision($scope.originalProject,$scope.originalRevision,"original").then(function(){verifyRevision($scope.newProject,$scope.newRevision,"new").then(function(){if($scope.pageList=[],$scope.errors.length>0)return void($scope.dataLoading=!1);var timeRange=PhCompare.getInterval($scope.originalTimestamp,$scope.newTimestamp),resultSetIds=[$scope.originalResultSetID];$scope.originalProject==$scope.newProject&&(resultSetIds=[$scope.originalResultSetID,$scope.newResultSetID]),PhSeries.getSubtestSummaries($scope.originalProject.name,timeRange,optionCollectionMap,$scope.originalSignature).then(function(originalSeriesData){return $scope.testList=originalSeriesData.testList,$scope.platformList=originalSeriesData.platformList,PhCompare.getResultsMap($scope.originalProject.name,originalSeriesData.seriesList,timeRange,resultSetIds)}).then(function(seriesMaps){var originalSeriesMap=seriesMaps[$scope.originalResultSetID],newSeriesMap=seriesMaps[$scope.newResultSetID];return[originalSeriesMap,newSeriesMap].forEach(function(seriesMap){seriesMap&&Object.keys(seriesMap).forEach(function(series){_.contains($scope.pageList,seriesMap[series].name)||$scope.pageList.push(seriesMap[series].name)})}),newSeriesMap?($scope.dataLoading=!1,void displayResults(originalSeriesMap,newSeriesMap,timeRange)):void PhSeries.getSubtestSummaries($scope.newProject.name,timeRange,optionCollectionMap,$scope.newSignature).then(function(newSeriesData){return $scope.platformList=_.union($scope.platformList,newSeriesData.platformList).sort(),
-$scope.testList=_.union($scope.testList,newSeriesData.testList).sort(),PhCompare.getResultsMap($scope.newProject,newSeriesData.seriesList,timeRange,[$scope.newResultSetID])}).then(function(newSeriesMaps){var newSeriesMap=newSeriesMaps[$scope.newResultSetID];newSeriesMap?Object.keys(newSeriesMap).forEach(function(series){_.contains($scope.pageList,newSeriesMap[series].name)||$scope.pageList.push(newSeriesMap[series].name)}):newSeriesMap={},$scope.dataLoading=!1,displayResults(originalSeriesMap,newSeriesMap,timeRange)})})})}))})}]),perf.controller("GraphsCtrl",["$state","$stateParams","$scope","$rootScope","$location","$modal","thServiceDomain","$http","$q","$timeout","PhSeries","ThRepositoryModel","ThOptionCollectionModel","ThResultSetModel","phTimeRanges",function($state,$stateParams,$scope,$rootScope,$location,$modal,thServiceDomain,$http,$q,$timeout,PhSeries,ThRepositoryModel,ThOptionCollectionModel,ThResultSetModel,phTimeRanges){function getSeriesDataPoint(flotItem){var resultSetId=flotItem.series.resultSetData[flotItem.dataIndex];return{projectName:flotItem.series.thSeries.projectName,signature:flotItem.series.thSeries.signature,resultSetId:resultSetId,flotDataOffset:flotItem.dataIndex-flotItem.series.resultSetData.indexOf(resultSetId)}}function deselectDataPoint(){$timeout(function(){$scope.selectedDataPoint=null})}function showTooltip(dataPoint){$scope.showToolTipTimeout&&window.clearTimeout($scope.showToolTipTimeout),$scope.showToolTipTimeout=window.setTimeout(function(){$scope.ttHideTimer&&(clearTimeout($scope.ttHideTimer),$scope.ttHideTimer=null);var phSeriesIndex=_.findIndex($scope.seriesList,function(s){return s.projectName==dataPoint.projectName&&s.signature==dataPoint.signature}),phSeries=$scope.seriesList[phSeriesIndex],flotData={series:_.find($scope.plot.getData(),function(fs){return fs.thSeries.projectName==dataPoint.projectName&&fs.thSeries.signature==dataPoint.signature}),pointIndex:phSeries.flotSeries.resultSetData.indexOf(dataPoint.resultSetId)+dataPoint.flotDataOffset},prevResultSetId=_.find(phSeries.flotSeries.resultSetData,function(resultSetId){return resultSetId=0?flotSeriesData[prevFlotDataPointIndex][1]:v,dv=v-v0,dvp=v/v0-1;$scope.tooltipContent={project:_.findWhere($scope.projects,{name:phSeries.projectName}),test:phSeries.name,platform:phSeries.platform,machine:phSeries.machine||"mean",value:Math.round(1e3*v)/1e3,deltaValue:dv.toFixed(1),deltaPercentValue:(100*dvp).toFixed(1),date:$.plot.formatDate(new Date(t),"%a %b %d, %H:%M:%S"),retriggers:retriggerNum.retrigger-1},_.each([{resultSetId:dataPoint.resultSetId,scopeKey:"revision"},{resultSetId:prevResultSetId,scopeKey:"prevRevision"}],function(resultRevision){ThResultSetModel.getRevisions(phSeries.projectName,resultRevision.resultSetId).then(function(revisions){$scope.tooltipContent[resultRevision.scopeKey]=revisions[0]},function(error){console.log("Failed to get revision: "+error.reason)})}),$timeout(function(){function getTipPosition(tip,x,y,yoffset){return{left:x-tip.width()/2,top:y-tip.height()-yoffset}}var x=parseInt(flotData.series.xaxis.p2c(t)+$scope.plot.offset().left),y=parseInt(flotData.series.yaxis.p2c(v)+$scope.plot.offset().top),tip=$("#graph-tooltip");tip.stop(!0);var tipPosition=getTipPosition(tip,x,y,10);tip.css({left:tipPosition.left,top:tipPosition.top});var tipPosition=getTipPosition(tip,x,y,10);"hidden"==tip.css("visibility")?(tip.css({opacity:0,visibility:"visible",left:tipPosition.left,top:tipPosition.top+10}),tip.animate({opacity:1,left:tipPosition.left,top:tipPosition.top},250)):tip.css({opacity:1,left:tipPosition.left,top:tipPosition.top})})},250)}function hideTooltip(now){var tip=$("#graph-tooltip");$scope.showToolTipTimeout&&window.clearTimeout($scope.showToolTipTimeout),$scope.ttHideTimer||"visible"!=tip.css("visibility")||($scope.ttHideTimer=setTimeout(function(){$scope.ttHideTimer=null,tip.animate({opacity:0,top:"+=10"},250,"linear",function(){$(this).css({visibility:"hidden"})})},now?0:250))}function highlightDataPoints(){if($scope.plot.unhighlight(),$scope.seriesList.forEach(function(series,i){series.visible&&series.highlightedPoints.length&&_.forEach(series.highlightedPoints,function(highlightedPoint){$scope.plot.highlight(i,highlightedPoint)})}),$scope.selectedDataPoint){var selectedSeriesIndex=_.findIndex($scope.seriesList,function(s){return s.projectName==$scope.selectedDataPoint.projectName&&s.signature==$scope.selectedDataPoint.signature}),selectedSeries=$scope.seriesList[selectedSeriesIndex],flotDataPoint=selectedSeries.flotSeries.resultSetData.indexOf($scope.selectedDataPoint.resultSetId)+$scope.selectedDataPoint.flotDataOffset;$scope.plot.highlight(selectedSeriesIndex,flotDataPoint)}}function plotOverviewGraph(){$scope.seriesList.forEach(function(series){series.flotSeries.points.show=!1,series.flotSeries.lines.show=series.visible}),$scope.overviewPlot=$.plot($("#overview-plot"),$scope.seriesList.map(function(series){return series.flotSeries}),{xaxis:{mode:"time"},selection:{mode:"xy",color:"#97c6e5"},series:{shadowSize:0},lines:{show:!0},points:{show:!1},legend:{show:!1},grid:{color:"#cdd6df",borderWidth:2,backgroundColor:"#fff",hoverable:!0,clickable:!0,autoHighlight:!1}}),$scope.seriesList.forEach(function(series){series.flotSeries.points.show=series.visible,series.flotSeries.lines.show=!1}),$("#overview-plot").bind("plotunselected",function(){$scope.zoom={},$scope.selectedDataPoint=null,hideTooltip(),updateDocument(),plotGraph()}),$("#overview-plot").bind("plotselected",function(event,ranges){deselectDataPoint(),hideTooltip(),$.each($scope.plot.getXAxes(),function(_,axis){var opts=axis.options;opts.min=ranges.xaxis.from,opts.max=ranges.xaxis.to}),$.each($scope.plot.getYAxes(),function(_,axis){var opts=axis.options;opts.min=ranges.yaxis.from,opts.max=ranges.yaxis.to}),$scope.zoom={x:[ranges.xaxis.from,ranges.xaxis.to],y:[ranges.yaxis.from,ranges.yaxis.to]},$scope.plot.setupGrid(),$scope.plot.draw(),updateDocument()})}function zoomGraph(){$scope.zoom.x&&_.find($scope.seriesList,function(series){return series.visible})&&($.each($scope.plot.getXAxes(),function(_,axis){var opts=axis.options;opts.min=$scope.zoom.x[0],opts.max=$scope.zoom.x[1]}),$.each($scope.plot.getYAxes(),function(_,axis){var opts=axis.options;opts.min=$scope.zoom.y[0],opts.max=$scope.zoom.y[1]}),$scope.plot.setupGrid(),$scope.overviewPlot.setSelection({xaxis:{from:$scope.zoom.x[0],to:$scope.zoom.x[1]},yaxis:{from:$scope.zoom.y[0],to:$scope.zoom.y[1]}}),$scope.overviewPlot.draw(),$scope.plot.draw())}function plotGraph(){$scope.seriesList.forEach(function(series){series.flotSeries.points.show=series.visible,series.active=!series.subtestSignatures||"mean"===$scope.myMeasure,series.blockColor=series.active?series.color:"grey"}),$scope.seriesList.forEach(function(series){series.highlightedPoints=[]});var highlightPromises=[];_.each($scope.highlightedRevisions,function(rev){rev&&12==rev.length&&(highlightPromises=_.union(highlightPromises,$scope.seriesList.map(function(series){return series.visible?ThResultSetModel.getResultSetsFromRevision(series.projectName,rev).then(function(resultSets){var resultSetId=resultSets[0].id,j=series.flotSeries.resultSetData.indexOf(resultSetId),seriesToaddHighlight=_.find($scope.seriesList,function(sr){return sr.signature==series.signature});seriesToaddHighlight.highlightedPoints.push(j)}):null})))}),$q.all(highlightPromises).then(function(){function updateSelectedItem(){return $scope.selectedDataPoint?void 0:void hideTooltip()}$scope.plot=$.plot($("#graph"),$scope.seriesList.map(function(series){return series.flotSeries}),{xaxis:{mode:"time"},series:{shadowSize:0},lines:{show:!1},points:{show:!0},legend:{show:!1},grid:{color:"#cdd6df",borderWidth:2,backgroundColor:"#fff",hoverable:!0,clickable:!0,autoHighlight:!1}}),updateSelectedItem(null),highlightDataPoints(),plotOverviewGraph(),zoomGraph(),$("#graph").bind("plothover",function(event,pos,item){if(!$scope.selectedDataPoint)if($("#graph").css({cursor:item?"pointer":"default"}),item&&item.series.thSeries){if(item.seriesIndex!=$scope.prevSeriesIndex||item.dataIndex!=$scope.prevDataIndex){var seriesDataPoint=getSeriesDataPoint(item);showTooltip(seriesDataPoint),$scope.prevSeriesIndex=item.seriesIndex,$scope.prevDataIndex=item.dataIndex}}else hideTooltip(),$scope.prevSeriesIndex=null,$scope.prevDataIndex=null}),$("#graph").bind("plotclick",function(e,pos,item){item?($scope.selectedDataPoint=getSeriesDataPoint(item),showTooltip($scope.selectedDataPoint),updateSelectedItem()):($scope.selectedDataPoint=null,hideTooltip(),$scope.$digest()),highlightDataPoints()})})}function updateDocument(){$state.transitionTo("graphs",{timerange:$scope.myTimerange.value,series:$scope.seriesList.map(function(series){return"["+series.projectName+","+series.signature+","+(series.visible?1:0)+"]"}),highlightedRevisions:_.filter($scope.highlightedRevisions,function(highlight){return highlight&&12==highlight.length}),zoom:function(){if("undefined"!=typeof $scope.zoom.x&&"undefined"!=typeof $scope.zoom.y&&0!=$scope.zoom.x&&0!=$scope.zoom.y){var modifiedZoom=("["+($scope.zoom.x.toString()+","+$scope.zoom.y.toString())+"]").replace(/[\[\{\}\]"]+/g,"");return modifiedZoom}return $scope.zoom=[],$scope.zoom}()},{location:!0,inherit:!0,relative:$state.$current,notify:!1}),$scope.seriesList.length?(window.document.title=$scope.seriesList[0].name+" "+$scope.seriesList[0].platform+" ("+$scope.seriesList[0].projectName+")",$scope.seriesList.length>1&&(window.document.title+=" and others")):window.document.title="Perfherder Graphs"}function getSeriesData(series){return $http.get(thServiceDomain+"/api/project/"+series.projectName+"/performance-data/get_performance_data/?interval_seconds="+$scope.myTimerange.value+"&signatures="+series.signature).then(function(response){var flotSeries={lines:{show:!1},points:{show:series.visible},color:series.color,label:series.projectName+" "+series.name,data:[],resultSetData:[],thSeries:jQuery.extend({},series)};response.data[0].blob.forEach(function(dataPoint){var measure=dataPoint.mean;"min"===$scope.myMeasure?measure=dataPoint.min:"max"===$scope.myMeasure?measure=dataPoint.max:"median"===$scope.myMeasure?measure=dataPoint.median:"mean"===$scope.myMeasure&&(measure=dataPoint.mean,void 0===measure&&(measure=dataPoint.geomean)),flotSeries.data.push([new Date(1e3*dataPoint.push_timestamp),measure]),flotSeries.resultSetData.push(dataPoint.result_set_id)}),flotSeries.data.sort(function(a,b){return a[0]>b[0]}),series.flotSeries=flotSeries})}function addSeriesList(partialSeriesList){var propsHash={};return $q.all(partialSeriesList.map(function(partialSeries){return $http.get(thServiceDomain+"/api/project/"+partialSeries.project+"/performance-data/get_signature_properties/?signatures="+partialSeries.signature).then(function(response){var data=response.data;propsHash[partialSeries.project]||(propsHash[partialSeries.project]={}),propsHash[partialSeries.project][partialSeries.signature]=data[0]})})).then(function(){partialSeriesList.forEach(function(partialSeries){var seriesSummary=PhSeries.getSeriesSummary(partialSeries.signature,propsHash[partialSeries.project][partialSeries.signature],optionCollectionMap);seriesSummary.projectName=partialSeries.project,seriesSummary.visible=partialSeries.visible,seriesSummary.color=availableColors.pop(),seriesSummary.highlighted=partialSeries.highlighted,$scope.seriesList.push(seriesSummary)}),$q.all($scope.seriesList.map(getSeriesData)).then(function(){plotGraph(),$scope.selectedDataPoint&&showTooltip($scope.selectedDataPoint)})})}var availableColors=["red","green","blue","orange","purple"],optionCollectionMap=null;$scope.highlightedRevisions=[void 0,void 0],$scope.timeranges=phTimeRanges,$scope.myTimerange=_.find(phTimeRanges,{value:parseInt($stateParams.timerange)}),$scope.myMeasure="mean",$scope.ttHideTimer=null,$scope.selectedDataPoint=null,$scope.showToolTipTimeout=null,$scope.seriesList=[],Mousetrap.bind("escape",function(){deselectDataPoint()}),$scope.myTimerange||($scope.myTimerange=$scope.timeranges[1]),$scope.timeRangeChanged=function(){$scope.zoom={},deselectDataPoint(),updateDocument(),$q.all($scope.seriesList.map(getSeriesData)).then(function(){plotGraph()})},$scope.myMeasureChanged=function(){$scope.zoom={},deselectDataPoint(),updateDocument(),$q.all($scope.seriesList.map(getSeriesData)).then(function(){plotGraph()})},$scope.repoName=$stateParams.projectId,$scope.removeSeries=function(projectName,signature){var newSeriesList=[];$scope.seriesList.forEach(function(series){series.signature!==signature||series.projectName!==projectName?newSeriesList.push(series):(availableColors.push(series.color),$scope.selectedDataPoint&&$scope.selectedDataPoint.signature===signature&&$scope.selectedDataPoint.projectName===projectName&&($scope.selectedDataPoint=null))}),$scope.seriesList=newSeriesList,0==$scope.seriesList.length&&($scope.resetHighlight(),$scope.zoom={}),updateDocument(),plotGraph(),$scope.selectedDataPoint&&showTooltip($scope.selectedDataPoint)},$scope.showHideSeries=function(signature){updateDocument(),plotGraph()},$scope.resetHighlight=function(i){$scope.highlightedRevisions[i]="",$scope.updateHighlightedRevisions()},$scope.updateHighlightedRevisions=function(){updateDocument(),plotGraph()},ThOptionCollectionModel.get_map().then(function(_optionCollectionMap){if(optionCollectionMap=_optionCollectionMap,$stateParams.zoom){var zoomString=decodeURIComponent($stateParams.zoom).replace(/[\[\{\}\]"]+/g,""),zoomArray=zoomString.split(","),zoomObject={x:zoomArray.slice(0,2),y:zoomArray.slice(2,4)};$scope.zoom=zoomString?zoomObject:[]}else $scope.zoom=[];if($stateParams.series){$scope.seriesList=[],_.isString($stateParams.series)&&($stateParams.series=[$stateParams.series]),$stateParams.highlightedRevisions?"string"==typeof $stateParams.highlightedRevisions?$scope.highlightedRevisions=[$stateParams.highlightedRevisions]:$scope.highlightedRevisions=$stateParams.highlightedRevisions:$scope.highlightedRevisions=["",""];var partialSeriesList=$stateParams.series.map(function(encodedSeries){var partialSeriesString=decodeURIComponent(encodedSeries).replace(/[\[\]"]/g,""),partialSeriesArray=partialSeriesString.split(","),partialSeriesObject={project:partialSeriesArray[0],signature:partialSeriesArray[1],visible:0==partialSeriesArray[2]?!1:!0};return partialSeriesObject});addSeriesList(partialSeriesList)}else $scope.seriesList=[],addSeriesList([]);ThRepositoryModel.get_list().then(function(response){$scope.projects=response.data,$scope.addTestData=function(){var defaultProjectName,defaultPlatform;if($scope.seriesList.length>0){var lastSeries=$scope.seriesList.slice(-1)[0];defaultProjectName=lastSeries.projectName,defaultPlatform=lastSeries.platform}var modalInstance=$modal.open({templateUrl:"partials/perf/testdatachooser.html",controller:"TestChooserCtrl",size:"lg",resolve:{projects:function(){return $scope.projects},optionCollectionMap:function(){return optionCollectionMap},timeRange:function(){return $scope.myTimerange.value},defaultProjectName:function(){return defaultProjectName},defaultPlatform:function(){return defaultPlatform}}});modalInstance.opened.then(function(){window.setTimeout(function(){modalInstance.updateTestInput()},0)}),modalInstance.result.then(function(seriesList){seriesList.forEach(function(series){series.hightlightedPoints=[],series.visible=!0,series.color=availableColors.pop(),$scope.seriesList.push(series)}),$scope.highlightedRevision||($scope.highlightedRevision=""),$scope.zoom||($scope.zoom={}),updateDocument(),$q.all($scope.seriesList.map(getSeriesData)).then(function(){plotGraph()})})}})})}]),perf.controller("TestChooserCtrl",function($scope,$modalInstance,$http,projects,optionCollectionMap,timeRange,thServiceDomain,PhSeries,defaultProjectName,defaultPlatform){$scope.timeRange=timeRange,$scope.projects=projects,defaultProjectName?$scope.selectedProject=_.findWhere(projects,{name:defaultProjectName}):$scope.selectedProject=projects[0],$scope.loadingTestData=!1;var testInputCreated=!1,testArray=[],series=[];$scope.addTestData=function(){$scope.selectedSeriesList=$scope.addedTestList,$scope.selectedSeriesList.forEach(function(selectedSeries,i){series[i]=_.clone(selectedSeries),series[i].projectName=selectedSeries.projectName}),$modalInstance.close(series)},$scope.cancel=function(){$modalInstance.dismiss("cancel")},$scope.selectedTestList=[],$scope.unselectedTestList=[],$scope.addedTestList=[],$scope.unselectTest=function(){$scope.unselectedTestList.forEach(function(test){test=JSON.parse(test);var selected=-1;if($scope.addedTestList.forEach(function(obj,i){obj.name===test.name&&(selected=i)}),-1!==selected)if(test.platform===$scope.selectedPlatform&&test.projectName===$scope.selectedProject.name){var temp=$scope.addedTestList.splice(selected,1)[0].name;$scope.testList.push(temp)}else $scope.addedTestList.splice(selected,1)})},$scope.selectTest=function(){var selected;$scope.selectedTestList.forEach(function(test){if(selected=$scope.testList.indexOf(test),-1!==selected){var series=$scope.testList.splice(selected,1)[0],result=testArray.filter(function(obj){return obj.name==series});selected=_.clone(result[0]),selected.projectName=$scope.selectedProject.name,$scope.addedTestList.push(selected)}})},$scope.updateTestInput=function(){$scope.addTestDataDisabled=!0,$scope.loadingTestData=!0,$scope.platformList=[],PhSeries.getAllSeries($scope.selectedProject.name,$scope.timeRange,optionCollectionMap).then(function(seriesData){$scope.platformList=seriesData.platformList,$scope.platformList.sort(),$scope.selectedPlatform=defaultPlatform||$scope.platformList[0],$scope.updateTestSelector=function(){var filteredSeriesList=seriesData.seriesList.filter(function(series){return series.platform===$scope.selectedPlatform}).sort(function(a,b){return a.name>b.name});testArray=filteredSeriesList,$scope.testList=_.map(filteredSeriesList,function(series){return series.name}),testInputCreated=!0},$scope.updateTestSelector(),$scope.loadingTestData=!1})},$modalInstance.updateTestInput=$scope.updateTestInput}),treeherder.directive("phAverage",function(){return{templateUrl:"partials/perf/average.html",scope:{value:"@",replicates:"="}}}),treeherder.directive("phConfidence",function(){return{templateUrl:"partials/perf/compareconfidence.html",scope:{text:"@",value:"@"}}}),perf.config(function($compileProvider,$stateProvider,$urlRouterProvider){$compileProvider.debugInfoEnabled(!1),$urlRouterProvider.deferIntercept(),$stateProvider.state("graphs",{templateUrl:"partials/perf/graphsctrl.html",url:"/graphs?timerange&series&highlightedRevisions&zoom",controller:"GraphsCtrl"}).state("compare",{templateUrl:"partials/perf/comparectrl.html",url:"/compare?originalProject&originalRevision&newProject&newRevision&hideMinorChanges&e10s",controller:"CompareResultsCtrl"}).state("comparesubtest",{templateUrl:"partials/perf/comparesubtestctrl.html",url:"/comparesubtest?originalProject&originalRevision&newProject&newRevision&originalSignature&newSignature&hideMinorChanges",controller:"CompareSubtestResultsCtrl"}).state("comparechooser",{templateUrl:"partials/perf/comparechooserctrl.html",url:"/comparechooser",controller:"CompareChooserCtrl"}),$urlRouterProvider.otherwise("/graphs")}).run(function($rootScope,$urlRouter,$location,$state){$rootScope.$state=$state,$rootScope.$on("$locationChangeSuccess",function(e,newUrl,oldUrl){e.preventDefault(),("graphs"!==$state.current.name||-1===newUrl.indexOf("graphs"))&&$urlRouter.sync()}),$urlRouter.listen()});angular.module('perf').run(['$templateCache', function($templateCache) {
+element.style.height=height+"px",this.height=height),context.restore(),context.save(),context.scale(pixelRatio,pixelRatio)},Canvas.prototype.clear=function(){this.context.clearRect(0,0,this.width,this.height)},Canvas.prototype.render=function(){var cache=this._textCache;for(var layerKey in cache)if(hasOwnProperty.call(cache,layerKey)){var layer=this.getTextLayer(layerKey),layerCache=cache[layerKey];layer.hide();for(var styleKey in layerCache)if(hasOwnProperty.call(layerCache,styleKey)){var styleCache=layerCache[styleKey];for(var key in styleCache)if(hasOwnProperty.call(styleCache,key)){for(var position,positions=styleCache[key].positions,i=0;position=positions[i];i++)position.active?position.rendered||(layer.append(position.element),position.rendered=!0):(positions.splice(i--,1),position.rendered&&position.element.detach());0==positions.length&&delete styleCache[key]}}layer.show()}},Canvas.prototype.getTextLayer=function(classes){var layer=this.text[classes];return null==layer&&(null==this.textContainer&&(this.textContainer=$("
").css({position:"absolute",top:0,left:0,bottom:0,right:0,"font-size":"smaller",color:"#545454"}).insertAfter(this.element)),layer=this.text[classes]=$("
").addClass(classes).css({position:"absolute",top:0,left:0,bottom:0,right:0}).appendTo(this.textContainer)),layer},Canvas.prototype.getTextInfo=function(layer,text,font,angle,width){var textStyle,layerCache,styleCache,info;if(text=""+text,textStyle="object"==typeof font?font.style+" "+font.variant+" "+font.weight+" "+font.size+"px/"+font.lineHeight+"px "+font.family:font,layerCache=this._textCache[layer],null==layerCache&&(layerCache=this._textCache[layer]={}),styleCache=layerCache[textStyle],null==styleCache&&(styleCache=layerCache[textStyle]={}),info=styleCache[text],null==info){var element=$("
").html(text).css({position:"absolute","max-width":width,top:-9999}).appendTo(this.getTextLayer(layer));"object"==typeof font?element.css({font:textStyle,color:font.color}):"string"==typeof font&&element.addClass(font),info=styleCache[text]={width:element.outerWidth(!0),height:element.outerHeight(!0),element:element,positions:[]},element.detach()}return info},Canvas.prototype.addText=function(layer,x,y,text,font,angle,width,halign,valign){var info=this.getTextInfo(layer,text,font,angle,width),positions=info.positions;"center"==halign?x-=info.width/2:"right"==halign&&(x-=info.width),"middle"==valign?y-=info.height/2:"bottom"==valign&&(y-=info.height);for(var position,i=0;position=positions[i];i++)if(position.x==x&&position.y==y)return void(position.active=!0);position={active:!0,rendered:!1,element:positions.length?info.element.clone():info.element,x:x,y:y},positions.push(position),position.element.css({top:Math.round(y),left:Math.round(x),"text-align":halign})},Canvas.prototype.removeText=function(layer,x,y,text,font,angle){if(null==text){var layerCache=this._textCache[layer];if(null!=layerCache)for(var styleKey in layerCache)if(hasOwnProperty.call(layerCache,styleKey)){var styleCache=layerCache[styleKey];for(var key in styleCache)if(hasOwnProperty.call(styleCache,key))for(var position,positions=styleCache[key].positions,i=0;position=positions[i];i++)position.active=!1}}else for(var position,positions=this.getTextInfo(layer,text,font,angle).positions,i=0;position=positions[i];i++)position.x==x&&position.y==y&&(position.active=!1)},$.plot=function(placeholder,data,options){var plot=new Plot($(placeholder),data,options,$.plot.plugins);return plot},$.plot.version="0.8.3",$.plot.plugins=[],$.fn.plot=function(data,options){return this.each(function(){$.plot(this,data,options)})}}(jQuery),function($){function floorInBase(n,base){return base*Math.floor(n/base)}function formatDate(d,fmt,monthNames,dayNames){if("function"==typeof d.strftime)return d.strftime(fmt);var leftPad=function(n,pad){return n=""+n,pad=""+(null==pad?"0":pad),1==n.length?pad+n:n},r=[],escape=!1,hours=d.getHours(),isAM=12>hours;null==monthNames&&(monthNames=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]),null==dayNames&&(dayNames=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]);var hours12;hours12=hours>12?hours-12:0==hours?12:hours;for(var i=0;i=minSize);++i);var size=spec[i][0],unit=spec[i][1];if("year"==unit){if(null!=opts.minTickSize&&"year"==opts.minTickSize[1])size=Math.floor(opts.minTickSize[0]);else{var magn=Math.pow(10,Math.floor(Math.log(axis.delta/timeUnitSize.year)/Math.LN10)),norm=axis.delta/timeUnitSize.year/magn;size=1.5>norm?1:3>norm?2:7.5>norm?5:10,size*=magn}1>size&&(size=1)}axis.tickSize=opts.tickSize||[size,unit];var tickSize=axis.tickSize[0];unit=axis.tickSize[1];var step=tickSize*timeUnitSize[unit];"second"==unit?d.setSeconds(floorInBase(d.getSeconds(),tickSize)):"minute"==unit?d.setMinutes(floorInBase(d.getMinutes(),tickSize)):"hour"==unit?d.setHours(floorInBase(d.getHours(),tickSize)):"month"==unit?d.setMonth(floorInBase(d.getMonth(),tickSize)):"quarter"==unit?d.setMonth(3*floorInBase(d.getMonth()/3,tickSize)):"year"==unit&&d.setFullYear(floorInBase(d.getFullYear(),tickSize)),d.setMilliseconds(0),step>=timeUnitSize.minute&&d.setSeconds(0),step>=timeUnitSize.hour&&d.setMinutes(0),step>=timeUnitSize.day&&d.setHours(0),step>=4*timeUnitSize.day&&d.setDate(1),step>=2*timeUnitSize.month&&d.setMonth(floorInBase(d.getMonth(),3)),step>=2*timeUnitSize.quarter&&d.setMonth(floorInBase(d.getMonth(),6)),step>=timeUnitSize.year&&d.setMonth(0);var prev,carry=0,v=Number.NaN;do if(prev=v,v=d.getTime(),ticks.push(v),"month"==unit||"quarter"==unit)if(1>tickSize){d.setDate(1);var start=d.getTime();d.setMonth(d.getMonth()+("quarter"==unit?3:1));var end=d.getTime();d.setTime(v+carry*timeUnitSize.hour+(end-start)*tickSize),carry=d.getHours(),d.setHours(0)}else d.setMonth(d.getMonth()+tickSize*("quarter"==unit?3:1));else"year"==unit?d.setFullYear(d.getFullYear()+tickSize):d.setTime(v+step);while(vt?e:t>o?o:t}function l(e,o){var n=t.getOptions(),i=t.getPlaceholder().offset(),s=t.getPlotOffset();e.x=c(0,o.pageX-i.left-s.left,t.width()),e.y=c(0,o.pageY-i.top-s.top,t.height()),"y"==n.selection.mode&&(e.x=e==h.first?0:t.width()),"x"==n.selection.mode&&(e.y=e==h.first?0:t.height())}function a(e){null!=e.pageX&&(l(h.second,e),g()?(h.show=!0,t.triggerRedrawOverlay()):u(!0))}function u(e){h.show&&(h.show=!1,t.triggerRedrawOverlay(),e||t.getPlaceholder().trigger("plotunselected",[]))}function d(e,o){var n,i,s,r,c=t.getAxes();for(var l in c)if(n=c[l],n.direction==o&&(r=o+n.n+"axis",e[r]||1!=n.n||(r=o+"axis"),e[r])){i=e[r].from,s=e[r].to;break}if(e[r]||(n="x"==o?t.getXAxes()[0]:t.getYAxes()[0],i=e[o+"1"],s=e[o+"2"]),null!=i&&null!=s&&i>s){var a=i;i=s,s=a}return{from:i,to:s,axis:n}}function f(e,o){var n,i=t.getOptions();"y"==i.selection.mode?(h.first.x=0,h.second.x=t.width()):(n=d(e,"x"),h.first.x=n.axis.p2c(n.from),h.second.x=n.axis.p2c(n.to)),"x"==i.selection.mode?(h.first.y=0,h.second.y=t.height()):(n=d(e,"y"),h.first.y=n.axis.p2c(n.from),h.second.y=n.axis.p2c(n.to)),h.show=!0,t.triggerRedrawOverlay(),!o&&g()&&r()}function g(){var e=t.getOptions().selection.minSize;return Math.abs(h.second.x-h.first.x)>=e&&Math.abs(h.second.y-h.first.y)>=e}var h={first:{x:-1,y:-1},second:{x:-1,y:-1},show:!1,active:!1},m={},x=null;t.clearSelection=u,t.setSelection=f,t.getSelection=s,t.hooks.bindEvents.push(function(e,t){var i=e.getOptions();null!=i.selection.mode&&(t.mousemove(o),t.mousedown(n))}),t.hooks.drawOverlay.push(function(t,o){if(h.show&&g()){var n=t.getPlotOffset(),i=t.getOptions();o.save(),o.translate(n.left,n.top);var s=e.color.parse(i.selection.color);o.strokeStyle=s.scale("a",.8).toString(),o.lineWidth=1,o.lineJoin=i.selection.shape,o.fillStyle=s.scale("a",.4).toString();var r=Math.min(h.first.x,h.second.x)+.5,c=Math.min(h.first.y,h.second.y)+.5,l=Math.abs(h.second.x-h.first.x)-1,a=Math.abs(h.second.y-h.first.y)-1;o.fillRect(r,c,l,a),o.strokeRect(r,c,l,a),o.restore()}}),t.hooks.shutdown.push(function(t,i){i.unbind("mousemove",o),i.unbind("mousedown",n),x&&e(document).unbind("mouseup",x)})}e.plot.plugins.push({init:t,options:{selection:{mode:null,color:"#e8cfac",shape:"round",minSize:5}},name:"selection",version:"1.1"})}(jQuery),function(J,r,f){function s(a,b,d){a.addEventListener?a.addEventListener(b,d,!1):a.attachEvent("on"+b,d)}function A(a){if("keypress"==a.type){var b=String.fromCharCode(a.which);return a.shiftKey||(b=b.toLowerCase()),b}return h[a.which]?h[a.which]:B[a.which]?B[a.which]:String.fromCharCode(a.which).toLowerCase()}function t(a){a=a||{};var d,b=!1;for(d in n)a[d]?b=!0:n[d]=0;b||(u=!1)}function C(a,b,d,c,e,v){var g,k,f=[],h=d.type;if(!l[a])return[];for("keyup"==h&&w(a)&&(b=[a]),g=0;g95&&112>g||h.hasOwnProperty(g)&&(p[h[g]]=g)}e=p[d]?"keydown":"keypress"}return"keypress"==e&&f.length&&(e="keydown"),{key:c,modifiers:f,action:e}}function F(a,b,d,c,e){q[a+":"+d]=b,a=a.replace(/\s+/g," ");var f=a.split(" ");1":".","?":"/","|":"\\"},G={option:"alt",command:"meta","return":"enter",escape:"esc",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"meta":"ctrl"},l={},q={},n={},z=!1,I=!1,u=!1;for(f=1;20>f;++f)h[111+f]="f"+f;for(f=0;9>=f;++f)h[f+96]=f;s(r,"keypress",y),s(r,"keydown",y),s(r,"keyup",y);var m={bind:function(a,b,d){a=a instanceof Array?a:[a];for(var c=0;c=0&&"try-comm-central"!==name?name+"-thunderbird":name},getRepoName=function(name){return name.replace("-thunderbird","")},get=function(repoName){var url=urlBase+getTreeStatusName(repoName);return $http.get(url,{params:{format:"json"}})};return{get:get,getTreeStatusName:getTreeStatusName,getRepoName:getRepoName}}]),treeherder.provider("thServiceDomain",function(){this.$get=function(){return window.thServiceDomain?window.thServiceDomain:""}}),treeherder.provider("thResultStatusList",function(){var all=function(){return["success","testfailed","busted","exception","retry","usercancel","running","pending","coalesced"]},defaultFilters=function(){return["success","testfailed","busted","exception","retry","usercancel","running","pending"]};this.$get=function(){return{all:all,defaultFilters:defaultFilters}}}),treeherder.provider("thResultStatus",function(){this.$get=function(){return function(job){return"completed"===job.state?job.result:null!==job.job_coalesced_to_guid?"coalesced":job.state}}}),treeherder.provider("thResultStatusObject",function(){var getResultStatusObject=function(){return{running:0,pending:0,completed:0}};this.$get=function(){return{getResultStatusObject:getResultStatusObject}}}),treeherder.provider("thResultStatusInfo",function(){this.$get=function(){return function(resultState){var resultStatusInfo={severity:100,btnClass:"btn-default",jobButtonIcon:""};switch(resultState){case"busted":resultStatusInfo={severity:1,btnClass:"btn-red",btnClassClassified:"btn-red-classified",jobButtonIcon:"glyphicon glyphicon-fire",countText:"busted"};break;case"exception":resultStatusInfo={severity:2,btnClass:"btn-purple",btnClassClassified:"btn-purple-classified",jobButtonIcon:"glyphicon glyphicon-fire",countText:"exception"};break;case"testfailed":resultStatusInfo={severity:3,btnClass:"btn-orange",btnClassClassified:"btn-orange-classified",jobButtonIcon:"glyphicon glyphicon-warning-sign",countText:"failed"};break;case"unknown":resultStatusInfo={severity:4,btnClass:"btn-black",btnClassClassified:"btn-black-classified",jobButtonIcon:"",countText:"unknown"};break;case"usercancel":resultStatusInfo={severity:5,btnClass:"btn-pink",jobButtonIcon:"",countText:"cancel"};break;case"retry":resultStatusInfo={severity:6,btnClass:"btn-dkblue",jobButtonIcon:"",countText:"retry"};break;case"success":resultStatusInfo={severity:7,btnClass:"btn-green",jobButtonIcon:"",countText:"success"};break;case"running":resultStatusInfo={severity:8,btnClass:"btn-dkgray",jobButtonIcon:"",countText:"running"};break;case"pending":resultStatusInfo={severity:100,btnClass:"btn-ltgray",jobButtonIcon:"",countText:"pending"};break;case"coalesced":resultStatusInfo={severity:101,btnClass:"btn-yellow",jobButtonIcon:"",countText:"coalesced"}}return resultStatusInfo}}}),treeherder.provider("thEvents",function(){this.$get=function(){return{revisionsLoaded:"revisions-loaded-EVT",jobClick:"job-click-EVT",jobDetailLoaded:"job-detail-loaded-EVT",jobPin:"job-pin-EVT",jobRetrigger:"job-retrigger-EVT",jobContextMenu:"job-context-menu-EVT",jobsClassified:"jobs-classified-EVT",bugsAssociated:"bugs-associated-EVT",jobsLoaded:"jobs-loaded-EVT",clearSelectedJob:"clear-selected-job-EVT",globalFilterChanged:"status-filter-changed-EVT",toggleRevisions:"toggle-revisions-EVT",toggleAllRevisions:"toggle-all-revisions-EVT",toggleUnclassifiedFailures:"toggle-unclassified-failures-EVT",changeSelection:"next-previous-job-EVT",addRelatedBug:"add-related-bug-EVT",saveClassification:"save-classification-EVT",deleteClassification:"delete-classification-EVT",clearPinboard:"clear-pinboard-EVT",searchPage:"search-page-EVT",selectJob:"select-job-EVT",mapResultSetJobs:"map-result-set-jobs-EVT",applyNewJobs:"apply-new-jobs-EVT",initSheriffPanel:"init-sheriff-panel-EVT",openLogviewer:"open-logviewer-EVT"}}}),treeherder.provider("thAggregateIds",function(){var escape=function(id){return id.replace(/(:|\[|\]|\?|,|\.|\s+)/g,"-")},getPlatformRowId=function(repoName,resultsetId,platformName,platformOptions){return escape(repoName+resultsetId+platformName+platformOptions)},getResultsetTableId=function(repoName,resultsetId,revision){return escape(repoName+resultsetId+revision)};this.$get=function(){return{getPlatformRowId:getPlatformRowId,getResultsetTableId:getResultsetTableId}}}),treeherder.provider("thReftestStatus",function(){this.$get=function(){return function(job){return job.job_group_name?-1!==job.job_group_name.toLowerCase().indexOf("reftest"):void 0}}}),treeherder.value("thPlatformNameMap",{linux32:"Linux",linux64:"Linux x64","osx-10-6":"OS X 10.6","osx-10-7":"OS X 10.7","osx-10-8":"OS X 10.8","osx-10-9":"OS X 10.9","osx-10-10":"OS X 10.10",windowsxp:"Windows XP","windows7-32":"Windows 7","windows7-64":"Windows 7 x64","windows8-32":"Windows 8","windows8-64":"Windows 8 x64","windows2012-64":"Windows 2012 x64","android-2-2-armv6":"Android 2.2 Armv6","android-2-2":"Android 2.2","android-2-3-armv6":"Android 2.3 Armv6","android-2-3":"Android 2.3","android-2-3-armv7-api9":"Android 2.3 API9","android-4-0":"Android 4.0","android-4-0-armv7-api10":"Android 4.0 API10+","android-4-0-armv7-api11":"Android 4.0 API11+","android-4-2-x86":"Android 4.2 x86","android-4-2":"Android 4.2","android-4-2-armv7-api11":"Android 4.2 API11+","android-4-3":"Android 4.3","android-4-3-armv7-api11":"Android 4.3 API11+","android-4-4":"Android 4.4","android-4-4-armv7-api11":"Android 4.4 API11+","android-5-0-armv7-api11":"Android 5.0 API11+","b2g-linux32":"B2G Desktop Linux","b2g-linux64":"B2G Desktop Linux x64","b2g-osx":"B2G Desktop OS X","b2g-win32":"B2G Desktop Windows","b2g-emu-ics":"B2G ICS Emulator","b2g-emu-jb":"B2G JB Emulator","b2g-emu-kk":"B2G KK Emulator","b2g-emu-l":"B2G L Emulator","b2g-device-image":"B2G Device Image","mulet-linux32":"Mulet Linux","mulet-linux64":"Mulet Linux x64","mulet-osx":"Mulet OS X","mulet-win32":"Mulet Windows","graphene-linux64":"Graphene Linux x64","graphene-osx":"Graphene OS X","graphene-win64":"Graphene Windows x64","horizon-linux64":"Horizon Linux x64","horizon-osx":"Horizon OS X","horizon-win64":"Horizon Windows x64",other:"Other"}),treeherder.value("thPlatformOrder",{linux32:0,linux64:1,"osx-10-6":10,"osx-10-7":11,"osx-10-8":12,"osx-10-9":13,"osx-10-10":14,windowsxp:20,"windows7-32":21,"windows7-64":22,"windows8-32":23,"windows8-64":24,"windows2012-64":25,"android-2-2-armv6":30,"android-2-2":31,"android-2-3-armv6":32,"android-2-3":33,"android-2-3-armv7-api9":34,"android-4-0":35,"android-4-0-armv7-api10":36,"android-4-0-armv7-api11":37,"android-4-2-x86":38,"android-4-2":39,"android-4-2-armv7-api11":40,"android-4-3":41,"android-4-3-armv7-api11":42,"android-4-4":43,"android-4-4-armv7-api11":44,"android-5-0-armv7-api11":45,"b2g-linux32":50,"b2g-linux64":51,"b2g-osx":52,"b2g-win32":53,"b2g-emu-ics":54,"b2g-emu-jb":55,"b2g-emu-kk":56,"b2g-emu-l":57,"b2g-device-image":58,"mulet-linux32":60,"mulet-linux64":61,"mulet-osx":62,"mulet-win32":63,"graphene-linux64":71,"graphene-osx":72,"graphene-win64":73,"horizon-linux64":74,"horizon-osx":75,"horizon-win64":76,other:99}),treeherder.value("thOptionOrder",{opt:0,pgo:1,asan:2,debug:3,cc:4}),treeherder.value("thFailureResults",["testfailed","busted","exception"]),treeherder.value("thFavicons",{closed:"img/tree_closed.png",open:"img/tree_open.png","approval required":"img/tree_open.png",unavailable:"img/tree_open.png"}),treeherder.value("thRepoGroupOrder",{development:1,"project repositories":2,"try":3,"release-stabilization":4,taskcluster:5,"qa automation tests":6}),treeherder.value("thDefaultRepo","mozilla-inbound"),treeherder.value("thDateFormat","EEE MMM d, H:mm:ss"),treeherder.value("phTimeRanges",[{value:86400,text:"Last day"},{value:604800,text:"Last 7 days"},{value:1209600,text:"Last 14 days"},{value:2592e3,text:"Last 30 days"},{value:5184e3,text:"Last 60 days"},{value:7776e3,text:"Last 90 days"},{value:31536e3,text:"Last year"}]),treeherder.value("thJobNavSelectors",{ALL_JOBS:{name:"jobs",selector:".th-view-content .job-btn"},UNCLASSIFIED_FAILURES:{name:"unclassified failures",selector:".selected-job, .th-view-content .job-btn.btn-red, .th-view-content .job-btn.btn-orange, .th-view-content .job-btn.btn-purple"}}),treeherder.factory("ThOptionCollectionModel",["$http","$log","thUrl",function($http,$log,thUrl){var get_list=function(options){options=options||{};var query_string=$.param(options);return $http.get(thUrl.getRootUrl("/optioncollectionhash/")+"?"+query_string)},get_map=function(options){return get_list(options).then(function(optCollectionData){var optionCollectionMap={};return _.each(optCollectionData.data,function(optColl){optionCollectionMap[optColl.option_collection_hash]=_.uniq(_.map(optColl.options,function(option){return option.name})).sort().join()}),optionCollectionMap})};return{get_list:get_list,get_map:get_map}}]),treeherder.factory("thUrl",["$rootScope","thServiceDomain","ThLog",function($rootScope,thServiceDomain,ThLog){var thUrl={getRootUrl:function(uri){return thServiceDomain+"/api"+uri},getProjectUrl:function(uri,repoName){return _.isUndefined(repoName)&&(repoName=$rootScope.repoName),thServiceDomain+"/api/project/"+repoName+uri},getLogViewerUrl:function(job_id){return"logviewer.html#?job_id="+job_id+"&repo="+$rootScope.repoName}};return thUrl}]),treeherder.factory("thCloneHtml",["$interpolate",function($interpolate){var templateId,templateName,templateTxt,i,cloneTemplateIds=["revisionsClone.html","resultsetClone.html","platformClone.html","jobTdClone.html","jobGroupBeginClone.html","jobBtnClone.html","revisionUrlClone.html","pushlogRevisionsClone.html"],cloneHtmlObjs={};for(i=0;imaxNsNotifications)return void $timeout(thNotify.shift);$timeout(thNotify.shift,4e3,!0)}},shift:function(){for(var i=0;itreestatus.mozilla.org',reason:"",tree:repoName}},updateTreeStatus=function(repoName){var repoNames=watchedRepos[repoName]?[repoName]:_.keys(watchedRepos);repoNames=_.filter(repoNames,function(repo){return watchedRepos[repo]&&"unsupported"!==watchedRepos[repo].treeStatus.status?repo:void 0});var newStatuses={},getStatus=function(repo){$log.debug("updateTreeStatus","getStatus","updating",repo),treeStatus.get(repo).then(function(data){newStatuses[repo]=data.data,updateStatusesIfDone()},function(data){newStatuses[repo]=getUnsupportedTreeStatus(repo),updateStatusesIfDone()})},updateStatusesIfDone=function(){_.size(newStatuses)===repoNames.length&&_.defer(function(){_.each(newStatuses,function(status){$log.debug("updateTreeStatus","updateStatusesIfDone",status.tree,status.status),watchedRepos[treeStatus.getRepoName(status.tree)].treeStatus=status})})};_.each(repoNames,getStatus)};return{load:load,get_list:get_list,getCurrent:getCurrent,setCurrent:setCurrent,getRepo:getByName,getOrderedRepoGroups:getOrderedRepoGroups,getCurrentTreeStatus:getCurrentTreeStatus,repos:repos,watchedRepos:watchedRepos,loadWatchedRepos:loadWatchedRepos,saveWatchedRepos:saveWatchedRepos,unwatchRepo:unwatchRepo,toggleWatched:toggleWatched}}]),treeherder.factory("ThJobModel",["$http","ThLog","thUrl","$q",function($http,ThLog,thUrl,$q){var ThJobModel=function(data){angular.extend(this,data)};return ThJobModel.prototype.get_current_eta=function(){var timestampSeconds=(new Date).getTime()/1e3;return Math.round((timestampSeconds-(parseInt(this.submit_timestamp)+parseInt(this.running_eta)))/60)},ThJobModel.prototype.get_typical_eta=function(){return Math.round(parseInt(this.running_eta)/60)},ThJobModel.get_uri=function(repoName){return thUrl.getProjectUrl("/jobs/",repoName)},ThJobModel.get_list=function(repoName,options,config){config=config||{};var timeout=config.timeout||null,fetch_all=config.fetch_all||!1;return $http.get(ThJobModel.get_uri(repoName),{params:options,timeout:timeout}).then(function(response){var item_list,next_pages_jobs=[];if(fetch_all&&response.data.results.length===response.data.meta.count){var current_offset=parseInt(response.data.meta.offset),page_size=parseInt(response.data.meta.count),new_options=angular.copy(options);new_options.offset=page_size+current_offset,new_options.count=page_size,next_pages_jobs=ThJobModel.get_list(repoName,new_options,config)}return item_list=_.has(response.data,"job_property_names")?_.map(response.data.results,function(elem){var job_obj=_.object(response.data.job_property_names,elem);return new ThJobModel(job_obj)}):_.map(response.data.results,function(job_obj){return new ThJobModel(job_obj)}),$q.when(next_pages_jobs).then(function(maybe_job_list){return item_list.concat(maybe_job_list)})})},ThJobModel.get=function(repoName,pk,config){config=config||{};var timeout=config.timeout||null;return $http.get(ThJobModel.get_uri(repoName)+pk+"/",{timeout:timeout}).then(function(response){return new ThJobModel(response.data)})},ThJobModel.retrigger=function(repoName,pk,config){config=config||{};var timeout=config.timeout||null;return $http.post(ThJobModel.get_uri(repoName)+pk+"/retrigger/",{timeout:timeout}).then(function(response){return new ThJobModel(response.data)})},ThJobModel.cancel=function(repoName,pk,config){config=config||{};var timeout=config.timeout||null;return $http.post(ThJobModel.get_uri(repoName)+pk+"/cancel/",{timeout:timeout}).then(function(response){return new ThJobModel(response.data)})},ThJobModel}]),treeherder.factory("ThResultSetModel",["$rootScope","$http","$location","$q","thUrl","thResultStatusObject","thEvents","thServiceDomain","ThLog","thNotify","ThJobModel","thPlatformOrder","thOptionOrder",function($rootScope,$http,$location,$q,thUrl,thResultStatusObject,thEvents,thServiceDomain,ThLog,thNotify,ThJobModel,thPlatformOrder,thOptionOrder){var $log=new ThLog("ThResultSetModel"),MAX_RESULTSET_FETCH_SIZE=100,convertDates=function(locationParams){return $log.debug("locationParams",locationParams),_.has(locationParams,"startdate")&&(locationParams.push_timestamp__gte=Date.parse(locationParams.startdate)/1e3,delete locationParams.startdate),_.has(locationParams,"enddate")&&(locationParams.push_timestamp__lt=Date.parse(locationParams.enddate)/1e3+84600,delete locationParams.enddate),locationParams},hasLowerRange=function(locationParams){return locationParams.fromchange||locationParams.startdate};return{getResultSetsFromChange:function(repoName,revision,locationParams){return locationParams=convertDates(locationParams),_.extend(locationParams,{fromchange:revision}),$http.get(thUrl.getProjectUrl("/resultset/",repoName),{params:locationParams})},getResultSets:function(repoName,rsOffsetTimestamp,count,resultsetlist,full,keep_filters){rsOffsetTimestamp="undefined"==typeof rsOffsetTimestamp?0:rsOffsetTimestamp,full=_.isUndefined(full)?!0:full,keep_filters=_.isUndefined(keep_filters)?!0:keep_filters;var params={full:full};if(params.count=count?Math.min(count,MAX_RESULTSET_FETCH_SIZE):10,rsOffsetTimestamp&&(params.push_timestamp__lte=rsOffsetTimestamp,params.count++),keep_filters){var locationParams=_.clone($location.search());delete locationParams.repo,rsOffsetTimestamp?(delete locationParams.tochange,delete locationParams.fromchange):hasLowerRange(locationParams)&&(params.count=MAX_RESULTSET_FETCH_SIZE),locationParams=convertDates(locationParams),$log.debug("updated params",params),_.extend(params,locationParams)}return resultsetlist&&_.extend(params,{offset:0,count:resultsetlist.length,id__in:resultsetlist.join()}),$http.get(thUrl.getProjectUrl("/resultset/",repoName),{params:params})},getResultSet:function(repoName,pk){return $http.get(thUrl.getProjectUrl("/resultset/"+pk+"/",repoName))},get:function(uri){return $http.get(thServiceDomain+uri)},getResultSetJobsUpdates:function(resultSetIdList,repoName,exclusionProfile,lastModified){angular.isDate(lastModified)&&(lastModified=lastModified.toISOString().replace("Z",""));var params={result_set_id__in:resultSetIdList.join(","),count:2e3,last_modified__gt:lastModified,return_type:"list"};return exclusionProfile&&(params.exclusion_profile=exclusionProfile),ThJobModel.get_list(repoName,params,{fetch_all:!0})},getResultSetJobs:function(resultSets,repoName,exclusionProfile){var jobsPromiseList=[];return _.each(resultSets.results,function(rs,index){var params={return_type:"list",result_set_id:rs.id,count:2e3};exclusionProfile&&(params.exclusion_profile=exclusionProfile),jobsPromiseList.push(ThJobModel.get_list(repoName,params,{fetch_all:!0}))}),jobsPromiseList},getRevisions:function(projectName,resultSetId){return $http.get(thUrl.getProjectUrl("/resultset/"+resultSetId+"/",projectName),{cache:!0}).then(function(response){return response.data.revisions.length>0?_.map(response.data.revisions,function(r){return r.revision}):$q.reject("No revisions found for result set "+resultSetId+" in project "+projectName)})},getResultSetsFromRevision:function(projectName,revision){return $http.get(thUrl.getProjectUrl("/resultset/?revision="+revision,projectName),{cache:!0}).then(function(response){return response.data.results.length>0?response.data.results:$q.reject("No results found for revision "+revision+" on project "+projectName)})},cancelAll:function(resultset_id,repoName){var uri=resultset_id+"/cancel_all/";return $http.post(thUrl.getProjectUrl("/resultset/",repoName)+uri)}}}]);var perf=angular.module("perf",["ui.router","ui.bootstrap","treeherder"]);perf.factory("PhSeries",["$http","thServiceDomain",function($http,thServiceDomain){var _getSeriesSummary=function(signature,signatureProps,optionCollectionMap){var subtestSignatures,platform=signatureProps.machine_platform,testName=signatureProps.test;void 0===testName&&(testName="summary",subtestSignatures=signatureProps.subtest_signatures);var name=signatureProps.suite+" "+testName,options=[optionCollectionMap[signatureProps.option_collection_hash]];return signatureProps.test_options&&(options=options.concat(signatureProps.test_options)),name=name+" "+options.join(" "),{name:name,signature:signature,platform:platform,options:options,subtestSignatures:subtestSignatures}},_getAllSeries=function(projectName,timeRange,optionMap){var signatureURL=thServiceDomain+"/api/project/"+projectName+"/performance-data/get_performance_series_summary/?interval="+timeRange;return $http.get(signatureURL).then(function(response){var seriesList=[],platformList=[],testList=[];return Object.keys(response.data).forEach(function(signature){var seriesSummary=_getSeriesSummary(signature,response.data[signature],optionMap);seriesList.push(seriesSummary),_.contains(platformList,seriesSummary.platform)||platformList.push(seriesSummary.platform),_.contains(testList,seriesSummary.name)||testList.push(seriesSummary.name)}),{seriesList:seriesList,platformList:platformList,testList:testList}})};return{getSeriesSummary:function(signature,signatureProps,optionCollectionMap){return _getSeriesSummary(signature,signatureProps,optionCollectionMap)},getSubtestSummaries:function(projectName,timeRange,optionMap,targetSignature){return _getAllSeries(projectName,timeRange,optionMap).then(function(lists){var suiteName,seriesList=[],platformList=[],subtestSignatures=[],series=_.find(lists.seriesList,function(series){return series.signature==targetSignature});series&&(series=series.subtestSignatures?[series]:_.filter(lists.seriesList,function(s){return _.find(s.subtestSignatures,function(signature){return signature==targetSignature})}),subtestSignatures=_.union(_.map(series,"subtestSignatures"))[0],suiteName=_.union(_.map(series,"name"))[0]),subtestSignatures.forEach(function(signature){var seriesSubtest=_.find(lists.seriesList,function(series){return series.signature==signature});seriesList.push(seriesSubtest),_.contains(platformList,seriesSubtest.platform)||platformList.push(seriesSubtest.platform)});var testList=[];return suiteName&&(testList=[suiteName]),{seriesList:seriesList,platformList:platformList,testList:testList}})},getAllSeries:function(projectName,timeRange,optionMap){return _getAllSeries(projectName,timeRange,optionMap)},getSeriesSummaries:function(projectName,timeRange,optionMap,userOptions){var seriesList=[],platformList=[],testList=[];return _getAllSeries(projectName,timeRange,optionMap).then(function(lists){return lists.seriesList.forEach(function(seriesSummary){!seriesSummary.subtestSignatures||userOptions.e10s&&!_.contains(seriesSummary.options,"e10s")||!userOptions.e10s&&_.contains(seriesSummary.options,"e10s")||_.contains(seriesSummary.name,"tp5n")||(seriesList.push(seriesSummary),_.contains(platformList,seriesSummary.platform)||platformList.push(seriesSummary.platform),_.contains(testList,seriesSummary.name)||testList.push(seriesSummary.name))}),{seriesList:seriesList,platformList:platformList,testList:testList}})}}}]),perf.factory("isReverseTest",[function(){return function(testName){var reverseTests=["dromaeo_dom","dromaeo_css","v8_7","canvasmark"],found=!1;return reverseTests.forEach(function(rt){testName.indexOf(rt)>=0&&(found=!0)}),found}}]),perf.factory("PhCompare",["$q","$http","thServiceDomain","PhSeries","math","isReverseTest","phTimeRanges",function($q,$http,thServiceDomain,PhSeries,math,isReverseTest,phTimeRanges){function getClassName(newIsBetter,oldVal,newVal,abs_t_value){var ratio=newVal/oldVal;return 1>ratio&&(ratio=1/ratio),RATIO_CARE_MIN>ratio||T_VALUE_CARE_MIN>abs_t_value?"":T_VALUE_CONFIDENT>abs_t_value?newIsBetter?"":"compare-notsure":newIsBetter?"compare-improvement":"compare-regression"}var STDDEV_DEFAULT_FACTOR=.15,RATIO_CARE_MIN=1.015,T_VALUE_CARE_MIN=.5,T_VALUE_CONFIDENT=1;return{getCompareClasses:function(cr,type){return cr.hideMinorChanges&&!cr.isMeaningful?"subtest-empty":cr.isEmpty?"subtest-empty":"row"==type&&cr.highlightedTest?"active subtest-highlighted":"row"==type?"":"bar"==type&&cr.isRegression?"bar-regression":"bar"==type&&cr.isImprovement?"bar-improvement":"bar"==type?"":cr.className},getCounterMap:function(testName,originalData,newData){function removeZeroes(values){return _.filter(values,function(v){return!!v})}function numericCompare(a,b){return b>a?-1:a>b?1:0}function analyzeSet(values){var average=math.average(values),stddev=math.stddev(values,average);return{geomean:average,stddev:stddev,stddevPct:math.percentOf(stddev,average),runs:values.slice().sort(numericCompare)}}var cmap={isEmpty:!0};originalData&&(originalData.values=removeZeroes(originalData.values)),newData&&(newData.values=removeZeroes(newData.values));var hasOrig=originalData&&originalData.values.length,hasNew=newData&&newData.values.length;if(!hasOrig&&!hasNew)return cmap;if(cmap.isEmpty=!1,hasOrig){var orig=analyzeSet(originalData.values);cmap.originalGeoMean=orig.geomean,cmap.originalRuns=orig.runs,cmap.originalStddev=orig.stddev,cmap.originalStddevPct=orig.stddevPct}if(hasNew){var newd=analyzeSet(newData.values);cmap.newGeoMean=newd.geomean,cmap.newRuns=newd.runs,cmap.newStddev=newd.stddev,cmap.newStddevPct=newd.stddevPct}if(!hasOrig||!hasNew)return cmap;cmap.delta=cmap.newGeoMean-cmap.originalGeoMean;var newIsBetter=cmap.delta<0;isReverseTest(testName)&&(newIsBetter=!newIsBetter),cmap.deltaPercentage=math.percentOf(cmap.delta,cmap.originalGeoMean),cmap.barGraphMargin=50-Math.min(50,Math.abs(Math.round(cmap.deltaPercentage)/2)),cmap.marginDirection=newIsBetter?"right":"left";var abs_t_value=Math.abs(math.t_test(originalData.values,newData.values,STDDEV_DEFAULT_FACTOR));return cmap.className=getClassName(newIsBetter,cmap.originalGeoMean,cmap.newGeoMean,abs_t_value),cmap.confidence=abs_t_value,cmap.confidenceText=T_VALUE_CARE_MIN>abs_t_value?"low":T_VALUE_CONFIDENT>abs_t_value?"med":"high",cmap.isRegression="compare-regression"==cmap.className,cmap.isImprovement="compare-improvement"==cmap.className,cmap.isMeaningful=""!=cmap.className,cmap},getInterval:function(oldTimestamp,newTimestamp){var now=(new Date).getTime()/1e3,timeRange=Math.min(oldTimestamp,newTimestamp);timeRange=Math.round(now-timeRange);var timeRange=_.find(phTimeRanges,function(i){return timeRange<=i.value});return timeRange.value},validateInput:function(originalProject,newProject,originalRevision,newRevision,originalSignature,newSignature){var errors=[];return originalProject||errors.push("Missing input: originalProject"),newProject||errors.push("Missing input: newProject"),originalRevision||errors.push("Missing input: originalRevision"),newRevision||errors.push("Missing input: newRevision"),originalSignature&&newSignature&&(originalSignature||errors.push("Missing input: originalSignature"),newSignature||errors.push("Missing input: newSignature")),$http.get(thServiceDomain+"/api/repository/").then(function(response){_.find(response.data,{name:originalProject})||errors.push("Invalid project, doesn't exist: "+originalProject),_.find(response.data,{name:newProject})||errors.push("Invalid project, doesn't exist: "+newProject)}),errors},getResultsMap:function(projectName,seriesList,timeRange,resultSetIds){var baseURL=thServiceDomain+"/api/project/"+projectName+"/performance-data/get_performance_data/?interval_seconds="+timeRange,resultsMap={};return $q.all(_.chunk(seriesList,20).map(function(seriesChunk){var signatures="";return seriesChunk.forEach(function(series){signatures+="&signatures="+series.signature}),$http.get(baseURL+signatures).then(function(response){resultSetIds.forEach(function(resultSetId){void 0===resultsMap[resultSetId]&&(resultsMap[resultSetId]={}),response.data.forEach(function(data){var values=[];_.where(data.blob,{result_set_id:resultSetId}).forEach(function(pdata){void 0===pdata.geomean?values.push(pdata.mean):values.push(pdata.geomean)});var seriesData=_.find(seriesChunk,{signature:data.series_signature});resultsMap[resultSetId][data.series_signature]={platform:seriesData.platform,name:seriesData.name,values:values}})})})})).then(function(){return resultsMap})}}}]),perf.factory("math",[function(){function percentOf(a,b){return b?100*a/b:0}function average(values){return values.length<1?0:_.sum(values)/values.length}function stddev(values,avg){return values.length<2?0:(avg||(avg=average(values)),Math.sqrt(values.map(function(v){return Math.pow(v-avg,2)}).reduce(function(a,b){return a+b})/(values.length-1)))}function t_test(valuesC,valuesT,stddev_default_factor){var lenC=valuesC.length,lenT=valuesT.length;if(1>lenC||1>lenT)return 0;var avgC=average(valuesC),avgT=average(valuesT),stddevC=lenC>1?stddev(valuesC,avgC):stddev_default_factor*avgC,stddevT=lenT>1?stddev(valuesT,avgT):stddev_default_factor*avgT;1==lenC?stddevC=valuesC[0]*stddevT/avgT:1==lenT&&(stddevT=valuesT[0]*stddevC/avgC);var delta=avgT-avgC,stdDiffErr=Math.sqrt(stddevC*stddevC/lenC+stddevT*stddevT/lenT);return delta/stdDiffErr}return{percentOf:percentOf,average:average,stddev:stddev,t_test:t_test}}]),perf.filter("displayPrecision",function(){return function(input){return isNaN(input)?"N/A":parseFloat(input).toFixed(2)}}),perf.controller("CompareChooserCtrl",["$state","$stateParams","$scope","ThRepositoryModel","ThResultSetModel",function($state,$stateParams,$scope,ThRepositoryModel,ThResultSetModel){ThRepositoryModel.get_list().success(function(projects){$scope.projects=projects,$scope.originalProject=$scope.newProject=projects[0],$scope.originalTipList=[],$scope.newTipList=[];var getRevisionTips=function(projectName,list){list.splice(0,list.length),ThResultSetModel.getResultSets(projectName).then(function(response){var resultsets=response.data.results;resultsets.forEach(function(revisionSet){list.push({revision:revisionSet.revision,author:revisionSet.author})})})};$scope.updateOriginalgRevisionTips=function(){getRevisionTips($scope.originalProject.name,$scope.originalTipList)},$scope.updateNewRevisionTips=function(){getRevisionTips($scope.newProject.name,$scope.newTipList)},$scope.updateOriginalgRevisionTips(),$scope.updateNewRevisionTips(),$scope.getOriginalTipRevision=function(tip){$scope.originalRevision=tip},$scope.getNewTipRevision=function(tip){$scope.newRevision=tip},$scope.runCompare=function(){ThResultSetModel.getResultSetsFromRevision($scope.originalProject.name,$scope.originalRevision).then(function(resultSets){$scope.originalRevisionError=void 0},function(error){$scope.originalRevisionError=error}),ThResultSetModel.getResultSetsFromRevision($scope.newProject.name,$scope.newRevision).then(function(resultSets){$scope.newRevisionError=void 0,void 0===$scope.originalRevisionError&&void 0===$scope.newRevisionError&&$state.go("compare",{originalProject:$scope.originalProject.name,originalRevision:$scope.originalRevision,newProject:$scope.newProject.name,newRevision:$scope.newRevision})},function(error){$scope.newRevisionError=error})}})}]),perf.controller("CompareResultsCtrl",["$state","$stateParams","$scope","$rootScope","$location","thServiceDomain","ThOptionCollectionModel","ThRepositoryModel","ThResultSetModel","$http","$q","$timeout","PhSeries","math","isReverseTest","PhCompare",function($state,$stateParams,$scope,$rootScope,$location,thServiceDomain,ThOptionCollectionModel,ThRepositoryModel,ThResultSetModel,$http,$q,$timeout,PhSeries,math,isReverseTest,PhCompare){function displayComparison(){$scope.testList=[],$scope.platformList=[];var timeRange=PhCompare.getInterval($scope.originalTimestamp,$scope.newTimestamp),resultSetIds=[$scope.originalResultSetID];_.isEqual($scope.originalProject,$scope.newProject)&&(resultSetIds=[$scope.originalResultSetID,$scope.newResultSetID]),PhSeries.getSeriesSummaries($scope.originalProject.name,timeRange,optionCollectionMap,{e10s:$scope.e10s}).then(function(originalSeriesData){return $scope.platformList=originalSeriesData.platformList,$scope.testList=originalSeriesData.testList,PhCompare.getResultsMap($scope.originalProject.name,originalSeriesData.seriesList,timeRange,resultSetIds)}).then(function(resultMaps){var originalResultsMap=resultMaps[$scope.originalResultSetID],newResultsMap=resultMaps[$scope.newResultSetID];return newResultsMap?($scope.dataLoading=!1,void displayResults(originalResultsMap,newResultsMap)):void PhSeries.getSeriesSummaries($scope.newProject.name,timeRange,optionCollectionMap,{e10s:$scope.e10s}).then(function(newSeriesData){return $scope.platformList=_.union($scope.platformList,newSeriesData.platformList).sort(),$scope.testList=_.union($scope.testList,newSeriesData.testList).sort(),PhCompare.getResultsMap($scope.newProject.name,newSeriesData.seriesList,timeRange,[$scope.newResultSetID])}).then(function(resultMaps){var newResultsMap=resultMaps[$scope.newResultSetID];$scope.dataLoading=!1,displayResults(originalResultsMap,newResultsMap)})})}function displayResults(rawResultsMap,newRawResultsMap){$scope.compareResults={},$scope.titles={},window.document.title="Comparison between "+$scope.originalRevision+" ("+$scope.originalProject.name+") and "+$scope.newRevision+" ("+$scope.newProject.name+")",$scope.testList.forEach(function(testName){$scope.titles[testName]=testName.replace("summary ",""),$scope.platformList.forEach(function(platform){var oldSig=_.find(Object.keys(rawResultsMap),function(sig){return rawResultsMap[sig].name==testName&&rawResultsMap[sig].platform==platform}),newSig=_.find(Object.keys(newRawResultsMap),function(sig){return newRawResultsMap[sig].name==testName&&newRawResultsMap[sig].platform==platform}),cmap=PhCompare.getCounterMap(testName,rawResultsMap[oldSig],newRawResultsMap[newSig]);if(!cmap.isEmpty){var detailsLink="perf.html#/comparesubtest?";detailsLink+=_.map(_.pairs({originalProject:$scope.originalProject.name,originalRevision:$scope.originalRevision,newProject:$scope.newProject.name,newRevision:$scope.newRevision,originalSignature:oldSig,newSignature:newSig}),function(kv){return kv[0]+"="+kv[1]}).join("&"),cmap.detailsLink=detailsLink,cmap.name=platform,cmap.hideMinorChanges=$scope.hideMinorChanges,Object.keys($scope.compareResults).indexOf(testName)<0&&($scope.compareResults[testName]=[]),$scope.compareResults[testName].push(cmap)}})}),$scope.testNoResults=_.difference($scope.testList,Object.keys($scope.compareResults)).map(function(name){return" "+name.replace(" summary","")}).sort().join(),$scope.testList=Object.keys($scope.compareResults).sort()}function verifyRevision(project,revision,rsid){return ThResultSetModel.getResultSetsFromRevision(project.name,revision).then(function(resultSets){var resultSet=resultSets[0];"original"==rsid?($scope.originalResultSetID=resultSet.id,$scope.originalTimestamp=resultSet.push_timestamp):($scope.newResultSetID=resultSet.id,$scope.newTimestamp=resultSet.push_timestamp)},function(error){$scope.errors.push(error)})}$scope.dataLoading=!0,$scope.getCompareClasses=PhCompare.getCompareClasses;var optionCollectionMap={},loadRepositories=ThRepositoryModel.load(),loadOptions=ThOptionCollectionModel.get_map().then(function(_optionCollectionMap){optionCollectionMap=_optionCollectionMap});$q.all([loadRepositories,loadOptions]).then(function(){return $scope.errors=PhCompare.validateInput($stateParams.originalProject,$stateParams.newProject,$stateParams.originalRevision,$stateParams.originalProject),$scope.errors.length>0?void($scope.dataLoading=!1):($stateParams.e10s=Boolean($stateParams.e10s),$scope.hideMinorChanges=Boolean($stateParams.hideMinorChanges),$scope.originalProject=ThRepositoryModel.getRepo($stateParams.originalProject),$scope.newProject=ThRepositoryModel.getRepo($stateParams.newProject),$scope.newRevision=$stateParams.newRevision,$scope.originalRevision=$stateParams.originalRevision,void verifyRevision($scope.originalProject,$scope.originalRevision,"original").then(function(){verifyRevision($scope.newProject,$scope.newRevision,"new").then(function(){return $scope.errors.length>0?void($scope.dataLoading=!1):void displayComparison()})}))})}]),perf.controller("CompareSubtestResultsCtrl",["$state","$stateParams","$scope","$rootScope","$location","thServiceDomain","ThOptionCollectionModel","ThRepositoryModel","ThResultSetModel","$http","$q","$timeout","PhSeries","math","isReverseTest","PhCompare",function($state,$stateParams,$scope,$rootScope,$location,thServiceDomain,ThOptionCollectionModel,ThRepositoryModel,ThResultSetModel,$http,$q,$timeout,PhSeries,math,isReverseTest,PhCompare){function verifyRevision(project,revision,rsid){return ThResultSetModel.getResultSetsFromRevision(project.name,revision).then(function(resultSets){var resultSet=resultSets[0];"original"==rsid?($scope.originalResultSetID=resultSet.id,$scope.originalTimestamp=resultSet.push_timestamp):($scope.newResultSetID=resultSet.id,$scope.newTimestamp=resultSet.push_timestamp)},function(error){$scope.errors.push(error)})}function displayResults(rawResultsMap,newRawResultsMap,timeRange){$scope.compareResults={},$scope.titles={},$scope.subtestTitle=$scope.platformList[0].split(" ")[0]+" "+$scope.testList[0].split(" ")[0],window.document.title=$scope.subtestTitle+" subtest comparison",$scope.testList.forEach(function(testName){$scope.titles[testName]=testName.replace("summary ",""),$scope.compareResults[testName]=[],$scope.pageList.sort(),$scope.pageList.forEach(function(page){var mapsigs=[];[rawResultsMap,newRawResultsMap].forEach(function(resultsMap){if(resultsMap)var tempsig=_.find(Object.keys(resultsMap),function(sig){return resultsMap[sig].name==page});else{var tempsig="undefined";resultsMap={},resultsMap[tempsig]={}}mapsigs.push(tempsig)});var oldSig=mapsigs[0],newSig=mapsigs[1],cmap=PhCompare.getCounterMap(testName,rawResultsMap[oldSig],newRawResultsMap[newSig]);(oldSig==$scope.originalSignature||oldSig==$scope.newSignature||newSig==$scope.originalSignature||newSig==$scope.newSignature)&&(cmap.highlightedTest=!0);var originalSeries="["+$scope.originalProject.name+","+oldSig+",1]",newSeries="["+$scope.newProject.name+","+newSig+",1]",detailsLink="perf.html#/graphs?timerange="+timeRange+"&series="+newSeries;oldSig!=newSig&&(detailsLink+="&series="+originalSeries),detailsLink+="&highlightedRevisions="+$scope.originalRevision,detailsLink+="&highlightedRevisions="+$scope.newRevision,cmap.detailsLink=detailsLink,cmap.name=page,cmap.hideMinorChanges=$scope.hideMinorChanges,$scope.compareResults[testName].push(cmap)})})}$scope.dataLoading=!0,$scope.getCompareClasses=PhCompare.getCompareClasses;var optionCollectionMap={},loadRepositories=ThRepositoryModel.load(),loadOptions=ThOptionCollectionModel.get_map().then(function(_optionCollectionMap){optionCollectionMap=_optionCollectionMap});$q.all([loadRepositories,loadOptions]).then(function(){return $scope.errors=PhCompare.validateInput($stateParams.originalProject,$stateParams.newProject,$stateParams.originalRevision,$stateParams.newRevision,$stateParams.originalSignature,$stateParams.newSignature),$scope.errors.length>0?void($scope.dataLoading=!1):($scope.hideMinorChanges=Boolean($stateParams.hideMinorChanges),$scope.originalProject=ThRepositoryModel.getRepo($stateParams.originalProject),$scope.newProject=ThRepositoryModel.getRepo($stateParams.newProject),$scope.newRevision=$stateParams.newRevision,$scope.originalRevision=$stateParams.originalRevision,$scope.originalSignature=$stateParams.originalSignature,$scope.newSignature=$stateParams.newSignature,void verifyRevision($scope.originalProject,$scope.originalRevision,"original").then(function(){verifyRevision($scope.newProject,$scope.newRevision,"new").then(function(){if($scope.pageList=[],$scope.errors.length>0)return void($scope.dataLoading=!1);var timeRange=PhCompare.getInterval($scope.originalTimestamp,$scope.newTimestamp),resultSetIds=[$scope.originalResultSetID];$scope.originalProject==$scope.newProject&&(resultSetIds=[$scope.originalResultSetID,$scope.newResultSetID]),PhSeries.getSubtestSummaries($scope.originalProject.name,timeRange,optionCollectionMap,$scope.originalSignature).then(function(originalSeriesData){return $scope.testList=originalSeriesData.testList,$scope.platformList=originalSeriesData.platformList,PhCompare.getResultsMap($scope.originalProject.name,originalSeriesData.seriesList,timeRange,resultSetIds)}).then(function(seriesMaps){var originalSeriesMap=seriesMaps[$scope.originalResultSetID],newSeriesMap=seriesMaps[$scope.newResultSetID];return[originalSeriesMap,newSeriesMap].forEach(function(seriesMap){seriesMap&&Object.keys(seriesMap).forEach(function(series){_.contains($scope.pageList,seriesMap[series].name)||$scope.pageList.push(seriesMap[series].name)})}),newSeriesMap?($scope.dataLoading=!1,void displayResults(originalSeriesMap,newSeriesMap,timeRange)):void PhSeries.getSubtestSummaries($scope.newProject.name,timeRange,optionCollectionMap,$scope.newSignature).then(function(newSeriesData){return $scope.platformList=_.union($scope.platformList,newSeriesData.platformList).sort(),$scope.testList=_.union($scope.testList,newSeriesData.testList).sort(),PhCompare.getResultsMap($scope.newProject,newSeriesData.seriesList,timeRange,[$scope.newResultSetID])}).then(function(newSeriesMaps){var newSeriesMap=newSeriesMaps[$scope.newResultSetID];newSeriesMap?Object.keys(newSeriesMap).forEach(function(series){_.contains($scope.pageList,newSeriesMap[series].name)||$scope.pageList.push(newSeriesMap[series].name)}):newSeriesMap={},$scope.dataLoading=!1,displayResults(originalSeriesMap,newSeriesMap,timeRange)})})})}))})}]),perf.controller("GraphsCtrl",["$state","$stateParams","$scope","$rootScope","$location","$modal","thServiceDomain","$http","$q","$timeout","PhSeries","ThRepositoryModel","ThOptionCollectionModel","ThResultSetModel","phTimeRanges",function($state,$stateParams,$scope,$rootScope,$location,$modal,thServiceDomain,$http,$q,$timeout,PhSeries,ThRepositoryModel,ThOptionCollectionModel,ThResultSetModel,phTimeRanges){
+function getSeriesDataPoint(flotItem){var resultSetId=flotItem.series.resultSetData[flotItem.dataIndex];return{projectName:flotItem.series.thSeries.projectName,signature:flotItem.series.thSeries.signature,resultSetId:resultSetId,flotDataOffset:flotItem.dataIndex-flotItem.series.resultSetData.indexOf(resultSetId)}}function deselectDataPoint(){$timeout(function(){$scope.selectedDataPoint=null})}function showTooltip(dataPoint){$scope.showToolTipTimeout&&window.clearTimeout($scope.showToolTipTimeout),$scope.showToolTipTimeout=window.setTimeout(function(){$scope.ttHideTimer&&(clearTimeout($scope.ttHideTimer),$scope.ttHideTimer=null);var phSeriesIndex=_.findIndex($scope.seriesList,function(s){return s.projectName==dataPoint.projectName&&s.signature==dataPoint.signature}),phSeries=$scope.seriesList[phSeriesIndex],flotData={series:_.find($scope.plot.getData(),function(fs){return fs.thSeries.projectName==dataPoint.projectName&&fs.thSeries.signature==dataPoint.signature}),pointIndex:phSeries.flotSeries.resultSetData.indexOf(dataPoint.resultSetId)+dataPoint.flotDataOffset},prevResultSetId=_.find(phSeries.flotSeries.resultSetData,function(resultSetId){return resultSetId=0?flotSeriesData[prevFlotDataPointIndex][1]:v,dv=v-v0,dvp=v/v0-1;$scope.tooltipContent={project:_.findWhere($scope.projects,{name:phSeries.projectName}),test:phSeries.name,platform:phSeries.platform,machine:phSeries.machine||"mean",value:Math.round(1e3*v)/1e3,deltaValue:dv.toFixed(1),deltaPercentValue:(100*dvp).toFixed(1),date:$.plot.formatDate(new Date(t),"%a %b %d, %H:%M:%S"),retriggers:retriggerNum.retrigger-1},_.each([{resultSetId:dataPoint.resultSetId,scopeKey:"revision"},{resultSetId:prevResultSetId,scopeKey:"prevRevision"}],function(resultRevision){ThResultSetModel.getRevisions(phSeries.projectName,resultRevision.resultSetId).then(function(revisions){$scope.tooltipContent[resultRevision.scopeKey]=revisions[0]},function(error){console.log("Failed to get revision: "+error.reason)})}),$timeout(function(){function getTipPosition(tip,x,y,yoffset){return{left:x-tip.width()/2,top:y-tip.height()-yoffset}}var x=parseInt(flotData.series.xaxis.p2c(t)+$scope.plot.offset().left),y=parseInt(flotData.series.yaxis.p2c(v)+$scope.plot.offset().top),tip=$("#graph-tooltip");tip.stop(!0);var tipPosition=getTipPosition(tip,x,y,10);tip.css({left:tipPosition.left,top:tipPosition.top});var tipPosition=getTipPosition(tip,x,y,10);"hidden"==tip.css("visibility")?(tip.css({opacity:0,visibility:"visible",left:tipPosition.left,top:tipPosition.top+10}),tip.animate({opacity:1,left:tipPosition.left,top:tipPosition.top},250)):tip.css({opacity:1,left:tipPosition.left,top:tipPosition.top})})},250)}function hideTooltip(now){var tip=$("#graph-tooltip");$scope.showToolTipTimeout&&window.clearTimeout($scope.showToolTipTimeout),$scope.ttHideTimer||"visible"!=tip.css("visibility")||($scope.ttHideTimer=setTimeout(function(){$scope.ttHideTimer=null,tip.animate({opacity:0,top:"+=10"},250,"linear",function(){$(this).css({visibility:"hidden"})})},now?0:250))}function highlightDataPoints(){if($scope.plot.unhighlight(),$scope.seriesList.forEach(function(series,i){series.visible&&series.highlightedPoints.length&&_.forEach(series.highlightedPoints,function(highlightedPoint){$scope.plot.highlight(i,highlightedPoint)})}),$scope.selectedDataPoint){var selectedSeriesIndex=_.findIndex($scope.seriesList,function(s){return s.projectName==$scope.selectedDataPoint.projectName&&s.signature==$scope.selectedDataPoint.signature}),selectedSeries=$scope.seriesList[selectedSeriesIndex],flotDataPoint=selectedSeries.flotSeries.resultSetData.indexOf($scope.selectedDataPoint.resultSetId)+$scope.selectedDataPoint.flotDataOffset;$scope.plot.highlight(selectedSeriesIndex,flotDataPoint)}}function plotOverviewGraph(){$scope.seriesList.forEach(function(series){series.flotSeries.points.show=!1,series.flotSeries.lines.show=series.visible}),$scope.overviewPlot=$.plot($("#overview-plot"),$scope.seriesList.map(function(series){return series.flotSeries}),{xaxis:{mode:"time"},selection:{mode:"xy",color:"#97c6e5"},series:{shadowSize:0},lines:{show:!0},points:{show:!1},legend:{show:!1},grid:{color:"#cdd6df",borderWidth:2,backgroundColor:"#fff",hoverable:!0,clickable:!0,autoHighlight:!1}}),$scope.seriesList.forEach(function(series){series.flotSeries.points.show=series.visible,series.flotSeries.lines.show=!1}),$("#overview-plot").bind("plotunselected",function(){$scope.zoom={},$scope.selectedDataPoint=null,hideTooltip(),updateDocument(),plotGraph()}),$("#overview-plot").bind("plotselected",function(event,ranges){deselectDataPoint(),hideTooltip(),$.each($scope.plot.getXAxes(),function(_,axis){var opts=axis.options;opts.min=ranges.xaxis.from,opts.max=ranges.xaxis.to}),$.each($scope.plot.getYAxes(),function(_,axis){var opts=axis.options;opts.min=ranges.yaxis.from,opts.max=ranges.yaxis.to}),$scope.zoom={x:[ranges.xaxis.from,ranges.xaxis.to],y:[ranges.yaxis.from,ranges.yaxis.to]},$scope.plot.setupGrid(),$scope.plot.draw(),updateDocument()})}function zoomGraph(){$scope.zoom.x&&_.find($scope.seriesList,function(series){return series.visible})&&($.each($scope.plot.getXAxes(),function(_,axis){var opts=axis.options;opts.min=$scope.zoom.x[0],opts.max=$scope.zoom.x[1]}),$.each($scope.plot.getYAxes(),function(_,axis){var opts=axis.options;opts.min=$scope.zoom.y[0],opts.max=$scope.zoom.y[1]}),$scope.plot.setupGrid(),$scope.overviewPlot.setSelection({xaxis:{from:$scope.zoom.x[0],to:$scope.zoom.x[1]},yaxis:{from:$scope.zoom.y[0],to:$scope.zoom.y[1]}}),$scope.overviewPlot.draw(),$scope.plot.draw())}function plotGraph(){$scope.seriesList.forEach(function(series){series.flotSeries.points.show=series.visible,series.active=!series.subtestSignatures||"mean"===$scope.myMeasure,series.blockColor=series.active?series.color:"grey"}),$scope.seriesList.forEach(function(series){series.highlightedPoints=[]});var highlightPromises=[];_.each($scope.highlightedRevisions,function(rev){rev&&12==rev.length&&(highlightPromises=_.union(highlightPromises,$scope.seriesList.map(function(series){return series.visible?ThResultSetModel.getResultSetsFromRevision(series.projectName,rev).then(function(resultSets){var resultSetId=resultSets[0].id,j=series.flotSeries.resultSetData.indexOf(resultSetId),seriesToaddHighlight=_.find($scope.seriesList,function(sr){return sr.signature==series.signature});seriesToaddHighlight.highlightedPoints.push(j)}):null})))}),$q.all(highlightPromises).then(function(){function updateSelectedItem(){return $scope.selectedDataPoint?void 0:void hideTooltip()}$scope.plot=$.plot($("#graph"),$scope.seriesList.map(function(series){return series.flotSeries}),{xaxis:{mode:"time"},series:{shadowSize:0},lines:{show:!1},points:{show:!0},legend:{show:!1},grid:{color:"#cdd6df",borderWidth:2,backgroundColor:"#fff",hoverable:!0,clickable:!0,autoHighlight:!1}}),updateSelectedItem(null),highlightDataPoints(),plotOverviewGraph(),zoomGraph(),$("#graph").bind("plothover",function(event,pos,item){if(!$scope.selectedDataPoint)if($("#graph").css({cursor:item?"pointer":"default"}),item&&item.series.thSeries){if(item.seriesIndex!=$scope.prevSeriesIndex||item.dataIndex!=$scope.prevDataIndex){var seriesDataPoint=getSeriesDataPoint(item);showTooltip(seriesDataPoint),$scope.prevSeriesIndex=item.seriesIndex,$scope.prevDataIndex=item.dataIndex}}else hideTooltip(),$scope.prevSeriesIndex=null,$scope.prevDataIndex=null}),$("#graph").bind("plotclick",function(e,pos,item){item?($scope.selectedDataPoint=getSeriesDataPoint(item),showTooltip($scope.selectedDataPoint),updateSelectedItem()):($scope.selectedDataPoint=null,hideTooltip(),$scope.$digest()),highlightDataPoints()})})}function updateDocument(){$state.transitionTo("graphs",{timerange:$scope.myTimerange.value,series:$scope.seriesList.map(function(series){return"["+series.projectName+","+series.signature+","+(series.visible?1:0)+"]"}),highlightedRevisions:_.filter($scope.highlightedRevisions,function(highlight){return highlight&&12==highlight.length}),zoom:function(){if("undefined"!=typeof $scope.zoom.x&&"undefined"!=typeof $scope.zoom.y&&0!=$scope.zoom.x&&0!=$scope.zoom.y){var modifiedZoom=("["+($scope.zoom.x.toString()+","+$scope.zoom.y.toString())+"]").replace(/[\[\{\}\]"]+/g,"");return modifiedZoom}return $scope.zoom=[],$scope.zoom}()},{location:!0,inherit:!0,relative:$state.$current,notify:!1}),$scope.seriesList.length?(window.document.title=$scope.seriesList[0].name+" "+$scope.seriesList[0].platform+" ("+$scope.seriesList[0].projectName+")",$scope.seriesList.length>1&&(window.document.title+=" and others")):window.document.title="Perfherder Graphs"}function getSeriesData(series){return $http.get(thServiceDomain+"/api/project/"+series.projectName+"/performance-data/get_performance_data/?interval_seconds="+$scope.myTimerange.value+"&signatures="+series.signature).then(function(response){var flotSeries={lines:{show:!1},points:{show:series.visible},color:series.color,label:series.projectName+" "+series.name,data:[],resultSetData:[],thSeries:jQuery.extend({},series)};response.data[0].blob.forEach(function(dataPoint){var measure=dataPoint.mean;"min"===$scope.myMeasure?measure=dataPoint.min:"max"===$scope.myMeasure?measure=dataPoint.max:"median"===$scope.myMeasure?measure=dataPoint.median:"mean"===$scope.myMeasure&&(measure=dataPoint.mean,void 0===measure&&(measure=dataPoint.geomean)),flotSeries.data.push([new Date(1e3*dataPoint.push_timestamp),measure]),flotSeries.resultSetData.push(dataPoint.result_set_id)}),flotSeries.data.sort(function(a,b){return a[0]>b[0]}),series.flotSeries=flotSeries})}function addSeriesList(partialSeriesList){var propsHash={};return $q.all(partialSeriesList.map(function(partialSeries){return $http.get(thServiceDomain+"/api/project/"+partialSeries.project+"/performance-data/get_signature_properties/?signatures="+partialSeries.signature).then(function(response){var data=response.data;propsHash[partialSeries.project]||(propsHash[partialSeries.project]={}),propsHash[partialSeries.project][partialSeries.signature]=data[0]})})).then(function(){partialSeriesList.forEach(function(partialSeries){var seriesSummary=PhSeries.getSeriesSummary(partialSeries.signature,propsHash[partialSeries.project][partialSeries.signature],optionCollectionMap);seriesSummary.projectName=partialSeries.project,seriesSummary.visible=partialSeries.visible,seriesSummary.color=availableColors.pop(),seriesSummary.highlighted=partialSeries.highlighted,$scope.seriesList.push(seriesSummary)}),$q.all($scope.seriesList.map(getSeriesData)).then(function(){plotGraph(),$scope.selectedDataPoint&&showTooltip($scope.selectedDataPoint)})})}var availableColors=["red","green","blue","orange","purple"],optionCollectionMap=null;$scope.highlightedRevisions=[void 0,void 0],$scope.timeranges=phTimeRanges,$scope.myTimerange=_.find(phTimeRanges,{value:parseInt($stateParams.timerange)}),$scope.myMeasure="mean",$scope.ttHideTimer=null,$scope.selectedDataPoint=null,$scope.showToolTipTimeout=null,$scope.seriesList=[],Mousetrap.bind("escape",function(){deselectDataPoint()}),$scope.myTimerange||($scope.myTimerange=$scope.timeranges[1]),$scope.timeRangeChanged=function(){$scope.zoom={},deselectDataPoint(),updateDocument(),$q.all($scope.seriesList.map(getSeriesData)).then(function(){plotGraph()})},$scope.myMeasureChanged=function(){$scope.zoom={},deselectDataPoint(),updateDocument(),$q.all($scope.seriesList.map(getSeriesData)).then(function(){plotGraph()})},$scope.repoName=$stateParams.projectId,$scope.removeSeries=function(projectName,signature){var newSeriesList=[];$scope.seriesList.forEach(function(series){series.signature!==signature||series.projectName!==projectName?newSeriesList.push(series):(availableColors.push(series.color),$scope.selectedDataPoint&&$scope.selectedDataPoint.signature===signature&&$scope.selectedDataPoint.projectName===projectName&&($scope.selectedDataPoint=null))}),$scope.seriesList=newSeriesList,0==$scope.seriesList.length&&($scope.resetHighlight(),$scope.zoom={}),updateDocument(),plotGraph(),$scope.selectedDataPoint&&showTooltip($scope.selectedDataPoint)},$scope.showHideSeries=function(signature){updateDocument(),plotGraph()},$scope.resetHighlight=function(i){$scope.highlightedRevisions[i]="",$scope.updateHighlightedRevisions()},$scope.updateHighlightedRevisions=function(){updateDocument(),plotGraph()},ThOptionCollectionModel.get_map().then(function(_optionCollectionMap){if(optionCollectionMap=_optionCollectionMap,$stateParams.zoom){var zoomString=decodeURIComponent($stateParams.zoom).replace(/[\[\{\}\]"]+/g,""),zoomArray=zoomString.split(","),zoomObject={x:zoomArray.slice(0,2),y:zoomArray.slice(2,4)};$scope.zoom=zoomString?zoomObject:[]}else $scope.zoom=[];if($stateParams.series){$scope.seriesList=[],_.isString($stateParams.series)&&($stateParams.series=[$stateParams.series]),$stateParams.highlightedRevisions?"string"==typeof $stateParams.highlightedRevisions?$scope.highlightedRevisions=[$stateParams.highlightedRevisions]:$scope.highlightedRevisions=$stateParams.highlightedRevisions:$scope.highlightedRevisions=["",""];var partialSeriesList=$stateParams.series.map(function(encodedSeries){var partialSeriesString=decodeURIComponent(encodedSeries).replace(/[\[\]"]/g,""),partialSeriesArray=partialSeriesString.split(","),partialSeriesObject={project:partialSeriesArray[0],signature:partialSeriesArray[1],visible:0==partialSeriesArray[2]?!1:!0};return partialSeriesObject});addSeriesList(partialSeriesList)}else $scope.seriesList=[],addSeriesList([]);ThRepositoryModel.get_list().then(function(response){$scope.projects=response.data,$scope.addTestData=function(){var defaultProjectName,defaultPlatform;if($scope.seriesList.length>0){var lastSeries=$scope.seriesList.slice(-1)[0];defaultProjectName=lastSeries.projectName,defaultPlatform=lastSeries.platform}var modalInstance=$modal.open({templateUrl:"partials/perf/testdatachooser.html",controller:"TestChooserCtrl",size:"lg",resolve:{projects:function(){return $scope.projects},optionCollectionMap:function(){return optionCollectionMap},timeRange:function(){return $scope.myTimerange.value},defaultProjectName:function(){return defaultProjectName},defaultPlatform:function(){return defaultPlatform}}});modalInstance.opened.then(function(){window.setTimeout(function(){modalInstance.updateTestInput()},0)}),modalInstance.result.then(function(seriesList){seriesList.forEach(function(series){series.hightlightedPoints=[],series.visible=!0,series.color=availableColors.pop(),$scope.seriesList.push(series)}),$scope.highlightedRevision||($scope.highlightedRevision=""),$scope.zoom||($scope.zoom={}),updateDocument(),$q.all($scope.seriesList.map(getSeriesData)).then(function(){plotGraph()})})}})})}]),perf.controller("TestChooserCtrl",function($scope,$modalInstance,$http,projects,optionCollectionMap,timeRange,thServiceDomain,PhSeries,defaultProjectName,defaultPlatform){$scope.timeRange=timeRange,$scope.projects=projects,defaultProjectName?$scope.selectedProject=_.findWhere(projects,{name:defaultProjectName}):$scope.selectedProject=projects[0],$scope.loadingTestData=!1;var testInputCreated=!1,testArray=[],series=[];$scope.addTestData=function(){$scope.selectedSeriesList=$scope.addedTestList,$scope.selectedSeriesList.forEach(function(selectedSeries,i){series[i]=_.clone(selectedSeries),series[i].projectName=selectedSeries.projectName}),$modalInstance.close(series)},$scope.cancel=function(){$modalInstance.dismiss("cancel")},$scope.selectedTestList=[],$scope.unselectedTestList=[],$scope.addedTestList=[],$scope.unselectTest=function(){$scope.unselectedTestList.forEach(function(test){test=JSON.parse(test);var selected=-1;if($scope.addedTestList.forEach(function(obj,i){obj.name===test.name&&(selected=i)}),-1!==selected)if(test.platform===$scope.selectedPlatform&&test.projectName===$scope.selectedProject.name){var temp=$scope.addedTestList.splice(selected,1)[0].name;$scope.testList.push(temp)}else $scope.addedTestList.splice(selected,1)})},$scope.selectTest=function(){var selected;$scope.selectedTestList.forEach(function(test){if(selected=$scope.testList.indexOf(test),-1!==selected){var series=$scope.testList.splice(selected,1)[0],result=testArray.filter(function(obj){return obj.name==series});selected=_.clone(result[0]),selected.projectName=$scope.selectedProject.name,$scope.addedTestList.push(selected)}})},$scope.updateTestInput=function(){$scope.addTestDataDisabled=!0,$scope.loadingTestData=!0,$scope.platformList=[],PhSeries.getAllSeries($scope.selectedProject.name,$scope.timeRange,optionCollectionMap).then(function(seriesData){$scope.platformList=seriesData.platformList,$scope.platformList.sort(),$scope.selectedPlatform=defaultPlatform||$scope.platformList[0],$scope.updateTestSelector=function(){var filteredSeriesList=seriesData.seriesList.filter(function(series){return series.platform===$scope.selectedPlatform}).sort(function(a,b){return a.name>b.name});testArray=filteredSeriesList,$scope.testList=_.map(filteredSeriesList,function(series){return series.name}),testInputCreated=!0},$scope.updateTestSelector(),$scope.loadingTestData=!1})},$modalInstance.updateTestInput=$scope.updateTestInput}),treeherder.directive("phAverage",function(){return{templateUrl:"partials/perf/average.html",scope:{value:"@",replicates:"="}}}),treeherder.directive("phConfidence",function(){return{templateUrl:"partials/perf/compareconfidence.html",scope:{text:"@",value:"@"}}}),perf.config(function($compileProvider,$stateProvider,$urlRouterProvider){$compileProvider.debugInfoEnabled(!1),$urlRouterProvider.deferIntercept(),$stateProvider.state("graphs",{templateUrl:"partials/perf/graphsctrl.html",url:"/graphs?timerange&series&highlightedRevisions&zoom",controller:"GraphsCtrl"}).state("compare",{templateUrl:"partials/perf/comparectrl.html",url:"/compare?originalProject&originalRevision&newProject&newRevision&hideMinorChanges&e10s",controller:"CompareResultsCtrl"}).state("comparesubtest",{templateUrl:"partials/perf/comparesubtestctrl.html",url:"/comparesubtest?originalProject&originalRevision&newProject&newRevision&originalSignature&newSignature&hideMinorChanges",controller:"CompareSubtestResultsCtrl"}).state("comparechooser",{templateUrl:"partials/perf/comparechooserctrl.html",url:"/comparechooser",controller:"CompareChooserCtrl"}),$urlRouterProvider.otherwise("/graphs")}).run(function($rootScope,$urlRouter,$location,$state){$rootScope.$state=$state,$rootScope.$on("$locationChangeSuccess",function(e,newUrl,oldUrl){e.preventDefault(),("graphs"!==$state.current.name||-1===newUrl.indexOf("graphs"))&&$urlRouter.sync()}),$urlRouter.listen()});angular.module('perf').run(['$templateCache', function($templateCache) {
'use strict';
$templateCache.put('partials/perf/average.html',
@@ -41,12 +41,12 @@ $scope.testList=_.union($scope.testList,newSeriesData.testList).sort(),PhCompare
$templateCache.put('partials/perf/comparectrl.html',
- "Loading all results, please wait a minute...
Perfherder Compare Revisions tests with no results: {{testNoResults}}
{{compareResult.name}} (subtests ) +/-{{compareResult.originalStddev|displayPrecision}} ({{compareResult.originalStddevPct|displayPrecision}}%) N/A +/-{{compareResult.newStddev|displayPrecision}} ({{compareResult.newStddevPct|displayPrecision}}%) N/A {{compareResult.delta|displayPrecision}} {{compareResult.deltaPercentage|displayPrecision}}%
"
+ "Loading all results, please wait a minute...
Perfherder Compare RevisionsCompare all data for revision {{originalRevision}} ({{originalProject.name}}) to {{newRevision}} ({{newProject.name}}) tests with no results: {{testNoResults}}
{{compareResult.name}} (subtests ) +/-{{compareResult.originalStddev|displayPrecision}} ({{compareResult.originalStddevPct|displayPrecision}}%) N/A +/-{{compareResult.newStddev|displayPrecision}} ({{compareResult.newStddevPct|displayPrecision}}%) N/A {{compareResult.delta|displayPrecision}} {{compareResult.deltaPercentage|displayPrecision}}%
"
);
$templateCache.put('partials/perf/comparesubtestctrl.html',
- "Loading all results, please wait a minute...
{{subtestTitle}} subtest summary Show all tests and platforms
{{compareResult.name}} (graph ) +/-{{compareResult.originalStddev|displayPrecision}} ({{compareResult.originalStddevPct|displayPrecision}}%) N/A +/-{{compareResult.newStddev|displayPrecision}} ({{compareResult.newStddevPct|displayPrecision}}%) N/A {{compareResult.delta|displayPrecision}} {{compareResult.deltaPercentage|displayPrecision}}%
"
+ "Loading all results, please wait a minute...
{{subtestTitle}} subtest summary{{originalRevision}} ({{originalProject.name}}) compared to {{newRevision}} ({{newProject.name}}) Show all tests and platforms
{{compareResult.name}} (graph ) +/-{{compareResult.originalStddev|displayPrecision}} ({{compareResult.originalStddevPct|displayPrecision}}%) N/A +/-{{compareResult.newStddev|displayPrecision}} ({{compareResult.newStddevPct|displayPrecision}}%) N/A {{compareResult.delta|displayPrecision}} {{compareResult.deltaPercentage|displayPrecision}}%
"
);
diff --git a/dist/logviewer.html b/dist/logviewer.html
index fc634883a..0740f4469 100644
--- a/dist/logviewer.html
+++ b/dist/logviewer.html
@@ -38,7 +38,7 @@
lv-log-lines="displayedLogLines">
-
+
diff --git a/dist/perf.html b/dist/perf.html
index 3e1c90839..330ab2d1a 100644
--- a/dist/perf.html
+++ b/dist/perf.html
@@ -3,7 +3,7 @@
Perfherder
-
+
@@ -36,7 +36,7 @@
-
+