-
Notifications
You must be signed in to change notification settings - Fork 3
/
index.html
1 lines (1 loc) · 71.9 KB
/
index.html
1
<!DOCTYPE html><html dir=ltr lang=en ng-app=SongPane><head><meta charset=UTF-8><style>@font-face{font-family:"icons";src:url(data:font/woff;base64,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) format("woff");font-weight:normal;font-style:normal}.x:before,.drop:before,.toggle:after,.select:after,[class*="icon-"]:before{display:inline-block;font-family:"icons";font-size:20px;font-weight:normal;font-style:normal;text-decoration:inherit}.icon-add:before{content:"\f100"}.icon-alert:before{content:"\f101"}.icon-back:before{content:"\f102"}.icon-bin:before{content:"\f103"}.icon-book:before{content:"\f104"}.icon-cancel:before,.x:before,.toggle:after{content:"\f105"}.icon-check:before,.on.toggle:after{content:"\f106"}.icon-clear:before{content:"\f107"}.icon-cog:before{content:"\f108"}.icon-combo:before,.select:after{content:"\f109"}.icon-copy:before{content:"\f10a"}.icon-down:before,.drop:before{content:"\f10b"}.icon-forward:before{content:"\f10c"}.icon-help:before{content:"\f10d"}.icon-info:before{content:"\f10e"}.icon-left:before{content:"\f10f"}.icon-max:before{content:"\f110"}.icon-menu:before{content:"\f111"}.icon-min:before{content:"\f112"}.icon-minus:before{content:"\f113"}.icon-more:before{content:"\f114"}.icon-pencil:before{content:"\f115"}.icon-plus:before{content:"\f116"}.icon-right:before{content:"\f117"}.icon-search:before{content:"\f118"}.icon-sets:before{content:"\f119"}.icon-share:before{content:"\f11a"}.icon-songpane:before{content:"\f11b"}.icon-up:before,.drop.active:before{content:"\f11c"}*{font-family:inherit;font-size:100%;font-style:inherit;font-weight:inherit;text-decoration:none;color:inherit;line-height:inherit;border:0;margin:0;outline:0;padding:0;vertical-align:baseline;cursor:inherit;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}*,*:before,*:after{-moz-box-sizing:border-box;box-sizing:border-box}:focus,:active,:hover{outline:0}::-moz-selection{background:#2ea2ef;color:#fff;text-shadow:none}::selection{background:#2ea2ef;color:#fff;text-shadow:none}input,textarea,button{-webkit-appearance:none;-moz-appearance:none}html{height:100%;font-size:62.5%;overflow:hidden;cursor:default;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:-moz-none;-ms-user-select:none;-o-user-select:none;user-select:none}textarea,input[type=text]{-moz-user-select:text}code,pre,.pre,.editor-inner>div,.editor-inner>span,.editor-inner>textarea{font-family:Monaco,"Lucida Console","Ubuntu Mono",Consolas,monospace;white-space:pre}b,strong{font-weight:bold}.trim,.btn,.toggle:before{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}#ui,#song-view,section,.t3d,.t3d>*,figure{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden}#ui.run,.view-container,#song-view.ic,section,.t3d,.t3d>*,figure.on{-ms-transform:translate(0, 0);-o-transform:translate(0, 0);-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.transition,#ui.run,.view-container,#song-view,.sorting>li:not(.dragged),section,figure,.notification{-webkit-transition:all 0.3s;-moz-transition:all 0.3s;-o-transition:all 0.3s;transition:all 0.3s}.slow .transition,.slow #ui.run,.slow .view-container,.slow #song-view,.slow .sorting>li:not(.dragged),.slow section,.slow figure,.slow .notification{-webkit-transition:all 3s;-moz-transition:all 3s;-o-transition:all 3s;transition:all 3s}.center,figure,.fill,.t3d,.t3d>*,select{position:absolute;top:0;bottom:0;left:0;right:0;width:100%}.center,figure{text-align:center}.center:before,figure:before{content:"";display:inline-block;height:100%;vertical-align:middle}.center>*,figure>*{vertical-align:middle;text-align:left;display:inline-block}.h .c,.hide,.ios .editor-inner>span{display:none !important}.flex:only-child{width:100%}.flex:first-child:nth-last-child(2),.flex:first-child:nth-last-child(2) ~ .flex{width:50%}.flex:first-child:nth-last-child(3),.flex:first-child:nth-last-child(3) ~ .flex{width:33.33333%}.flex:first-child:nth-last-child(4),.flex:first-child:nth-last-child(4) ~ .flex{width:25%}body.icon-songpane:before,#ui>div:before{position:absolute;top:50%;left:50%;width:8rem;height:8rem;margin:-4rem 0 0 -4rem;font-size:8rem;line-height:1;text-align:center}p{line-height:1.4}ol,ul,menu{list-style:none}blockquote:before,blockquote:after,q:before,q:after{content:""}blockquote,q{quotes:"" ""}select.ng-invalid{color:#636768}body{color:#3e4041;font-size:1.4rem;line-height:2.8rem;font-family:"Helvetica Neue",Ubuntu,"Segoe UI",Verdana,sans-serif;background-color:#303335;height:100%;overflow:hidden;position:relative;-webkit-perspective:800px;-moz-perspective:800px;perspective:800px}body.icon-songpane:before{color:#2ea2ef;text-shadow:0 1px #2b2e30}h1,h2,.l{font-size:1.8rem}h2{text-align:center;margin:0 6rem}h3,h5,.m{font-size:1.6rem}h1,h4,u{padding:0.7rem}h5,h6{font-weight:bold}i{display:block;text-align:center}#menu i{padding-top:0.7rem}.set i{color:rgba(0,0,0,0.5);text-shadow:0 1px #fff}[sp-tap]:not(body),a,select{cursor:pointer}kbd{display:inline-block;border-radius:0.4rem;box-shadow:0 1px #c5ccd0;color:#fff;text-align:center;min-width:2.8rem;background:#303335;text-shadow:0 -1px #303335;background-color:#303335;background-image:-webkit-linear-gradient(top, #45484a,#303335);background-image:-moz-linear-gradient(top, #45484a,#303335);background-image:-ms-linear-gradient(top, #45484a,#303335);background-image:-o-linear-gradient(top, #45484a,#303335);background-image:linear-gradient(to bottom, #45484a,#303335)}fieldset .group *:first-child select+.select{border-left-width:0}fieldset .group *:last-child select+.select{border-right-width:0}.block,#modal-add .select{display:block;width:100%}.b{width:20%;height:100%;line-height:4.2rem;position:relative;float:right}.b:first-child{float:left}.b:active,.b.on{background:rgba(255,255,255,0.1)}.b:before,.b:after{content:"";position:absolute;top:0;left:0;width:1px;height:100%}.b:after{left:1px}.b:first-child:before{left:auto;right:1px}.b:first-child:after{left:auto;right:0}.b:before{background-color:#2ea2ef;background-image:-webkit-linear-gradient(top, #64bcf7,#2a8bcb,#2ea2ef);background-image:-moz-linear-gradient(top, #64bcf7,#2a8bcb,#2ea2ef);background-image:-ms-linear-gradient(top, #64bcf7,#2a8bcb,#2ea2ef);background-image:-o-linear-gradient(top, #64bcf7,#2a8bcb,#2ea2ef);background-image:linear-gradient(to bottom, #64bcf7,#2a8bcb,#2ea2ef)}.b:after{background-color:#2ea2ef;background-image:-webkit-linear-gradient(top, #64bcf7,#8bcdf9,#2ea2ef);background-image:-moz-linear-gradient(top, #64bcf7,#8bcdf9,#2ea2ef);background-image:-ms-linear-gradient(top, #64bcf7,#8bcdf9,#2ea2ef);background-image:-o-linear-gradient(top, #64bcf7,#8bcdf9,#2ea2ef);background-image:linear-gradient(to bottom, #64bcf7,#8bcdf9,#2ea2ef)}#modal-new{width:640px}#ui{height:100%;opacity:0;overflow:hidden}#ui,#ui.on{-ms-transform:translate(0, 0) scale(0.9);-o-transform:translate(0, 0) scale(0.9);-webkit-transform:translate3d(0, 0, -80px);-moz-transform:translate3d(0, 0, -80px);transform:translate3d(0, 0, -80px)}#ui.run{opacity:1}#ui>div{height:100%;background:#45484a}#ui>div:before{margin-left:120px;color:rgba(0,0,0,0.2);text-shadow:0 1px 0.1px rgba(255,255,255,0.05)}#menu{position:absolute;top:0;left:0;height:100%;overflow:auto;width:6.4rem}#menu ul{position:relative;padding-bottom:6.4rem;min-height:100%}#menu ul li{text-align:center;color:#eff1f2;text-shadow:0 1px #212223;box-shadow:inset 0 -1px 0 #38393A, 0 1px #58595A}#menu ul li.open{color:#fff;background:#5e6264;box-shadow:inset 0 -1px 0 #38393a,0 1px #58595a,inset 0 1px 0 #515557}#menu ul li:last-child{position:absolute;bottom:0;width:6.4rem;box-shadow:inset 0 1px 0 #58595A, 0 -1px #38393A}#nav.open{-ms-transform:translate(64px, 0);-o-transform:translate(64px, 0);-webkit-transform:translate3d(64px, 0, 0);-moz-transform:translate3d(64px, 0, 0);transform:translate3d(64px, 0, 0)}.view-container{box-shadow:0 -2px 1px -1px rgba(0,0,0,0.2);position:relative;top:-4.4rem}.view-container.open{-ms-transform:translate(0, 4.4rem);-o-transform:translate(0, 4.4rem);-webkit-transform:translate3d(0, 4.4rem, 0);-moz-transform:translate3d(0, 4.4rem, 0);transform:translate3d(0, 4.4rem, 0)}#song-view{-ms-transform:translate(101%, 0);-o-transform:translate(101%, 0);-webkit-transform:translate3d(101%, 0, 0);-moz-transform:translate3d(101%, 0, 0);transform:translate3d(101%, 0, 0);position:relative;z-index:3;height:100%}#song-view.fs{margin:0 -27.6rem 0 0}#song-view.cr{-ms-transform:translate(-27.6rem, 0);-o-transform:translate(-27.6rem, 0);-webkit-transform:translate3d(-27.6rem, 0, 0);-moz-transform:translate3d(-27.6rem, 0, 0);transform:translate3d(-27.6rem, 0, 0)}#song-view aside{position:absolute;top:0;bottom:0;background:#45484a;width:27.6rem;right:-27.6rem;overflow:auto}#sheet{position:relative;background:#fff}#sheet article{background:none}.song-wrap{line-height:1;display:inline-block;min-width:100%}.part{color:#2ea2ef}.chord{color:#ff5e29}.text{color:#3e4041}.part-c{background:#fff6db}[class*="part-"]{padding:0.8em 1.1rem;border-bottom:1px solid #e1e5e7;white-space:pre-wrap;line-height:2.4}.h [class*="part-"]{white-space:pre-line;line-height:1.4}.c{position:relative;white-space:nowrap}.c span{color:#ff5e29;position:absolute;margin-top:-1em;font-size:.9em}#back-button,#fullscreen-button{top:0;left:0}#fullscreen-button{display:none}#aside-button{top:0;right:0}#info{margin:1.4rem;border-radius:0.4rem;box-shadow:0 1px 3px rgba(0,0,0,0.4);position:relative;overflow:visible}#info h1{border-radius:0.4rem 0.4rem 0 0;background:#e1e5e7;border-bottom:1px solid #a9b3b9;text-shadow:0 1px #fff;padding:1.4rem;position:relative}#info h1:before{content:"";position:absolute;width:0;height:0;border:0.7rem solid transparent;border-right-color:#e1e5e7;left:-1.4rem;top:50%;margin-top:-0.7rem}q{color:#636768;display:inline-block;width:50%}.songs li h3{padding-left:1.4rem}.songs li:before,.songs li:after{content:"";display:block;position:absolute;top:24px;left:5px;width:5px;height:4px;border-top:1px solid rgba(0,0,0,0.3)}.songs li:before{top:18px;border-bottom:1px solid rgba(0,0,0,0.3)}.drop:before{float:right;color:#636768}.img{position:relative}.img:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;border-radius:0.2rem;box-shadow:inset 0 0 0 1px rgba(0,0,0,0.3),0 1px 0 rgba(255,255,255,0.6)}.img img{display:block;border-radius:0.2rem;position:relative}#login{background:none}#login article{padding:2.8rem;background:none;box-shadow:none}#login form{background:#2ea2ef;padding:2.8rem;border-radius:0.4rem;box-shadow:inset 0 1px #64bcf7,0 1px 4px rgba(0,0,0,0.4)}#login form p{color:#185177;text-shadow:0 1px #64bcf7}#login p{color:#d0d3d5;text-shadow:0 1px #303335;margin-top:1.4rem}#login .input,#login .toggle:after{box-shadow:0 1px #eff1f2 inset,0 1px #64bcf7;margin-top:1.4rem;border-color:#216ea1 #257cb6 #2a8bcb}#login .img{margin:0 auto;width:80px;height:80px;background:#1798ee;border-radius:2px}#login .img:before{position:absolute;top:50%;left:50%;width:6rem;height:6rem;margin:-3rem 0 0 -3rem;font-size:6rem;line-height:1;text-align:center;color:#fff;text-shadow:0 1px 1px #216ea1}#login .img:after{box-shadow:inset 0 1px 1px rgba(0,0,0,0.2),inset 0 0 0 1px rgba(0,0,0,0.2),0 1px #64bcf7}[sp-sortable] li.dragged{position:absolute;width:32rem;left:0;z-index:2;border-radius:0;box-shadow:0 1.5rem 0.5rem -1rem rgba(0,0,0,0.2)}li.room{margin:4.4rem 0 0 0}li.room:last-child{margin:0 0 4.4rem 0}.show{display:block !important}.invi{position:absolute;font-size:0}.space{margin:1.1rem 1.1rem 0}.w{width:32rem}.fr{float:right;margin-left:0.7rem}.fl{float:left;margin-right:0.7rem}.tl{-ms-transform:translate(-100%, 0);-o-transform:translate(-100%, 0);-webkit-transform:translate3d(-100%, 0, 0);-moz-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0)}.tr{-ms-transform:translate(100%, 0);-o-transform:translate(100%, 0);-webkit-transform:translate3d(100%, 0, 0);-moz-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0)}@media (min-width: 480px){[class*="part-"]{padding:0.8em 4.4rem}}@media (min-width: 800px){#song-view{margin-left:32rem}#back-button{display:none}#fullscreen-button{display:block}}@media (min-width: 1280px){#sheet{margin-right:27.6rem}#song-view aside{right:0}#aside-button{display:none}#song-view.cr{-webkit-transform:none;-moz-transform:none;-ms-transform:none;-o-transform:none;transform:none}}@media print{@page{margin:1cm}*,:before,:after{position:static !important;visibility:hidden !important;-webkit-transform:none !important;-moz-transform:none !important;-ms-transform:none !important;-o-transform:none !important;transform:none !important}.song-wrap,.song-wrap *{visibility:visible !important;background:transparent !important;color:#000 !important;border-color:#AAA !important;box-shadow:none !important;text-shadow:none !important}.song-wrap{position:absolute !important;top:0;left:0;min-height:100%;overflow:auto}.song-wrap p{page-break-inside:avoid}.part-c{padding-left:4rem}.c{position:relative !important;color:#AAA !important}}section{overflow:hidden;background:#eff1f2;box-shadow:0 0 3px rgba(0,0,0,0.6);height:100%}section>header+.t3d{top:4.4rem}.t3d{overflow:visible}article{background:#eff1f2;overflow:auto;-webkit-overflow-scrolling:touch}.placeholder{padding:4.4rem;text-align:center;color:#636768}.placeholder>[class*="icon-"]{line-height:1;font-size:8rem;color:rgba(0,0,0,0.2);text-shadow:0 1px #fff}.placeholder>[class*="icon-"]:before{font-size:8rem}::-webkit-input-placeholder{color:#636768}:-moz-placeholder{opacity:1;color:#636768 !important}::-moz-placeholder{opacity:1;color:#636768 !important}:-ms-input-placeholder{color:#636768}[placeholder]:not(input):not(textarea):empty:before{content:attr(placeholder);color:#636768}.input,.toggle:after,.btn,.toggle:before,.toggle{display:inline-block;border-radius:0.2rem;height:3rem;line-height:2.8rem;min-width:3rem;max-width:100%;padding:0 0.6rem;border:1px solid}.input,.toggle:after{cursor:text;border-color:#afb4b7 #babec1 #c5c9cb;box-shadow:0 1px #eff1f2 inset,0 1px 0 rgba(255,255,255,0.6);background:#fdfdfd}.input:focus,.toggle:focus:after,.on.toggle:after,select:focus+.select.input,.input:active,.toggle:active:after,select:active+.select.input{background:#fff;box-shadow:inset 0 0 0 1px #d3ecfd,0 1px 0 rgba(255,255,255,0.6);border-color:#2ea2ef}.search{border-radius:4.4rem;padding:0 3rem}.input-wrap{position:relative}.input-wrap .btn{position:absolute;top:0;line-height:3rem}.input-wrap .btn:first-child{left:0}.input-wrap .btn:last-child{right:0;color:#b4b6b7}fieldset{width:100%}fieldset .input,fieldset .toggle:after{border-radius:0;box-shadow:none;height:4.4rem;padding-top:0.7rem;padding-bottom:0.7rem}fieldset .group>.input:first-child,fieldset .group>.toggle:first-child:after{border-radius:0;border-left-width:0}fieldset .group>.input:last-child,fieldset .group>.toggle:last-child:after{border-radius:0;border-right-width:0}fieldset>.input,fieldset>.toggle:after{border-left-width:0;border-right-width:0}fieldset>.input:first-child,fieldset>.toggle:first-child:after{border-top-width:0;border-radius:0}fieldset>.input:last-child,fieldset>.toggle:last-child:after{border-bottom-width:0;border-radius:0}input[type="reset"]::-moz-focus-inner,input[type="button"]::-moz-focus-inner,input[type="submit"]::-moz-focus-inner,button::-moz-focus-inner{border:0;padding:0}[disabled],.disabled{opacity:.6;cursor:default !important}.btn,.toggle:before{cursor:pointer;text-align:center;vertical-align:middle;overflow:-moz-hidden-unscrollable}.btn,.toggle:before{border-color:#afb4b7 #a4a9ad #989fa3;box-shadow:0 1px 0 #f2f4f5 inset,0 1px 0 rgba(255,255,255,0.6);color:#505b63;text-shadow:0 0.1rem #fff;background-color:#d0d3d5;background-image:-webkit-linear-gradient(top, #e9edef,#d0d3d5);background-image:-moz-linear-gradient(top, #e9edef,#d0d3d5);background-image:-ms-linear-gradient(top, #e9edef,#d0d3d5);background-image:-o-linear-gradient(top, #e9edef,#d0d3d5);background-image:linear-gradient(to bottom, #e9edef,#d0d3d5)}.btn:active,select:active+.select.btn,.active.btn,.on.btn{border-color:#828a8f #8d9599 #989fa3;box-shadow:0 1px 0 #cbced0 inset,0 1px 0 rgba(255,255,255,0.6);color:#4f5559;text-shadow:0 0.1rem #f8f9f9;background-color:#c5c6c6;background-image:-webkit-linear-gradient(top, #dce0e3,#c5c6c6);background-image:-moz-linear-gradient(top, #dce0e3,#c5c6c6);background-image:-ms-linear-gradient(top, #dce0e3,#c5c6c6);background-image:-o-linear-gradient(top, #dce0e3,#c5c6c6);background-image:linear-gradient(to bottom, #dce0e3,#c5c6c6)}.btn:focus,select:focus+.select.btn{box-shadow:0 0 0.2rem #fff inset,0 1px 0 rgba(255,255,255,0.6)}.action{border-color:#118ee2 #1086d4 #0f7ec7;box-shadow:0 1px 0 #64bffc inset,0 1px 0 rgba(255,255,255,0.6);color:#064a77;text-shadow:0 0.1rem #8acdf9;background-color:#2ea2ef;background-image:-webkit-linear-gradient(top, #55b9fc,#2ea2ef);background-image:-moz-linear-gradient(top, #55b9fc,#2ea2ef);background-image:-ms-linear-gradient(top, #55b9fc,#2ea2ef);background-image:-o-linear-gradient(top, #55b9fc,#2ea2ef);background-image:linear-gradient(to bottom, #55b9fc,#2ea2ef)}.action:active,.active.action,.on.action{border-color:#0d6dad #0e75ba #0f7ec7;box-shadow:0 1px 0 #259eef inset,0 1px 0 rgba(255,255,255,0.6);color:#08436a;text-shadow:0 0.1rem #75c2f5;background-color:#1d96e7;background-image:-webkit-linear-gradient(top, #41aef6,#1d96e7);background-image:-moz-linear-gradient(top, #41aef6,#1d96e7);background-image:-ms-linear-gradient(top, #41aef6,#1d96e7);background-image:-o-linear-gradient(top, #41aef6,#1d96e7);background-image:linear-gradient(to bottom, #41aef6,#1d96e7)}.danger{border-color:#d14e22 #c44920 #b8451e;box-shadow:0 1px 0 #f1906f inset,0 1px 0 rgba(255,255,255,0.6);color:#6e260e;text-shadow:0 0.1rem #f1aa93;background-color:#e0663e;background-image:-webkit-linear-gradient(top, #ef8561,#e0663e);background-image:-moz-linear-gradient(top, #ef8561,#e0663e);background-image:-ms-linear-gradient(top, #ef8561,#e0663e);background-image:-o-linear-gradient(top, #ef8561,#e0663e);background-image:linear-gradient(to bottom, #ef8561,#e0663e)}.danger:active,.active.danger,.on.danger{border-color:#a03b1a #ac401c #b8451e;box-shadow:0 1px 0 #de5f35 inset,0 1px 0 rgba(255,255,255,0.6);color:#622510;text-shadow:0 0.1rem #ea9a80;background-color:#d6582e;background-image:-webkit-linear-gradient(top, #e8754f,#d6582e);background-image:-moz-linear-gradient(top, #e8754f,#d6582e);background-image:-ms-linear-gradient(top, #e8754f,#d6582e);background-image:-o-linear-gradient(top, #e8754f,#d6582e);background-image:linear-gradient(to bottom, #e8754f,#d6582e)}.toggle{padding:0;border:0}.toggle:before,.toggle:after{vertical-align:middle;text-align:center}.toggle:before{float:left;content:"";border-radius:0.2rem 0 0 0.2rem}.toggle:after{float:right;border-radius:0 0.2rem 0.2rem 0;border-left-width:0}.on.toggle:before{float:right;border-radius:0 0.2rem 0.2rem 0}.on.toggle:after{float:left;border-radius:0.2rem 0 0 0.2rem;border-right:0;border-left-width:1px}.simple,.x{background:none;box-shadow:none;border:0;color:#636768}.simple:active,.x:active{background:none;box-shadow:none;color:#3e4041}.overlaybutton{position:absolute;padding:0.7rem;background:none}.overlaybutton-inner{display:inline-block;height:3rem;min-width:3rem;line-height:3rem;padding:0 .5rem;background:rgba(0,0,0,0.25);border-radius:0.4rem;color:#fff;text-shadow:0 1px 1px rgba(48,51,53,0.2),0 0 1px rgba(48,51,53,0.6)}.select-wrap{position:relative;display:inline-block}.select{text-align:left}.select:after{float:right;margin-left:0.6rem}.ff .select{white-space:normal}select{z-index:2;opacity:0;height:100%}select:focus+.select,select:active+.select{position:relative;z-index:1}.group>*{position:relative;margin-left:-1px;border-radius:0;vertical-align:middle}.group{text-align:center}.group>*:first-child{margin-left:0;border-top-left-radius:0.2rem;border-bottom-left-radius:0.2rem}.group>*:last-child{border-top-right-radius:0.2rem;border-bottom-right-radius:0.2rem}.group>*:active,.group>*.active,.group>*:focus{z-index:1}fieldset>*,.nav li,menu li{display:block;position:relative;width:100%;margin-top:-1px;border-radius:0}fieldset>*:first-child{margin-top:0;border-top-left-radius:0.2rem;border-top-right-radius:0.2rem}fieldset>*:last-child{border-bottom-left-radius:0.2rem;border-bottom-right-radius:0.2rem}fieldset>*:active,fieldset>*.active,fieldset>*:focus{z-index:1}.toolbar{background:#CCC;box-shadow:inset 0 21px 20px -20px rgba(0,0,0,0.4);font-size:0}.toolbar .btn{height:4.4rem;line-height:4.4rem;background:none;border-width:0;box-shadow:none}.toolbar .btn:active,.toolbar select:active+.select.btn,.toolbar .active.btn{background:none;box-shadow:none;color:#fff;text-shadow:0 1px rgba(0,0,0,0.3),0 0 8px #fff}.editor{width:100%;background:#fdfdfd;overflow-x:auto}.editor-inner{display:inline-block;position:relative;min-height:13.2rem;min-width:100%;color:#d0d3d5;line-height:1.2}.editor-inner>div{display:inline-block;padding:0.8rem 2.8rem 2.8rem 0.6rem}.editor-inner>span{padding:0.8rem 0.6rem;position:absolute;top:0;left:0;color:transparent}.editor-inner>span:before{content:attr(pad)}.editor-inner>span:after{content:"";display:inline-block;border-left:2px solid #636768;height:1.61rem;vertical-align:middle}.editor-inner>textarea{resize:none;line-height:1.2;position:absolute;top:0;left:0;border-left-width:0;border-right-width:0;background:none;width:100%;height:100%;color:transparent}.editor-inner>textarea:focus,.editor-inner>textarea:active{background:none;z-index:1}.ios .editor-inner>textarea{left:-3px}header{position:relative;z-index:1;height:4.4rem}section>header{color:#fff;border-top:1px solid #8bcdf9;border-bottom:1px solid #2a8bcb;text-shadow:0 1px #2a8bcb;box-shadow:0 1px 2px rgba(0,0,0,0.2);background-color:#2ea2ef;background-image:-webkit-linear-gradient(top, #64bcf7,#2ea2ef);background-image:-moz-linear-gradient(top, #64bcf7,#2ea2ef);background-image:-ms-linear-gradient(top, #64bcf7,#2ea2ef);background-image:-o-linear-gradient(top, #64bcf7,#2ea2ef);background-image:linear-gradient(to bottom, #64bcf7,#2ea2ef)}header .btn{float:right}header .btn:first-child{float:left}header h1{text-align:center}article header,.nav li{padding:0.7rem;text-shadow:0 1px #FFF;box-shadow:inset 0 1px 0 #FFF;border:1px solid #ABABAB;border-width:0 0 1px 0;background-color:#e4e4e4;background-image:-webkit-linear-gradient(top, #f6f6f6,#e4e4e4);background-image:-moz-linear-gradient(top, #f6f6f6,#e4e4e4);background-image:-ms-linear-gradient(top, #f6f6f6,#e4e4e4);background-image:-o-linear-gradient(top, #f6f6f6,#e4e4e4);background-image:linear-gradient(to bottom, #f6f6f6,#e4e4e4)}.list>li{padding:0.7rem 1.4rem}.list>li+li{border-top:1px solid #dde0e1}.nav li{border-width:1px}.nav li[class*="icon-"]:before{float:right;margin-left:0.7rem;color:rgba(0,0,0,0.4)}.nav>:first-child{box-shadow:inset 0 1px #E0E1E2;border-top-color:#98999A;margin-top:0;border-top-left-radius:0.4rem;border-top-right-radius:0.4rem}.nav>:last-child{box-shadow:inset 0 1px #fff,0 1px #fff;border-bottom-left-radius:0.4rem;border-bottom-right-radius:0.4rem}ul.nav{padding:1.1rem;position:relative}menu{padding:1.1rem;position:relative}menu li{background:#fff;color:#2a8bcb;border:1px solid;border-color:#e1e5e7 #e1e5e7 #b5babd #e1e5e7;box-shadow:0 1px #e1e5e7}menu li.on{z-index:1;text-shadow:0 1px #2a8bcb;background:#2ea2ef;color:#FFF;border-color:#3495d5 #3495d5 #2a8bcb #3495d5}menu li h3{padding:0.7rem}menu li .btn{margin:0.6rem;float:right}menu>:first-child{margin-top:0;border-top-left-radius:0.4rem;border-top-right-radius:0.4rem}menu>:last-child{border-bottom-left-radius:0.4rem;border-bottom-right-radius:0.4rem}figure{-webkit-overflow-scrolling:touch;visibility:hidden;background:rgba(0,0,0,0.5);opacity:0;-ms-transform:translate(0, 0) scale(1.1);-o-transform:translate(0, 0) scale(1.1);-webkit-transform:translate3d(0, 0, 80px);-moz-transform:translate3d(0, 0, 80px);transform:translate3d(0, 0, 80px)}figure.on{visibility:visible;opacity:1}figure>article{position:relative;box-shadow:0 5px 10px rgba(0,0,0,0.4),0 0 1px #000;min-width:32rem;max-width:100%;min-height:8.8rem;max-height:100%}#notifier{position:absolute;bottom:0;left:100%}.notification{width:32rem;padding:0 1rem 1rem 1rem;position:relative}.notification article{max-height:22rem;border-radius:0.4rem;background:rgba(0,0,0,0.6);color:#fff;text-shadow:0 1px rgba(0,0,0,0.8);padding:1rem 2rem 1rem 6rem}.notification article:before{position:absolute;width:2rem;height:2rem;line-height:1;text-align:center;top:50%;left:3rem;margin-top:-1.5rem}</style><link rel="shortcut icon" href=//songpane.com/favicon.ico><title ng-bind="songs[r.songId].title||sets[r.setId].title||'SongPane'">SongPane</title><meta name=description content=""><meta name=viewport content="initial-scale=1.0, user-scalable=no"><script>(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','//www.google-analytics.com/analytics.js','ga');ga('create', 'UA-39603842-3', 'songpane.com');ga('send', 'pageview');</script><body sp-tap=resetState() ng-class="slow&&'slow'||''" class=icon-songpane><div id=ui ng-include="ready&&'ui'" ng-class="{on:modalClass, run:ready}"></div><div ng-view=""></div><div ng-include="r.modal&&'modal'" onload="modalClass='on'"></div><div id=notifier sp-notifier=""></div><script id=add type=text/ng-template><form novalidate name=addSet method=post ng-controller=addController><header><button type=button class="btn x" sp-tap=modal() sp-kbd="'esc'"></button><input type=submit class="btn action" ng-disabled=!name&&!id ng-click=(name&&addNew(name)||id&&addExisting(id))&&modal() value={{_.add}}><h2>{{_.addToSet}}</h2></header><ul class=list><li><label for=set-name>{{_.addToNewSet}}</label><input class="input block" id=set-name name=set-name ng-model=name autocomplete=off placeholder={{_.nameSet}}></li><li><label for=selectSet>{{_.addToExistingSet}}</label><span class="select-wrap block"><select name=selectSet ng-model=id ng-options="a._id as a.title for a in s"></select><span class="select btn block">{{id&&sets[id].title||_.selectSet}}</span></span></li></ul></form></script><script id=alert type=text/ng-template><header><button class="btn x" sp-tap=modal() sp-kbd="'esc'"></button><h2>{{_.alert}}</h2></header><p class=alert>{{alert}}</p></script><script id=catalog-template type=text/ng-template><div sp-if=!songs.length class=center><div class=placeholder><i class=icon-book></i><h6>{{_.emptyCatalog}}</h6><p>{{_.aboutCatalog}}</p></div></div><p ng-show=songs.length class="input-wrap space" ng-init="f=0"><i class="btn simple icon-search" sp-tap="f=f+1"></i><input sp-focus=f class="input search block" ng-model=query placeholder={{_.filterSongs}}><i class="btn simple icon-clear" sp-tap="query='';f=f+1" ng-show=query></i></p><menu><li ng-repeat="song in songs | filter:query | orderBy:'title'" ng-class="{on:song._id==r.songId}"><h3 class=trim sp-tap="p('catalog/'+song._id)">{{song.title}}</h3></li></menu></script><script id=confirm type=text/ng-template><ul class="list w" ng-controller=confirmController><li><h2>{{_.confirm}}</h2></li><li>{{_.explainDelSong}}</li><li class=group><span class="btn flex" sp-tap=modal()>{{_.cancel}}</span><span class="btn danger flex" sp-tap=trashSong()&&modal()>{{_.del}}</span></li></ul></script><script id=keyboard type=text/ng-template><header><button class="btn x" sp-tap=modal() sp-kbd="'esc'"></button><h2>{{_.keyboard}}</h2></header><ul class=list><li><kbd>j</kbd> {{_.nextSongOrSet}}</li><li><kbd>k</kbd> {{_.prevSongOrSet}}</li><li><kbd>c</kbd> {{_.toggleChords}}</li><li><kbd>-</kbd>/<kbd>=</kbd> {{_.changeFontSize}}</li><li><kbd>f</kbd> {{_.toggleFullscreen}}</li><li><kbd>i</kbd> {{_.toggleInfo}}</li><li><kbd>n</kbd> {{_.newSong}}</li><li><kbd>h</kbd> {{_.toggleHelp}}</li><li><kbd>,</kbd> {{_.toggleSettings}}</li><li><kbd>esc</kbd> {{_.esc}}</li></ul></script><script id=modal type=text/ng-template><figure id=modal ng-class=r.modal&&modalClass><article ng-include=r.modal id="{{'modal-'+r.modal}}" class=modal></article></figure></script><script id=new type=text/ng-template><form novalidate id=new-song name=newSong method=post ng-controller=newController><header><button type=button class="btn x" sp-tap="modal();q('edit',null)" sp-kbd="'esc'"></button><input class="btn action" type=submit ng-disabled=newSong.$invalid ng-click="saveSong(song,v==_.priv||0)&&modal()&&q('edit',null)" value={{_.save}}><h2>{{song._id&&_.editSong||_.newSong}}</h2></header><fieldset><input class=input ng-model=song.title name=song-title sp-focus="" autocomplete=off required placeholder={{_.songTitle}}><editor mode=songMode placeholder={{_.lyricsAndChords}} model=song.body></editor><div class=group><span class="select-wrap flex"><select ng-model=song.key name=song-key required ng-options="key for key in keys"></select><span class="select input block" placeholder={{_.key}}>{{song.key}}</span></span><span class="select-wrap flex"><select ng-model=song.signature name=song-timesig required ng-options="ts for ts in ['2/4','3/4','4/4']"></select><span class="select input block" placeholder={{_.signature}}>{{song.signature}}</span></span><input class="input flex" type=number ng-model=song.tempo name=song-tempo min=20 max=240 required placeholder={{_.tempo}}></div><div class=group><span class="select-wrap flex"><select ng-model=song.language name=song-language required ng-options="l.code as l.native for l in langs"></select><span class="select input block" placeholder={{_.language}}>{{langs[song.language].native}}</span></span><span class="select-wrap flex"><select ng-init="v=song._acl.gr==!1&&_.priv||song.title&&_.pub||''" ng-model=v name=song-timesig required ng-options="v for v in [_.pub, _.priv]"></select><span class="select input block" placeholder={{_.visibility}}>{{v}}</span></span></div><input class=input ng-model=song.artists name=song-artist required placeholder={{_.artist}} ng-list=""><input class=input ng-model=song.copyright name=song-copyright required placeholder={{_.copyright}}></fieldset></form></script><script id=rename type=text/ng-template><form novalidate name=renameSetForm method=post ng-controller=renameController><header><button type=button class="btn x" sp-tap=modal() sp-kbd="'esc'"></button><input class="btn action" type=submit ng-disabled=renameSetForm.$invalid ng-click="renameSet(r.setId, newTitle)&&modal()" value={{_.save}}><h2>{{_.renameSet}}</h2></header><ul class=list><li><input class="input block" ng-init="newTitle=sets[r.setId].title" required ng-model=newTitle sp-focus=""></li></ul></form></script><script id=search-template type=text/ng-template><div ng-controller=searchController><div class=center ng-hide=results.length><div class=placeholder><i ng-show=!n class=icon-search></i><h6 ng-show=n>{{s&&_.searching||_.noResults}}</h6></div></div><header><form novalidate name=searchForm method=post class=input-wrap><i class="btn simple icon-search" sp-tap="f=f+1"></i><input required sp-focus=f class="input search block" ng-model=query placeholder={{_.searchSongs}}><input type=submit ng-click=search(query) class=invi><i class="btn simple icon-clear" sp-tap="query='';f=f+1" ng-show=query></i></form></header><menu><li ng-repeat="song in results" ng-class="{on:song._id==r.songId}"><h3 class=trim sp-tap="p('search/'+song._id)">{{song.title}}</h3></li></menu></div></script><script id=set-template type=text/ng-template><div ng-init="i=r.setId;set=sets[i]"><ul class=toolbar id=em><li sp-tap="modal('share')" class="btn icon-share flex"></li><li sp-if=sets.isWriter(set) sp-tap="modal('rename')" class="btn icon-pencil flex"></li><li sp-tap=duplicateSet() class="btn icon-copy flex"></li><li sp-if=sets.isWriter(set) sp-tap=trashSet() class="btn icon-bin flex"></li></ul><div class=view-container ng-class={open:em}><header><button sp-tap="p('sets/')" class="btn simple icon-left"></button> <button sp-tap="toggleState('em')" class=btn ng-class="{active:em,'icon-down':!em,'icon-up':em}"></button><h2 class=trim>{{set.title}}</h2></header><menu sp-sortable=sets.isWriter(set) onsort=sortSong class=songs><li ng-repeat="song in set.songs" ng-init="id=song._id" ng-class="{on:id==r.songId}"><button class="btn danger icon-minus" ng-show=em sp-tap=rmSong($index)></button><h3 class=trim sp-tap="p('set/'+i+'/'+id)">{{songs[id].title}}</h3></li></menu></div></div></script><script id=sets-template type=text/ng-template><div sp-if=!sets.length class=center><div class=placeholder><i class=icon-sets></i><h6>{{_.noSets}}</h6><p>{{_.creatingSets}}</p></div></div><ul sp-sortable="" onsort=sortSet class=nav><li ng-repeat="set in sets" sp-tap="p('set/'+set._id+'/')" class="icon-right set"><h3 class=trim>{{set.title}}</h3></li></ul></script><script id=settings type=text/ng-template><header><button class="btn x" sp-tap=modal() sp-kbd="'esc'"></button><h2>{{_.settings}}</h2></header><ul class=list ng-controller=settingsController><li sp-tap="toggle('hideChords')"><span>{{_.hideChords}}</span><div class="toggle fr" ng-class={on:s.hideChords}></div></li><li><span>{{_.fontSize}}</span><div class=group><span sp-tap=setFont(0) class="btn flex" ng-class={on:!s.fontSize}>{{_.small}}</span><span sp-tap=setFont(1) class="btn flex" ng-class="{on:s.fontSize==1}">{{_.medium}}</span><span sp-tap=setFont(2) class="btn flex" ng-class="{on:s.fontSize==2}">{{_.large}}</span></div></li><li><span>{{_.disconnectAccount}}</span> <button class="btn danger block" sp-tap=logout()&&modal()>{{_.disconnect}}</button></li><li><q>v0.2.5</q></li></ul></script><script id=share-readonly type=text/ng-template><header><button class="btn x" sp-tap=modal() sp-kbd="'esc'"></button> <button class="btn action" sp-tap=modal()>{{_.done}}</button><h2>{{_.shareSet}}</h2></header><ul class=list><li class=collaborator ng-repeat="u in [owner].concat(c)"><div class="img fl"><img width=30 height=30 ng-src="https://gravatar.com/avatar/{{md5(u)}}?s=60&d=blank"></div><span class=fr>{{owner==u&&'owner'||e.indexOf(u)>-1&&'editor'||'viewer'}}</span><div class=trim>{{u}}</div></li></ul></script><script id=share-readwrite type=text/ng-template><header><button class="btn x" sp-tap=modal() sp-kbd="'esc'"></button> <button class="btn action" sp-tap=save()&&modal()>{{_.done}}</button><h2>{{_.shareSet}}</h2></header><ul class=list><li class=collaborator><div class="img fl"><img width=30 height=30 ng-src="https://gravatar.com/avatar/{{md5(owner)}}?s=60&d=blank"></div><span class=fr>{{_.owner}}</span><div class=trim>{{owner}}</div></li><li class=collaborator ng-repeat="user in c"><div class="img fl"><img width=30 height=30 ng-src="https://gravatar.com/avatar/{{md5(user)}}?s=60&d=blank"></div><button sp-tap=denyAccess(user) class="btn danger icon-minus fr"></button> <span class="select-wrap fr"><select ng-change="allowAccess(user, cap)" ng-init="cap=e.indexOf(user)>-1&&'edit'||'view'" ng-model=cap ng-options="c for c in ['view', 'edit']"></select><span class="select btn">{{cap}}</span></span><div class=trim>{{user}}</div></li><li class=collaborator><form novalidate><div class="img fl"><img width=30 height=30 ng-src="https://gravatar.com/avatar/{{md5(m)}}?s=60&d=blank"></div><button type=submit ng-disabled=!m ng-click="allowAccess(m, t)&&(m='')" class="btn action icon-plus fr"></button> <span class="select-wrap fr"><select ng-init="t='view'" ng-model=t ng-options="c for c in ['view', 'edit']"></select><span class="select btn">{{t}}</span></span><div class=trim><input class=input required ng-model=m placeholder={{_.email}}></div></form></li></ul></script><script id=share type=text/ng-template><div ng-include="isOwner()&&'share-readwrite'||'share-readonly'" ng-controller=shareController></div></script><script id=ui type=text/ng-template><div class=icon-songpane ng-controller=uiController><div id=song-view ng-class={cr:cr,ic:r.songId,fs:fs}><aside><article id=info><h1>{{songs[r.songId].title}}</h1><ul class=list><li><div class=group><a class="btn icon-add flex" sp-tap="modal('add')" id=add_to_set></a><a sp-tap=editSong(1) class="btn icon-copy flex"></a><a sp-if=isSongOwner() sp-tap=editSong() class="btn icon-pencil flex"></a><a sp-if=isSongOwner() sp-tap="modal('confirm')" class="btn danger icon-bin flex"></a></div></li><li><q>{{_.key}}</q><span class=select-wrap sp-if=canChangeKey()><select ng-change="updateKey(k)+clean('k')" ng-model=k ng-options="k for k in getKeys()"></select><span class="select btn">{{k}}</span></span><span sp-if=!canChangeKey()>{{k}}</span> ({{songs[r.songId].key}})</li><li><q>{{_.tempo}}</q>{{songs[r.songId].tempo}}</li><li><q>{{_.signature}}</q>{{songs[r.songId].signature}}</li><li><q>{{_.artist}}</q><p>{{songs[r.songId].artists.join(', ')}}</p></li><li class=drop sp-tap="c=!c" ng-class="{'active':c}"><q>{{_.copyright}}</q><p ng-show=c>{{songs[r.songId].copyright}}</p></li></ul></article></aside><section id=sheet><div id=space sp-tap=nextSong() sp-kbd="['space', 'right', 'j', 'down', 'pagedown']" ng-class=spaceClass><article sp-slide=songSlide><div ng-class="{m:s.fontSize==1,l:s.fontSize==2,h:s.hideChords}" class=song-wrap><p ng-repeat="part in model" ng-class="'part-'+part.type" ng-bind-html-unsafe=part.text></p></div></article></div><button class=overlaybutton sp-tap="p(r.setId&&'set/'+r.setId + '/'||r.view+'/')" id=back-button><span class="overlaybutton-inner icon-back"></span></button> <button class=overlaybutton sp-tap="fs=!fs" sp-kbd="'f'" id=fullscreen-button><span class=overlaybutton-inner ng-class="fs&&'icon-min'||'icon-max'"></span></button> <button class=overlaybutton sp-tap="cr=!cr" sp-kbd="'i'" id=aside-button><span class="overlaybutton-inner icon-info"></span></button></section></div><aside id=menu><ul><li sp-tap="p('sets/')" ng-class="{open: r.view == 'sets'}"><i class=icon-sets></i><span>{{_.sets}}</span></li><li sp-tap="p('catalog/')" sp-kbd="'b'" ng-class="{open: r.view == 'catalog'}"><i class=icon-book></i><span>{{_.catalog}}</span></li><li sp-tap="p('search/')" sp-kbd="'/'" ng-class="{open: r.view == 'search'}"><i class=icon-search></i><span>{{_.search}}</span></li><li sp-tap="modal('settings')" sp-kbd="[',', 'command+,', 'control+,']"><i class=icon-cog></i><span>{{_.settings}}</span></li></ul></aside><section id=nav class="fill w" ng-class={open:menu}><header><div class=b sp-tap="toggleState('menu')" sp-kbd="'m'" ng-class={on:menu}><i class=icon-more></i></div><div class=b sp-tap="modal('new')" sp-kbd="'n'" ng-class="{on:modal.isOn('new')}"><i class=icon-plus></i></div><h1 sp-tap="p('sets/')" sp-kbd="'s'"><b>Song</b>Pane</h1></header><div id=view ng-class=navClass><article sp-slide=viewSlide id={{model}} ng-include="model + '-template'"></article></div></section></div></script><script src=//ajax.googleapis.com/ajax/libs/angularjs/1.0.6/angular.min.js></script><script>app=angular.module("SongPane",[]),function(a){a.config(["$routeProvider",function(a){a.when("/").when("/set/:setId/:songId").when("/:view/:songId").otherwise("/")}]).run(["$rootScope","collection","util","transitioner","keyboard","modal","notifier","$window","platform","locale",function(a,b,c,d,e,f,g,h,i,j){var k,l,m=(h.navigator,j._);h.notify=g.notify,a._=m,a.change=!1,a.$on("ready",function(){a.ready=!0}),k=a.sets=b({songs:[],isNeeded:function(a){var b=this.songs,d=a.songs;return d.forEach(function(a){var e=a._id;d[e]=a,c.list(b,e)}),!0},getSong:function(a,b){var c,d,e=this[a].songs;for(d=0,c=e.length;c>d;d++)if(e[d]._id==b)return e[d]},url:"sets.json"}),l=a.songs=b({url:"songs.json",getKey:function(a,b){var c=b&&k.getSong(b,a),d=l[a];return c&&c.key||d.key}}),k.run(function(){l.run(function(){a.$emit("ready")})}),a.modal=f,a.toggleState=function(b){a[b]=!a[b],a.changedState=!0},a.resetState=function(){return a.changedState?void(a.changedState=!1):void["menu","em"].forEach(function(b){a[b]&&(a[b]=!1)})},e.on("ctrl+shift",function(){a.slow=!a.slow}).on(["h","?"],function(){return f("keyboard"),a.$apply(),!1}).on("esc",function(){return!1})}])}(app),app.controller("addController",["$scope","$routeParams","$rootScope",function(a,b,c){{var d=c.sets;c.songs}a.s=d.filter(function(a){return d.isWriter(a)}),a.addNew=function(a){var c=b.songId;return d.save({title:a,songs:[{_id:c}]})},a.addExisting=function(a){var c=b.songId,e=d[a],f=e.songs;return f[c]?!0:(f.push(f[c]={_id:c}),d.save(e))}}]),app.controller("confirmController",["$scope","$routeParams","$rootScope","util","$location",function(a,b,c,d,e){var f=c.sets,g=c.songs;a.trashSong=function(){var a=b.songId,c=b.setId;return f.forEach(function(b){d.unlist(b.songs,a)||f.remove(b._id)}),e.path((c?"set":b.view)+"/"+(f[c]?c+"/":"")),g.remove(a)}}]),app.controller("newController",["$scope","$rootScope","transposer","songMode","$routeParams","util","locale","notifier",function(a,b,c,d,e,f,g,h){var i=b.songs,j=e.edit,k=g._;a.songMode=d,a.langs=g.langs,j&&(a.song=f.extend({},i[e.songId]),"clone"==j&&delete a.song._id,a.song.tempo=a.song.tempo-0),a.saveSong=function(a,b){var d="("+c.getScale(a.key).join("|")+")";return~a.body.search("^(?:\\[[1-9BCPIO]\\]\\n(?:(?: *"+d+"[1-9adgijmsu,\\(\\)]*(?:\\/"+d+")?)*\\n[^\\[\\n].+\\S(?:\\n|$))+)+$")?(a._acl={},b&&(a._acl={gr:!1}),i.save(a)):void h.notify({message:k.checkBody,icon:"alert"})},a.keys=c.getAllKeys()}]),app.controller("renameController",["$scope","$rootScope",function(a,b){var c=b.sets;a.renameSet=function(a,b){var d=c[a];return b!==d.title?(d.title=b,c.save(d)):!1}}]),app.controller("searchController",["$scope","$rootScope","locale",function(a,b,c){b.songs;a._=c._,a.message="",a.search=function(){}}]),app.controller("settingsController",["$scope","settings",function(a,b){a.s=b.settings,a.toggle=function(a){b.toggle(a)},a.setFont=function(a){b.set("fontSize",a)}}]),app.controller("shareController",["$scope","$routeParams","$rootScope","md5","util",function(a,b,c,d,e){var f=e.list,g=e.unlist,h=c.sets,i=b.setId,j=a.e=h.getWriters(i).slice(0),k=a.c=h.getReaders(i).slice(0);a.owner=h.getOwner(i),a.md5=d,a.allowAccess=function(a,b){return f(k,a),"edit"==b?f(j,a):g(j,a),!0},a.denyAccess=function(a){g(j,a),g(k,a)},a.isOwner=function(){return h.isOwner(h[i])},a.save=function(){return h.setReaders(i,k).setWriters(i,j).save(h[i])}}]),app.controller("uiController",["$scope","$rootScope","$routeParams","$location","settings","util","keyboard","transposer","transitioner","locale","$timeout","modal",function(a,b,c,d,e,f,g,h,i,j,k,l){function m(a,b,c){var d,e,g,i,j,k,l,m,n,o=[];return a.split("[").forEach(function(a){if(""!==a){for(d=a.split("]"),k="",g=d[1].replace(/[\r\t\v\f\0\x0B]|^\n+|\s+$/g,"").split("\n"),i=0,j=g.length;j>i;i+=2){for(e=g[i+1],e.length<g[i].length&&(e+=f.pad(g[i].length-e.length," ")),n=0,l=/\S+/g;m=l.exec(g[i]);)k+=e.substring(n,m.index)+'<span class="c"><span>'+(b!==c?h.transpose(m[0],b,c):m[0])+"</span></span>",n=m.index;k+=g[i+1].substr(n)+"\n"}o.push({type:d[0].toLowerCase(),text:k})}}),o}var n=j._,o=b.sets,p=b.songs,q=b.songSlide={to:"left"},r=b.viewSlide={to:"left"};b.r=c,b.p=function(a){d.path(a)},b.q=function(a,b){d.search(a,b)},b._=n,a.s=e.settings,a.nextSong=function(){var a,b,e=c.setId,f=c.songId;e&&f&&(a=o[e].songs,a.forEach(function(a,c){a._id==f&&(b=c)}),b<a.length-1?b++:b=0,d.path("/set/"+e+"/"+a[b]._id))},a.prevSong=function(){var a,b,e=c.setId,f=c.songId;e&&f&&(a=o[e].songs,a.forEach(function(a,c){a._id==f&&(b=c)}),b>0?b--:b=a.length-1,d.path("/set/"+e+"/"+a[b]._id))},a.getKeys=function(){return c.songId&&p[c.songId]&&h.getKeys("m"===p[c.songId].key.slice(-1))||[]},a.pad=f.pad,a.trashSet=function(){d.path("/"),o.remove(c.setId)},a.duplicateSet=function(){var a=o[c.setId];d.path("set/"+o.save({title:a.title+" ("+n.copy+")",songs:a.songs.slice(0)})+"/")},a.rmSong=function(b){var e=c.setId,f=o[e],g=f.songs;d.path("set/"+e+"/"),g.splice(b,1),g.length?o.save(f):a.trashSet()},a.curKey=function(){var a=c.songId;return a&&p.getKey(a,c.setId)},a.updateKey=function(b,d){var e,f,g=c.setId,h=c.songId,i=p[h];g&&(e=o[g],f=o.getSong(g,h),b!==i.key?f.key=b:delete f.key,!d&&o.save(e)),a.k!=b&&(q.model=m(i.body,i.key,b),a.k=b)},a.clean=function(a){delete this[a]},a.sortSet=function(a,b){f.move(o,a,b)},a.sortSong=function(a,b){var d=o[c.setId];f.move(d.songs,a,b),o.save(d)},a.isSongOwner=function(){return c.songId&&p.isOwner(p[c.songId])},a.editSong=function(a){d.search("edit",a?"clone":void 0),l("new")},a.canChangeKey=function(){var a=c.setId;return a?o.isWriter(o[a]):!0},a.$on("$routeChangeSuccess",function(b,c,e){if("/"===d.path())return void d.path(o.length?"sets/":"search/");if(c){var f,g,h,j,k=c.params.view,l=c.params.setId,n=c.params.songId;if(e&&(f=e.params.view,g=e.params.setId,h=e.params.songId),k){if(-1==["sets","catalog","search"].indexOf(k))return void d.path(o.length?"sets/":"search/");g?(r.to="right",r.model=k):k!=f&&(r.to="left",r.model=k)}if(l){if(!o[l])return void d.path(o.length?"sets/":"search/");l!=g&&(r.force=!0,r.to="left",r.model="set")}if(n){if(!p[n])return void d.path(k+"/");j=m(p[n].body,p[n].key,p.getKey(n,l)),a.k=a.curKey(),e?n!==h&&(g&&g===l&&o[l].songs.indexOf(n)<o[l].songs.indexOf(h)?(q.to="right",q.model=j):(q.to="left",q.model=j)):(q.to="left",q.model=j)}else h&&i.apply("song-view",function(){q.model=""})}}),g.on(["left","k","up","pageup"],function(){return a.$apply(function(){a.prevSong()}),!1}).on("c",function(){return a.$apply(function(){e.toggle("hideChords")}),!1}).on("=",function(){var b=e.settings.fontSize||0;2>b&&(e.set("fontSize",b+1),a.$apply())}).on("-",function(){var b=e.settings.fontSize||0;b&&(e.set("fontSize",b-1),a.$apply())}),a.$emit("$routeChangeSuccess",{params:c})}]),app.directive("editor",["$window","util","parse",function(a,b,c){var d=a.document,e=a.setTimeout,f=a.clearTimeout;return{restrict:"E",replace:!0,transclude:!0,scope:{mode:"&",placeholder:"@",model:"="},template:'<div class="editor"><div class="editor-inner"><div></div><span class="hide"></span><textarea class="input" placeholder="{{placeholder}}" ng-model="model" ng-transclude></textarea></div></div>',link:function(a,g){g=g.children()[0];var h,i=g.children,j=i[0],k=b.element(i[1]),l=i[2],m=a.mode(),n=b.throttle,o=0,p=function(){var a=l.selectionStart||0;a!=o&&(k.attr("pad",l.value.substr(0,a)).removeClass("hide"),o=a)},q=function(){var a=d.createElement("div");p(),c(l.value,m,function(b,c){var e;c&&"chords"!=c?(e=a.appendChild(d.createElement("span")),e.className=c):e=a,e.appendChild(d.createTextNode(b))}),g.replaceChild(a,j),j=a};b.element(l).bind("input",n(q,10)).bind("focus",function(){!function a(){p(),f(h),h=e(a,100)}()}).bind("blur",function(){f(h),k.addClass("hide"),o=null}),e(q,50)}}}]),app.directive("spFocus",["$timeout","util",function(a){function b(a){if(a&&0!==a.length){var b=(""+a).toLowercase;a=!("f"==b||"0"==b||"false"==b||"no"==b||"n"==b||"[]"==b)}else a=!1;return a}return function(c,d,e){function f(){a(function(){g.focus()},400)}var g=d[0];0===e.spFocus.length?f():c.$watch(e.spFocus,function(a){b(a)&&g.focus()})}}]),app.directive("spIf",function(){return{transclude:"element",priority:1e3,terminal:!0,compile:function(a,b,c){return function(a,b,d){var e,f;a.$watch(d.spIf,function(d){d?e||(f=a.$new(),c(f,function(a){e=a,b.after(a)})):e&&(e.remove(),f.$destroy(),e=f=void 0)})}}}}),app.directive("spNotifier",["util","notifier","transitioner","$compile","touch","$timeout",function(a,b,c,d,e,f){return{link:function(g,h){function i(b){function i(){m||(m=!0,k.removeClass("tl"),c.after(k,function(){k.remove(),n.$destroy(),k=n=null}))}var k,l,m,n=g.$new();a.extend(n,b),k=a.element(h.prepend(j).children()[0]),d(k.contents())(n),f(function(){k.addClass("tl")}),e.tap(k,i),l=f(i,b.delay||5e3)}var j='<div class="notification"><article ng-class="\'icon-\'+icon"><h6>{{title}}</h6><p>{{message}}</p></article></div>';b.setCallback(i).get().forEach(i)}}}]),app.directive("spParse",["touch","util",function(){return function(a,b,c){var d=a.$eval(c.spParse),e=b.find("div"),f=b.find("textarea"),g=function(){var a=f.val();e.html(d(a)||"")};f.bind("keyup",g)}}]),app.directive("spSlide",["util","transitioner",function(a,b){return{transclude:"element",priority:1e3,terminal:!0,compile:function(a,c,d){return function(a,e){var f,g,h,i=c.spSlide,j=e.parent();j.addClass("t3d"),a.$watch(function(a){var c,k=a.$eval(i);!k.model&&h&&(g.remove(),f.$destroy(),g=f=h=null),k.model&&(k.model!=h||k.force)&&(k.force=!1,c=a.$new(),c.model=k.model,d(c,function(a){if(e.after(a),g){var d=g,i=f;"left"==k.to?(a.addClass("tr"),j.addClass("transition tl")):(a.addClass("tl"),j.addClass("transition tr")),g.bind("$destroy",function(){j.removeClass("transition tl tr"),a.removeClass("tr tl")}),b.apply(j[0].id,function(){d.remove(),i.$destroy()})}g=a,f=c,h=k.model}))})}}}}]),app.directive("spSortable",["touch","$timeout","util",function(a,b,c){function d(a){var b=0;do b+=a.prop("offsetTop")-a.prop("scrollTop"),a=c.element(a.prop("offsetParent"));while(void 0!==a.prop("offsetTop"));return b}function e(){i&&i.css("margin",""),h+1<l.length&&(i=l.eq(h+1),i.css("marginTop",j-1+"px"))}var f,g,h,i,j,k,l,m,n,o,p=Math.min,q=Math.max;return function(r,s,t){r.$watch(t.spSortable,function(u){u||void 0===u?(a.hold(s,function(a,c){a.preventDefault(),l=s.children();var i=l.eq(0);o=d(s),k=i.prop("offsetTop")-i.prop("scrollTop"),j=l[0].offsetHeight-1,n=j*l.length,m=p(q(0,c.y-o-k),n),g=h=p(Math.floor(m/j),l.length-1),f=l.eq(g),f.addClass("dragged").css("top",p(q(m+k-j/2,0),n-j/2)+"px"),b(function(){s.addClass("sorting")},0,!1),e()}),a.drag(s,function(a,b){a.preventDefault(),o=d(s);var c=p(q(0,b.y-o-k),n);if(f.css("top",p(q(c+k-j/2,k),n-j/2-k)+"px"),h!==p(Math.floor(c/j),l.length-1)){var g=Math.round(c/j);g!==h&&g!==h+1&&(g>h?(l.splice(g-1,0,l.splice(h,1)[0]),h=g-1):(l.splice(g,0,l.splice(h,1)[0]),h=g),e())}}),a.release(s,function(a){a.preventDefault(),s.removeClass("sorting"),i.css("margin",""),f.removeClass("dragged").css("top",""),r.$apply(t.onsort+"("+g+","+h+")")})):(a.hold(s,c.noop),a.drag(s,c.noop),a.release(s,c.noop))})}}]),app.directive("spTap",["touch","keyboard",function(a,b){return function(c,d,e){a.tap(d,function(){return c.$apply(e.spTap)}),e.spKbd&&b.on(c.$eval(e.spKbd),function(){return c.$apply(e.spTap)})}}]),app.value("songMode",{startState:function(){return{next:"part"}},token:function(a,b){var c=null;return"part"==b.next?a.match(/^\[[1-9BCPIO]\](?=$|\n)/)?(c="part",b.next="chords"):a.skip():"chords"==b.next?a.eat("\n")?(c="chords",b.next="chord"):a.skip():"chord"==b.next?a.eat("\n")?b.next="text":a.eatWhile(" ")?/^[A-G]$/.test(a.peek())||a.skip():a.match(/^[A-G][#b12345679adgijmsu,\(\)]*(?:\/[A-G][#b]?)?(?=($| +|\n))/)?c="chord":a.skip():"text"==b.next?a.match(/^.+\S/)?(c="text",b.next="partOrChords"):a.skip():"partOrChords"==b.next?a.match(/^\n(?=\[)/)?b.next="part":a.eat("\n")?(c="chords",b.next="chord"):a.skip():a.skip(),c}}),app.factory("collection",["$templateCache","$http","$timeout","util",function(a,b,c,d){var e=function(a){var b=this;return b.syncDown(a||d.noop),b},f=function(a){var c=this;return b.get(d.buildUrl(c.url,c.params)).success(function(a){a.forEach(function(a){c[a._id]?c.saveLocal(a):c.add(a,null,!0)})}).success(a||d.noop).error(a||d.noop),c},g=function(a){var b=this,c=a._id;"trash"==a.status?b.removeLocal(c):d.extend(b[c],a)},h=function(a,b){var c=this;d.toArray(a).forEach(function(a){"trash"!=a.status&&(c[a._id]||(c.isNeeded(a)?c.push(a):c.aux.push(a),c[a._id]=a))}),b&&b.call(c,a)},i=function(a){var b=this;d.unlist(b,b[a]),delete b[a]},j=function(a){var b=this;return b[a].status="trash",d.unlist(b,b[a]),b.save(b[a],function(){b.removeLocal(a)})},k=function(a,b){var c=this,e=a._id;if(e||(e=a._id=d.generateId(),a._acl||(a._acl={}),a._acl.creator="[email protected]",!c.onNew||c.onNew(a)))return c[e]?d.extend(c[e],a):c.push(c[e]=a),b&&b(),e},l=function(){return!0},m=function(a){return this.isOwner(a)||a._acl.w&&~a._acl.w.indexOf(auth.id())},n=function(a){return this[a]._acl.creator},o=function(a,b){var c=this,e=c[a]._acl.r;return e||(e=c[a]._acl.r=[]),d.list(e,b),c},p=function(a,b){var c=this,e=c[a]._acl.w;return e||(e=c[a]._acl.w=[]),d.list(e,b),c},q=function(a,b){var c=this,e=c[a]._acl.r;return e&&d.unlist(e,b),c},r=function(a,b){var c=this,e=c[a]._acl.w;return e&&d.unlist(e,b),c},s=function(a){var b=this[a]._acl;return b&&b.r||[]},t=function(a){var b=this[a]._acl;return b&&b.w||[]},u=function(a,b){var c=this,d=c[a]._acl;return d.r=b,c},v=function(a,b){var c=this,d=c[a]._acl;return d.w=b,c};return function(a){var b=[],c={url:"",run:e,save:k,remove:j,isOwner:l,isWriter:m,getOwner:n,syncDown:f,addWriter:p,addReader:o,removeWriter:r,removeReader:q,getReaders:s,getWriters:t,setReaders:u,setWriters:v,add:h,saveLocal:g,removeLocal:i,isNeeded:function(){return!0}};return d.extend(b,c,a),b}}]),app.factory("keyboard",["$document","$timeout",function(a,b){function c(a){var c,d,e,g=a.keyCode,h=a.type;if((93==g||224==g)&&(g=91),g>95&&106>g&&(g-=48),110==g&&(g=190),109==g&&(g=189),111==g&&(g=191),"keyup"==h&&(e=j.indexOf(g),-1!==e&&j.splice(e,1)),c=a.target,3==c.nodeType&&(c=c.parentNode),"INPUT"==c.tagName||"SELECT"==c.tagName||"TEXTAREA"==c.tagName||c.contentEditable&&"true"==c.contentEditable){if(27!=g)return;c.blur()}if("keydown"==h){if(-1!==j.indexOf(g))return;j.push(g),f&&b.cancel(f),f=b(function(){j.length=0},1e3,!1)}d=i[h+":"+j.join("+")],d&&d.forEach(function(b){b(a)===!1&&(a.preventDefault&&a.preventDefault(),a.stopPropagation&&a.stopPropagation(),a.returnValue=!1,a.cancelBubble=!0)})}function d(a,b){var c=[],d="+"===a?["+"]:a.split("+");return d.forEach(function(a){h[a]&&(c.push(16),a=h[a]),g[a]&&c.push(g[a])}),b+":"+c.join("+")}function e(a,b){var c,e;for(e in a)c=d(e,b),i[c]||(i[c]=[]),i[c].push(a[e])}var f,g={backspace:8,tab:9,enter:13,"return":13,shift:16,ctrl:17,control:17,alt:18,option:18,capslock:20,esc:27,escape:27,space:32,pageup:33,pagedown:34,end:35,home:36,left:37,up:38,right:39,down:40,ins:45,insert:45,del:46,"delete":46,0:48,1:49,2:50,3:51,4:52,5:53,6:54,7:55,8:56,9:57,a:65,b:66,c:67,d:68,e:69,f:70,g:71,h:72,i:73,j:74,k:75,l:76,m:77,n:78,o:79,p:80,q:81,r:82,s:83,t:84,u:85,v:86,w:87,x:88,y:89,z:90,meta:91,command:91,"super":91,windows:91,"*":106,"+":107,f1:112,f2:113,f3:114,f4:115,f5:116,f6:117,f7:118,f8:119,f9:120,f10:121,f11:122,f12:123,";":186,"=":187,",":188,"-":189,".":190,"/":191,"`":192,"[":219,"\\":220,"]":221,"'":222},h={"~":"`","!":"1","@":"2","#":"3",$:"4","%":"5","^":"6","&":"7","*":"8","(":"9",")":"0",_:"-","+":"=",":":";",'"':"'","<":",",">":".","?":"/","|":"\\"},i={},j=[];a.bind("keydown",c),a.bind("keyup",c);var k={on:function(){var a=arguments,b=a[0],c=a[2],d={};return"string"==typeof b?d[b]=a[1]:Array.isArray(b)?b.forEach(function(b){d[b]=a[1]}):(d=a[0],c=a[1]),e(d,c||"keydown"),this},off:function(a,b){var c=d(a,b);return i[c]&&delete i[c],this},reset:function(){return i={},this}};return k}]),app.factory("locale",function(){var a={},b=a.langs=[{code:"cs",name:"Czech","native":"Česky"},{code:"da",name:"Danish","native":"Dansk"},{code:"de",name:"German","native":"Deutsch"},{code:"en",name:"English","native":"English"},{code:"es",name:"Spanish","native":"Español"},{code:"fr",name:"French","native":"Français"},{code:"it",name:"Italian","native":"Italiano"},{code:"lv",name:"Latvian","native":"Latviešu"},{code:"lt",name:"Lithuanian","native":"Lietuvių"},{code:"hu",name:"Hungarian","native":"Magyar"},{code:"nl",name:"Dutch","native":"Nederlands"},{code:"no",name:"Norwegian","native":"Norsk"},{code:"pl",name:"Polish","native":"Polski"},{code:"pt",name:"Portuguese","native":"Português"},{code:"ro",name:"Romanian","native":"Română"},{code:"sq",name:"Albanian","native":"Shqip"},{code:"sk",name:"Slovak","native":"Slovenčina"},{code:"sl",name:"Slovene","native":"Slovenščina"},{code:"fi",name:"Finnish","native":"Suomi"},{code:"sv",name:"Swedish","native":"Svenska"},{code:"tr",name:"Turkish","native":"Türkçe"},{code:"el",name:"Greek","native":"Ελληνικά"},{code:"bg",name:"Bulgarian","native":"български"},{code:"ru",name:"Russian","native":"Pусский"},{code:"uk",name:"Ukrainian","native":"Українська"}];return a._={newSong:"New Song",editSong:"Edit Song",addToSet:"Add to Set",renameSet:"Rename Set",shareSet:"Share Set",settings:"Settings",noConnection:"Could not connect to the server!",outOfSync:"SongPane is out of sync. Please make sure you have an active internet connection.",quotaExceeded:"The local storage limit has been reached or local storage is disabled.",alert:"Alert",copy:"copy",keyboard:"Keyboard Shortcuts",illegalOperation:"You tried to perform an illegal operation!",key:"Key",currentKey:"Current Key",originalKey:"Original Key",tempo:"Tempo",signature:"Signature",timeSignature:"Time Signature",artist:"Artist(s)",copyright:"Copyright",profile:"Profile",buddies:"Buddies",remove:"Remove",owner:"Owner",save:"Save",add:"Add",addToNewSet:"Add the song to a new set",addToExistingSet:"or an existing set",selectSet:"Select a set",hideChords:"Hide chords",disconnect:"Disconnect",disconnectAccount:"Disconnect account",songTitle:"Song title",lyricsAndChords:"Lyrics and chords",nameSet:"Give this set a name",done:"Done",email:"Email",password:"Password",createAccount:"Create Account",resetPassword:"Reset Password",searchSongs:"Search songs",filterSongs:"Filter songs",sets:"Sets",catalog:"Catalog",search:"Search",noSets:"No Sets",creatingSets:"Sets are created by adding songs to them.",emptyCatalog:"Empty Catalog",aboutCatalog:"The catalog contains all the songs that you use or songs that you add to SongPane.",noResults:"No Results",searching:"Searching...",wait:"Wait...",standalone:"To enjoy this app to the fullest we recommend adding it to your Home Screen.",loggedOut:"You have been logged out.",notFound:"The resource was not found on the server.",genericError:"Something went wrong and it’s probably our fault.",confirm:"Are you sure?",explainDelSong:"Deleting the song makes it unavailable to any set that is currently using it!",del:"Delete",cancel:"Cancel",nextSongOrSet:"Next song or set",prevSongOrSet:"Previous song or set",toggleChords:"Toggle chord display",changeFontSize:"Decrease/increase font size",fontSize:"Font size",small:"Small",medium:"Medium",large:"Large",priv:"Private",pub:"Public",language:"Language",visibility:"Visibility",toggleFullscreen:"Toggle fullscreen",toggleInfo:"Toggle song info",toggleHelp:"Toggle help (this screen)",toggleSettings:"Toggle settings",esc:"Cancel actions, close modal windows",checkBody:"Please check the body of the song.",sharedSet:"A new set has been shared with you!",checkEmail:"Please check your email.",invalidCredentials:"Invalid credentials!",SPInvalidData:"The data you submitted was invalid.",SPOperationNotPermitted:"You are trying to perform an illegal operation.",SPInvalidQuery:""},b.forEach(function(a){b[a.code]=a}),a}),app.factory("md5",function(){function a(a,b){var g=a[0],h=a[1],i=a[2],j=a[3];g=c(g,h,i,j,b[0],7,-680876936),j=c(j,g,h,i,b[1],12,-389564586),i=c(i,j,g,h,b[2],17,606105819),h=c(h,i,j,g,b[3],22,-1044525330),g=c(g,h,i,j,b[4],7,-176418897),j=c(j,g,h,i,b[5],12,1200080426),i=c(i,j,g,h,b[6],17,-1473231341),h=c(h,i,j,g,b[7],22,-45705983),g=c(g,h,i,j,b[8],7,1770035416),j=c(j,g,h,i,b[9],12,-1958414417),i=c(i,j,g,h,b[10],17,-42063),h=c(h,i,j,g,b[11],22,-1990404162),g=c(g,h,i,j,b[12],7,1804603682),j=c(j,g,h,i,b[13],12,-40341101),i=c(i,j,g,h,b[14],17,-1502002290),h=c(h,i,j,g,b[15],22,1236535329),g=d(g,h,i,j,b[1],5,-165796510),j=d(j,g,h,i,b[6],9,-1069501632),i=d(i,j,g,h,b[11],14,643717713),h=d(h,i,j,g,b[0],20,-373897302),g=d(g,h,i,j,b[5],5,-701558691),j=d(j,g,h,i,b[10],9,38016083),i=d(i,j,g,h,b[15],14,-660478335),h=d(h,i,j,g,b[4],20,-405537848),g=d(g,h,i,j,b[9],5,568446438),j=d(j,g,h,i,b[14],9,-1019803690),i=d(i,j,g,h,b[3],14,-187363961),h=d(h,i,j,g,b[8],20,1163531501),g=d(g,h,i,j,b[13],5,-1444681467),j=d(j,g,h,i,b[2],9,-51403784),i=d(i,j,g,h,b[7],14,1735328473),h=d(h,i,j,g,b[12],20,-1926607734),g=e(g,h,i,j,b[5],4,-378558),j=e(j,g,h,i,b[8],11,-2022574463),i=e(i,j,g,h,b[11],16,1839030562),h=e(h,i,j,g,b[14],23,-35309556),g=e(g,h,i,j,b[1],4,-1530992060),j=e(j,g,h,i,b[4],11,1272893353),i=e(i,j,g,h,b[7],16,-155497632),h=e(h,i,j,g,b[10],23,-1094730640),g=e(g,h,i,j,b[13],4,681279174),j=e(j,g,h,i,b[0],11,-358537222),i=e(i,j,g,h,b[3],16,-722521979),h=e(h,i,j,g,b[6],23,76029189),g=e(g,h,i,j,b[9],4,-640364487),j=e(j,g,h,i,b[12],11,-421815835),i=e(i,j,g,h,b[15],16,530742520),h=e(h,i,j,g,b[2],23,-995338651),g=f(g,h,i,j,b[0],6,-198630844),j=f(j,g,h,i,b[7],10,1126891415),i=f(i,j,g,h,b[14],15,-1416354905),h=f(h,i,j,g,b[5],21,-57434055),g=f(g,h,i,j,b[12],6,1700485571),j=f(j,g,h,i,b[3],10,-1894986606),i=f(i,j,g,h,b[10],15,-1051523),h=f(h,i,j,g,b[1],21,-2054922799),g=f(g,h,i,j,b[8],6,1873313359),j=f(j,g,h,i,b[15],10,-30611744),i=f(i,j,g,h,b[6],15,-1560198380),h=f(h,i,j,g,b[13],21,1309151649),g=f(g,h,i,j,b[4],6,-145523070),j=f(j,g,h,i,b[11],10,-1120210379),i=f(i,j,g,h,b[2],15,718787259),h=f(h,i,j,g,b[9],21,-343485551),a[0]=k(g,a[0]),a[1]=k(h,a[1]),a[2]=k(i,a[2]),a[3]=k(j,a[3])}function b(a,b,c,d,e,f){return b=k(k(b,a),k(d,f)),k(b<<e|b>>>32-e,c)}function c(a,c,d,e,f,g,h){return b(c&d|~c&e,a,c,f,g,h)}function d(a,c,d,e,f,g,h){return b(c&e|d&~e,a,c,f,g,h)}function e(a,c,d,e,f,g,h){return b(c^d^e,a,c,f,g,h)}function f(a,c,d,e,f,g,h){return b(d^(c|~e),a,c,f,g,h)}function g(b){var c,d=b.length,e=[1732584193,-271733879,-1732584194,271733878];for(c=64;c<=b.length;c+=64)a(e,h(b.substring(c-64,c)));b=b.substring(c-64);var f=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(c=0;c<b.length;c++)f[c>>2]|=b.charCodeAt(c)<<(c%4<<3);if(f[c>>2]|=128<<(c%4<<3),c>55)for(a(e,f),c=0;16>c;c++)f[c]=0;return f[14]=8*d,a(e,f),e}function h(a){var b,c=[];for(b=0;64>b;b+=4)c[b>>2]=a.charCodeAt(b)+(a.charCodeAt(b+1)<<8)+(a.charCodeAt(b+2)<<16)+(a.charCodeAt(b+3)<<24);return c}function i(a){for(var b="",c=0;4>c;c++)b+=m[a>>8*c+4&15]+m[a>>8*c&15];return b}function j(a){for(var b=0;b<a.length;b++)a[b]=i(a[b]);return a.join("")}function k(a,b){return a+b&4294967295}function l(a){return j(g(a||""))}var m="0123456789abcdef".split("");return l}),app.factory("modal",["$rootScope","$location","$routeParams","transitioner","$timeout",function(a,b,c,d,e){function f(a){b.search("modal",a||null)}var g=function(b){return a.modalClass?(a.modalClass="",d.apply("modal",function(){f(),b!=c.modal&&e(function(){f(b)})})):b&&f(b),!0};return g.isOn=function(b){return b?a.modalClass===b:a.modalClass},g}]),app.factory("notifier",function(){var a,b={title:"",icon:"info",delay:5e3},c=[],d=Object.keys;return{setCallback:function(b){return a=b,this},notify:function(e){return d(b).forEach(function(a){e[a]||(e[a]=b[a])}),c.push(e),a&&a(e),this},get:function(){return c}}}),app.factory("parse",["$window",function(){function a(a){var b=this;b.pos=b.start=0,b.string=a}return a.prototype={eof:function(){return this.pos>=this.string.length},sof:function(){return!this.pos},eol:function(){return this.pos>=this.string.length||"\n"==this.string.charAt(this.pos)},sol:function(){return!this.pos||"\n"==this.string.charAt(this.pos-1)},peek:function(){return this.string.charAt(this.pos)||null},next:function(){return this.pos<this.string.length&&this.string.charAt(this.pos++)},eat:function(a){var b,c=this.string.charAt(this.pos);return b="string"==typeof a?c==a:c&&(a.test?a.test(c):a(c)),b?(++this.pos,c):void 0},eatWhile:function(a){for(var b=this.pos;this.eat(a););return this.pos>b},eatSpace:function(){for(var a=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>a},skip:function(){this.pos=this.string.length},skipTo:function(a){var b=this.string.indexOf(a,this.pos);return~b?(this.pos=b,!0):void 0},skipLine:function(){return this.skipTo("\n")&&this.pos<this.string.length&&++this.pos},backUp:function(a){this.pos-=a},column:function(){return this.start},match:function(a,b){if("string"!=typeof a){var c=this.string.slice(this.pos).match(a);return c&&b!==!1&&(this.pos+=c[0].length),c}return this.string.indexOf(a,this.pos)==this.pos?(b!==!1&&(this.pos+=a.length),!0):void 0},current:function(){return this.string.slice(this.start,this.pos)}},function(b,c,d){var e,f,g=c.startState()||!0;for(e=new a(b);!e.eof();)f=c.token(e,g),d(e.current(),f),e.start=e.pos}}]),function(){var a=navigator.userAgent,b={},c={};window.location.search.substring(1).split("&").forEach(function(a){a=a.split("="),c[decodeURIComponent(a[0])]=decodeURIComponent(a[1])}),c.android?(b.name="android",b.version=c.android,b.native=!0):c.ios?(b.name="ios",b.version=c.ios,b.native=!0):/AppleWebKit/.test(a)&&/Mobile\/\w+/.test(a)?b.name="ios":~a.toLowerCase().indexOf("firefox")&&(b.name="ff"),b.name&&(document.documentElement.className+=" "+b.name),app.constant("platform",b)}(window),app.factory("settings",["util",function(){var a={},b=function(b,c){a[b]=c};return{settings:a,set:b,toggle:function(c){b(c,!a[c])}}}]),app.factory("touch",["$window","$timeout","util",function(a,b){function c(a){return s&&(a=a.touches[0]||a.changedTouches[0]),{x:a.pageX,y:a.pageY}}function d(a){var b=c(a);return b.dx=b.x-p.x,b.dy=b.y-p.y,b}function e(a,b){return x(w(b.x-a.x,2)+w(b.y-a.y,2))}function f(a){m=!0,p=c(a),n=a.target,q=b(function(){i("hold",p,a),o=!0},1e3)}function g(a){m&&(o?i("drag",d(a),a):b.cancel(q))}function h(a){m&&(b.cancel(q),o?i("release",d(a),a):e(c(a),p)<10&&i("tap",a),n=m=o=!1)}function i(a,b,c){for(var d,e,f=n;f&&f!=t&&(d=f.parentNode,e=u.indexOf(f),-1==e||!v[e][a]||!1!==v[e][a](c,b));)f=d}var j,k,l,m,n,o,p,q,r={},s="ontouchstart"in a,t=a.document,u=[],v=[],w=Math.pow,x=Math.sqrt;return s?(j="touchstart",k="touchmove",l="touchend"):(j="mousedown",k="mousemove",l="mouseup"),t.addEventListener(j,f,!0),t.addEventListener(k,g,!0),t.addEventListener(l,h,!0),["tap","hold","drag","release"].forEach(function(a){r[a]=function(b,c){b.length&&(b=b[0]);var d=u.indexOf(b);-1==d&&(d=u.push(b)-1,v[d]={}),v[d][a]=c}}),r}]),app.factory("transitioner",["$rootScope","$document","util",function(a,b,c){function d(){var a,c=b[0].createElement("dummy"),d={transition:"transitionend",OTransition:"oTransitionEnd",MSTransition:"msTransitionEnd",MozTransition:"transitionend",WebkitTransition:"webkitTransitionEnd"};for(a in d)if(void 0!==c.style[a])return d[a]}var e=d(),f={},g=[];return e&&b.bind(e,function(b){var c=b.target.id;if(c&&c in f){for(;f[c].length;)a.$apply(f[c].shift());delete f[c]}}),{apply:function(a,b,c){return e?(a in f&&!c||(f[a]=[]),void f[a].push(b)):void b()},after:function(a,b,d){a[0]&&(a=a[0]),a.id||(a.id=c.generateId()),this.apply(a.id||g.push(a)-1,b,d)}}}]),app.factory("transposer",function(){var a=/C##|D##|E##|F##|G##|A##|B##|Cbb|Dbb|Ebb|Fbb|Gbb|Abb|Bbb|C#|D#|E#|F#|G#|A#|B#|Cb|Db|Eb|Fb|Gb|Ab|Bb|C|D|E|F|G|A|B/g,b=[["C","C#","Db","D","Eb","E","F","F#","Gb","G","Ab","A","Bb","B","Cb"],["Am","A#m","Bbm","Bm","Cm","C#m","Dm","D#m","Ebm","Em","Fm","F#m","Gm","G#m","Abm"]],c=[["C","C#","Db","D","D#","Eb","E","E#","Fb","F","F#","Gb","G","G#","Ab","A","A#","Bb","B","B#","Cb"],["C#","C##","D","D#","D##","E","E#","E##","F","F#","F##","G","G#","G##","A","A#","A##","B","B#","B##","C"],["Db","D","Ebb","Eb","E","Fb","F","F#","Gbb","Gb","G","Abb","Ab","A","Bbb","Bb","B","Cb","C","C#","Dbb"],["D","D#","Eb","E","E#","F","F#","F##","G#","G","G#","Ab","A","A#","Bb","B","B#","C","C#","C##","Db"],["Eb","E","Fb","F","F#","Gb","G","G#","Abb","Ab","A","Bbb","Bb","B","Cb","C","C#","Db","D","D#","Ebb"],["E","E#","F","F#","F##","G","G#","G##","Ab","A","A#","Bb","B","B#","C","C#","C##","D","D#","D##","Eb"],["F","F#","Gb","G","G#","Ab","A","A#","Bbb","Bb","B","Cb","C","C#","Db","D","D#","Eb","E","E#","Fb"],["F#","F##","G","G#","G##","A","A#","A##","Bb","B","B#","C","C#","C##","D","D#","D##","E","E#","E##","F"],["Gb","G","Abb","Ab","A","Bbb","Bb","B","Cbb","Cb","C","Dbb","Db","D","Ebb","Eb","E","Fb","F","F#","Gbb"],["G","G#","Ab","A","A#","Bb","B","B#","Cb","C","C#","Db","D","D#","Eb","E","E#","F","F#","F##","Gb"],["Ab","A","Bbb","Bb","B","Cb","C","C#","Dbb","Db","D","Ebb","Eb","E","Fb","F","F#","Gb","G","G#","Abb"],["A","A#","Bb","B","B#","C","C#","C##","Db","D","D#","Eb","E","E#","F","F#","F##","G","G#","G##","Ab"],["Bb","B","Cb","C","C#","Db","D","D#","Ebb","Eb","E","Fb","F","F#","Gb","G","G#","Ab","A","A#","Bbb"],["B","B#","C","C#","C##","D","D#","D##","Eb","E","E#","F","F#","F##","G","G#","G##","A","A#","A##","Bb"],["Cb","C","Dbb","Db","D","Ebb","Eb","E","Fbb","Fb","F","Gbb","Gb","G","Abb","Ab","A","Bbb","Bb","B","Cbb"]];return{getKeys:function(a){return b[Number(a)]},getAllKeys:function(){return b[0].concat(b[1])},getScale:function(a){return c[b["m"===a.slice(-1)?1:0].indexOf(a)]},transpose:function(d,e,f){var g="m"===e.slice(-1)?1:0,h=b[g].indexOf(e),i=b[g].indexOf(f);return d.replace(a,function(a){return c[i][c[h].indexOf(a)]})}}}),function(a,b){app.service("util",["$window",function(c){var d=this,e=c.document,f=c.setTimeout,g=c.clearTimeout;d.toArray=function(a){return a&&a.forEach?a:[a]},d.list=function(a,b){var c=a.length;return d.toArray(b).forEach(function(b){var c=a.indexOf(b);~c||a.push(b)}),a.length-c},d.unlist=function(a,b){var c=a.indexOf(b);return~c&&a.splice(c,1),a.length},d.move=function(a,b,c){return a.splice(c,0,a.splice(b,1)[0]),a},d.pad=function(a,b){return Array(a+1).join(b||" ")},d.buildUrl=function(c,e){if(!e)return c;var f=[];return a.forEach(e,function(c,e){null!==c&&c!==b&&(a.isObject(c)&&(c=d.toJson(c)),f.push(encodeURIComponent(e)+"="+encodeURIComponent(c)))}),c+(-1==c.indexOf("?")?"?":"&")+f.join("&")},d.element=function(b){return a.isString(b)&&(b=e.getElementById(b)),a.element(b)},d.randomHex=function(a){for(var b="";a>0;)b+=Math.floor(Math.random()*Math.pow(10,16)).toString(16).substr(0,8>a?a:8),a-=8;return b},d.generateId=function(){return Math.floor(Date.now()/1e3).toString(16)+d.randomHex(16)},d.throttle=function(a,b){var c=null;return function(){var d=this,e=arguments;g(c),c=f(function(){a.apply(d,e),c=null},b)}},d.keys=Object.keys,d.toJson=c.JSON.stringify,["copy","extend","forEach","identity","fromJson","isObject","isString","isArray","lowercase","noop"].forEach(function(b){d[b]=a[b]})}])}(angular);</script>