From bb02f76a794eebfca990244e9e3ca48512dfd1aa Mon Sep 17 00:00:00 2001 From: Matthieu Tudury Date: Sat, 21 Nov 2020 23:43:41 +0100 Subject: [PATCH] v0.6 --- Dockerfile | 2 ++ README.md | 2 +- docker-compose.yaml | 2 +- static/application.css | 40 +++++++++++++++++++++++---- static/application.js | 56 ++++++++++++++++++++++++++++++++------ static/application.min.js | 2 +- static/function-icons.png | Bin 6237 -> 13648 bytes static/index.html | 5 ++-- 8 files changed, 90 insertions(+), 19 deletions(-) diff --git a/Dockerfile b/Dockerfile index 7b7d5ac..0efa8ea 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,6 +22,8 @@ ENV HOST=0.0.0.0\ USER node:node +VOLUME /usr/src/app/data + EXPOSE ${PORT} STOPSIGNAL SIGINT ENTRYPOINT [ "bash", "docker-entrypoint.sh" ] diff --git a/README.md b/README.md index 34fcab2..e0bb352 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Test it in seconds : ```bash -docker run --rm -d -p 7777:7777 hastepad:0.5 +docker run --rm -d -p 7777:7777 mtudury/hastepad:0.6 ``` Open your browser and type url : http://127.0.0.1:7777/ diff --git a/docker-compose.yaml b/docker-compose.yaml index 352ee74..f870bee 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -2,7 +2,7 @@ version: '3.6' services: haste-server: build: . - image: hastepad:0.5 + image: hastepad:0.6 ports: - 7777:7777 volumes: diff --git a/static/application.css b/static/application.css index 8bd3131..68b4fc4 100644 --- a/static/application.css +++ b/static/application.css @@ -133,6 +133,30 @@ textarea { font-weight: normal; } +#box4 ul { + margin-block-start: 3px; + margin-block-end: 3px; + padding-inline-start: 0; + background: #00222b; +} + +#box4 li { + display: block; + font-family: monospace; +} + +#box4 a { + display:block; + padding-left: 10px; + text-decoration: none; + color: #fff; +} + +#box4 a:hover { + background: #173e48; + font-weight: bold; +} + #box2 .function.save { background-position: -5px top; } #box2 .function.enabled.save { background-position: -5px center; } #box2 .function.enabled.save:hover { background-position: -5px bottom; } @@ -141,17 +165,21 @@ textarea { #box2 .function.enabled.new { background-position: -42px center; } #box2 .function.enabled.new:hover { background-position: -42px bottom; } -#box2 .function.duplicate { background-position: -79px top; } -#box2 .function.enabled.duplicate { background-position: -79px center; } -#box2 .function.enabled.duplicate:hover { background-position: -79px bottom; } +#box2 .function.edit { background-position: -79px top; } +#box2 .function.enabled.edit { background-position: -79px center; } +#box2 .function.enabled.edit:hover { background-position: -79px bottom; } #box2 .function.raw { background-position: -116px top; } #box2 .function.enabled.raw { background-position: -116px center; } #box2 .function.enabled.raw:hover { background-position: -116px bottom; } -#box2 .function.twitter { background-position: -153px top; } -#box2 .function.enabled.twitter { background-position: -153px center; } -#box2 .function.enabled.twitter:hover { background-position: -153px bottom; } +#box2 .function.duplicate { background-position: -153px top; } +#box2 .function.enabled.duplicate { background-position: -153px center; } +#box2 .function.enabled.duplicate:hover { background-position: -153px bottom; } + +#box2 .function.delete { background-position: -190px top; } +#box2 .function.enabled.delete { background-position: -190px center; } +#box2 .function.enabled.delete:hover { background-position: -190px bottom; } #box2 .button-picture{ border-width: 0; font-size: inherit; } #messages { diff --git a/static/application.js b/static/application.js index 1959d7c..ffe7dfc 100644 --- a/static/application.js +++ b/static/application.js @@ -86,6 +86,28 @@ haste_document.prototype.save = function(key, data, callback) { }); }; +// Save this document to the server and lock it here +haste_document.prototype.deleteDocument = function(key, callback) { + if (!this.locked) { + return false; + } + var _this = this; + $.ajax('/documents/' + key, { + type: 'delete', + success: function(res) { + callback(null, res); + }, + error: function(res) { + try { + callback($.parseJSON(res.responseText)); + } + catch (e) { + callback({message: 'Something went wrong!'}); + } + } + }); +}; + // get a valid key from server haste_document.prototype.getkey = function(callback) { $.ajax('/key/', { @@ -143,12 +165,12 @@ haste.prototype.lightKey = function() { // Show the full key haste.prototype.fullKey = function() { - this.configureKey(['new', 'duplicate', 'twitter', 'raw']); + this.configureKey(['new', 'duplicate', 'edit', 'raw', 'delete']); }; // Show all the keys haste.prototype.allKey = function() { - this.configureKey(['new', 'save', 'duplicate', 'twitter', 'raw']); + this.configureKey(['new', 'save', 'duplicate', 'edit', 'raw', 'delete']); }; // Set the key up for certain things to be enabled @@ -323,7 +345,7 @@ haste.prototype.unlockDocument = function() { var _this = this; _this.$textarea.val(_this.$code.text()).show().focus(); _this.$box.hide(); - _this.allKey(); + _this.lightKey(); _this.removeLineNumbers(); _this.doc.locked = false; }; @@ -378,16 +400,31 @@ haste.prototype.configureButtons = function() { } }, { - $where: $('#box2 .twitter'), + $where: $('#box2 .edit'), label: 'Edit', shortcut: function(evt) { - return _this.options.twitter && _this.doc.locked && evt.shiftKey && evt.ctrlKey && evt.keyCode == 84; + return _this.doc.locked && evt.shiftKey && evt.ctrlKey && evt.keyCode == 84; }, shortcutDescription: 'control + shift + t', action: function() { - //window.open('https://twitter.com/share?url=' + encodeURI(window.location.href)); _this.unlockDocument(); } + }, + { + $where: $('#box2 .delete'), + label: 'Delete', + shortcut: function(evt) { + return false; + }, + shortcutDescription: 'none', + action: function() { + _this.doc.deleteDocument(_this.getCurrentKey(), function () { + _this.$box.html(''); + _this.removeLineNumbers(); + _this.showMessage("Deleted"); + _this.updateList(); + }); + } } ]; for (var i = 0; i < this.buttons.length; i++) { @@ -422,8 +459,11 @@ haste.prototype.updateList = function () { _this.getList(function (lst) { if (lst) { var lis = ""; + var cnt = 0; lst.forEach(function (file) { - lis+= '
  • '+file+'
  • '; + if (cnt < 150) + lis+= '
  • '+file+'
  • '; + cnt++; }); $('#list').html(lis); } @@ -461,7 +501,7 @@ haste.prototype.autosave = function() { }); _this.doc.changed = false; } - window.setTimeout(cycle, 15000); + window.setTimeout(cycle, 5000); }; window.setTimeout(cycle, 5000); diff --git a/static/application.min.js b/static/application.min.js index 4119164..d30d4cd 100644 --- a/static/application.min.js +++ b/static/application.min.js @@ -1 +1 @@ -var haste_document=function(){this.locked=!1};haste_document.prototype.htmlEscape=function(t){return t.replace(/&/g,"&").replace(/>/g,">").replace(/'+t+"");$("#messages").prepend(o),setTimeout(function(){o.slideUp("fast",function(){$(this).remove()})},3e3)},haste.prototype.lightKey=function(){this.configureKey(["new","save"])},haste.prototype.fullKey=function(){this.configureKey(["new","duplicate","twitter","raw"])},haste.prototype.allKey=function(){this.configureKey(["new","save","duplicate","twitter","raw"])},haste.prototype.configureKey=function(t){var e,o=0;$("#box2 .function").each(function(){for(e=$(this),o=0;o";$("#linenos").html(e)},haste.prototype.removeLineNumbers=function(){$("#linenos").html(">")},haste.prototype.loadDocument=function(t){var e=t.split(".",2),o=this;o.doc=new haste_document,o.doc.load(t,function(t){t?(o.$code.html(t.value),o.setTitle(t.key),o.fullKey(),o.$textarea.val("").hide(),o.$box.show().focus(),o.addLineNumbers(t.lineCount)):o.newDocument()},this.lookupTypeByExtension(e[1])),this.updateList()},haste.prototype.duplicateDocument=function(){var t=this;if(t.doc.locked){var e=t.doc.data;t.newDocument(!0,function(){t.$textarea.val(e)})}},haste.prototype.lockDocument=function(){var t=this;this.doc.save(this.getCurrentKey(),this.$textarea.val(),function(e,o){e?t.showMessage(e.message,"error"):o&&(t.doc.locked=!0,t.$code.html(o.value),t.setTitle(o.key),t.fullKey(),t.$textarea.val("").hide(),t.$box.show().focus(),t.addLineNumbers(o.lineCount))})},haste.prototype.unlockDocument=function(){var t=this;t.$textarea.val(t.$code.text()).show().focus(),t.$box.hide(),t.allKey(),t.removeLineNumbers(),t.doc.locked=!1},haste.prototype.configureButtons=function(){var t=this;this.buttons=[{$where:$("#box2 .save"),label:"Save",shortcutDescription:"control + s",shortcut:function(t){return t.ctrlKey&&83===t.keyCode},action:function(){""!==t.$textarea.val().replace(/^\s+|\s+$/g,"")&&t.lockDocument()}},{$where:$("#box2 .new"),label:"New",shortcut:function(t){return t.ctrlKey&&78===t.keyCode},shortcutDescription:"control + n",action:function(){t.newDocument(!0)}},{$where:$("#box2 .duplicate"),label:"Duplicate & Edit",shortcut:function(e){return t.doc.locked&&e.ctrlKey&&68===e.keyCode},shortcutDescription:"control + d",action:function(){t.duplicateDocument()}},{$where:$("#box2 .raw"),label:"Just Text",shortcut:function(t){return t.ctrlKey&&t.shiftKey&&82===t.keyCode},shortcutDescription:"control + shift + r",action:function(){window.location.href="/raw/"+t.doc.key}},{$where:$("#box2 .twitter"),label:"Edit",shortcut:function(e){return t.options.twitter&&t.doc.locked&&e.shiftKey&&e.ctrlKey&&84==e.keyCode},shortcutDescription:"control + shift + t",action:function(){t.unlockDocument()}}];for(var e=0;e'+t+""}),$("#list").html(e)}})},haste.prototype.configureShortcuts=function(){var t=this;$(document.body).keydown(function(e){for(var o,n=0;n/g,">").replace(/'+t+"");$("#messages").prepend(o),setTimeout(function(){o.slideUp("fast",function(){$(this).remove()})},3e3)},haste.prototype.lightKey=function(){this.configureKey(["new","save"])},haste.prototype.fullKey=function(){this.configureKey(["new","duplicate","edit","raw","delete"])},haste.prototype.allKey=function(){this.configureKey(["new","save","duplicate","edit","raw","delete"])},haste.prototype.configureKey=function(t){var e,o=0;$("#box2 .function").each(function(){for(e=$(this),o=0;o";$("#linenos").html(e)},haste.prototype.removeLineNumbers=function(){$("#linenos").html(">")},haste.prototype.loadDocument=function(t){var e=t.split(".",2),o=this;o.doc=new haste_document,o.doc.load(t,function(t){t?(o.$code.html(t.value),o.setTitle(t.key),o.fullKey(),o.$textarea.val("").hide(),o.$box.show().focus(),o.addLineNumbers(t.lineCount)):o.newDocument()},this.lookupTypeByExtension(e[1])),this.updateList()},haste.prototype.duplicateDocument=function(){var t=this;if(t.doc.locked){var e=t.doc.data;t.newDocument(!0,function(){t.$textarea.val(e)})}},haste.prototype.lockDocument=function(){var t=this;this.doc.save(this.getCurrentKey(),this.$textarea.val(),function(e,o){e?t.showMessage(e.message,"error"):o&&(t.doc.locked=!0,t.$code.html(o.value),t.setTitle(o.key),t.fullKey(),t.$textarea.val("").hide(),t.$box.show().focus(),t.addLineNumbers(o.lineCount))})},haste.prototype.unlockDocument=function(){var t=this;t.$textarea.val(t.$code.text()).show().focus(),t.$box.hide(),t.lightKey(),t.removeLineNumbers(),t.doc.locked=!1},haste.prototype.configureButtons=function(){var t=this;this.buttons=[{$where:$("#box2 .save"),label:"Save",shortcutDescription:"control + s",shortcut:function(t){return t.ctrlKey&&83===t.keyCode},action:function(){""!==t.$textarea.val().replace(/^\s+|\s+$/g,"")&&t.lockDocument()}},{$where:$("#box2 .new"),label:"New",shortcut:function(t){return t.ctrlKey&&78===t.keyCode},shortcutDescription:"control + n",action:function(){t.newDocument(!0)}},{$where:$("#box2 .duplicate"),label:"Duplicate & Edit",shortcut:function(e){return t.doc.locked&&e.ctrlKey&&68===e.keyCode},shortcutDescription:"control + d",action:function(){t.duplicateDocument()}},{$where:$("#box2 .raw"),label:"Just Text",shortcut:function(t){return t.ctrlKey&&t.shiftKey&&82===t.keyCode},shortcutDescription:"control + shift + r",action:function(){window.location.href="/raw/"+t.doc.key}},{$where:$("#box2 .edit"),label:"Edit",shortcut:function(e){return t.doc.locked&&e.shiftKey&&e.ctrlKey&&84==e.keyCode},shortcutDescription:"control + shift + t",action:function(){t.unlockDocument()}},{$where:$("#box2 .delete"),label:"Delete",shortcut:function(t){return!1},shortcutDescription:"none",action:function(){t.doc.deleteDocument(t.getCurrentKey(),function(){t.$box.html(""),t.removeLineNumbers(),t.showMessage("Deleted"),t.updateList()})}}];for(var e=0;e'+t+""),o++}),$("#list").html(e)}})},haste.prototype.configureShortcuts=function(){var t=this;$(document.body).keydown(function(e){for(var o,n=0;nNCF_o{+{jbd#7W(Ub@Eyeu0KlgAR?~7*G4>>J za&fe3z?jqByiai?zj z_v=G&JYTApT)yG>i}%O&&$pYf*A}IW0Kd(}hZco5o#VfKh6q&p+_(Mz;BRdUF$Jf? z>$ddc^S?>FSo0bhR`gKz^gb_dxl-c&^V5)oGS|J9%cfx7R&L=kw$LcK-C@qy5TVgxYI>9`L?HKfe|A z(e}Ra`)~JA)9=J+a{U8a)veZN|J~4Jx3Z_!KFfpg=Z>D~Da*TlW~P?aQ#b!xS(L<> zt%QDL@^z=pJ@{x;SH6Z@+&!`@@7hv)A3aQp1TTU9*u~O351R!u<&J^*8y|)p{kAi2 zy=vzJA}@1925bYOfLFI(ft$~d_i>S@%1KcrHd?=DOs+~eIMLL3PXlqdzK^kr?sw>? zpVz(q<@J&9YqGAU!TrLAuW6mmpMpL^~V;QP+n7_pJv!52O4G0+h^PmlALQ4A*zQcc~(U?j@xLdL+ z++on>Xfj#Mawnin)vHcXiFUGCP;+h3v8kzfG4LiRrRR8*sF1|Joa%{8Cq94s7cdZ`>z~darxCgl7x$OF(zt| zu-r=>%Idg0>jm2-t}@5w&_|AmGFr@Tmyt}K}(^ie{yZ%9r z%+pqRj_Qej<@(myV|L}m%{E6jxHbGJEo>&Ppuu+&g5kr+e{x~wA!`h`ZwkRXD+9t2 z#z?FNf~j~`#cqGI(-%$Rx^;sb-m2+a2y8N~2~DzpH1y(A&$OG`ybUI!}Dtn!uZbauZCr%yG^EufXc>;#+B3+ zSBUEeX`A^pl2D$jDYwaYVxhsbYSi&5yMXiA$4R^PdwppU^HHsJXd_b|-uneUd3P^3 z?G1M<@`vxqA_B3y>AKz|md@(EWkw-rkCDq-6LDRof7=E*WTzJLt@^b!t*gT0R$6K@ zuk0C7#Y|_}aifSH!L^6Lr(GRqC#4bUh6)li$<;gJPmHfsyWqKLtPbG3i!aSBng485 z+oNpm$O;gMFmHs~#V*vLkJ}HR?;$0|QDWWe>TsT8-}TI(-NgMJr|V#s+_~iX)7j2g z!?OX`J*+>~+(Nt6&3<7_--bjUx|%L1N66?^$QTl`8f*5TqD?2+-$S^5C{hYFK7(JQ zTp`XJE@0J;ac6?pV!TRJB2^>S<9X65!-c8bzuT({b}(uF9ZG7e~*g6v1p z(0VC8bLB&Jn7W=(@(BFpgVudEwg#p&tFYvAKd{k!5s0qa3aDh?Ca_M~MCVh^G>zYW z=Og_l4)DqQo@GfhtWIr>S<8wB1&Q2up1VW%IM3uY&-;8TJC@FUeCExuuxmDQ{1mIz z8~hW%%FFHlFe>K*!%_ti3#KN~Q2K%^yAp`4-sQ z0*Fn_TGc`i8BI#LokMO&)qAj}Z&5ryb9erB^i*TLk)fnYwHo}m>l~0GK9#WS_i5I* z52|223HYSPjiIlWk|B2g^gfR864OncUUt z@cm(tl2jO;A0c``}EO$8>D}-<(eCTxi*b;opD*)6p?Xx=@V!%_XN*1c$llBYd zwTb|HolTGS1c6mS(MIR3PPLzc)46qJ1V=yOY5oOVLfQPr8J$$i`w`@9tC59gayC$7 zr3e9h4m@^7auza+Mdp1UG7KN{$!*spam%(k!R)L@XZFdWwbx3H32KsXT(|w@PG!_r z)WBraxI{A5ki8*7?iBe$TCY&tbgGIK5=lY}NvV+)Z%P%W27tdn&Oc=#YPMt`hLh;J zF^LP0z4D5T=#u$;hWF25o+)mgWpGDhXlxOyTY*_&uI@L4fl2&`*|sy2XmS>IDM1J% zE`^1`+bRr2m|bN^k}bc^N__hP{#jh;U|yUl~C{`v}PhUky;Y9D8eRRrRD(LV*Zmx*N{0OUZ2A znvnz0#t@8WNb$7~R3M3fp%r(+df9KoB2jr#B5B3f2<-u^B)-FvS6x#kJ6g@pqh-YW zy{~17&9c<0OJpFSCTo)!PeZj|z@ZIa4_-bgSxoRx;z_Oc^`;RTg$0h!i0o>9P*Vot zLxQASGnYzh2h1deu0rk7_6&@$7|V1p_+byx2Au@$8{tUl1AZ%41>sr&ZH2qY9_U)b zstbJa{_tv+rXi^W{(!;9ayXC48h#G_Zps3AREXk{n>%Ha41JAgw5!k`n5TY1y}Ind zX6zvPuYXF6UfC)wS3!KYk?K`;oShn@QY;abrhGU3biNtYEE4)OV!aQeqaW%zMJnZi z>A*1NOnM^i2dhx*8MqM*IOL0vyjq4U_EK`5gxQQ*wtF9BV59{s?5_?|cgUJvP7!`3 ziWnXWb_%nTQ!~#ywGO!MU-(5ECe~I)&Cs_LQsPWwD1;9V=qybMqbw(Bh-nG4_7V^;_r?2fdT+ z&bC{bzBW*-gepTF3;C^Q%!a~QPp0527inP%d`S#g3f#y0O!jW8(1<@&!@<}fc}0SKS*v?h zxfHiZ{uu>A7tY2@OLBws^xqps!WM@B+#rIM{BScj=<`3C5>YQ}XtaNVDjZKm_Z(3X z&3FK;jeT-rV>E6t#B7u5-YqP>|8`8F=7D{SAbdWvOCN-f^SLtESA?rTcJ_HMlYG8?Heh9E@!k@d=MN^`y>U0j8c2_s-Il@>%=T5l7>FPwCW;BUsbKwkmZ9C%&k(zX|RYkO9+(uxy&J<;6KOu*gi+d4jkEvGUT*F z1e(@O)?ae#Nji;m;*W!{l$fe;|FnR)~{tWA&$w1%ad&KFPoCui0 zR^I8pSF`kMp+wFND9%&k((5q>QfP-M98h~Bbw(Hde1~}{c{08NWXUY{F|_e%Tg&#K zAi1vbV9@gxaF>JGEt*%%wgSh8(Agu)OOp;D2u?rP+nfQ~g`e*Iv4b)l8Ci-Qy) zfyR?%ihs-q@ z9#vEGYeo$J_*}09T&rj{;0Cl}hw^Ol&XXb(&;+$&gkax5-W5N}1!OoIfNc?Jn?#cf z)50AFiiGead2ii{JB!VNxehvc0{$Ng1+7y4(Sm?W_czkgz3c)7xA*6Rti~0F10qmcySV9zs4mCIY!b zYJ37bDuHN8*hVh*eX?fnUzD+#NpQGvqCo@1;5GqWc6x(7#ZS5s*sFhT1K|0^wvJXy ziV!1*fR?!DWau0ErRE)Q3Z`mZ=byEY0WzH2r!mC45j=_MH$xV|1_s_SBv#A|?skV! z1O70-aP3^GAFPAr^VKK|b{Q28g3OB)cUD3MF1P|`HXJB$Qp<{=9>MYh z&5EU&>PfxGPbc`2Js@LzU(VS~mHGVL6dS_S(QWoK4e`@cg5N1pq6%4OGGr4L8}s>x z#f;f*@yj4=Jvv(_XBeU?a6KKG^~(UDu8D~Ya=cigLDSNegT3K;MicvU8?!cEvpRJI`X ze_N7bl`9{)?`*ABWm(5b&LJmDx1e@QinUO*fqvPxAu?SN#NW+@+TIj_ z9?J{Zxxxh8J-ol2E=PQ^^+cdUIZWA=ow1l1QmXy~sdfoJPMVvSrA^b`R&_+~4AmDo`vFp&&cIxvS{DIi@ZZJ)h zK@DpQds>J9p~|c0AA*0Jx7pO1uCv+5p%+mJe!U|5fi+N<;QeiD`I!-m^w^B`fC9au z4y|9MH11}UtK@cc;@0n6NR3*`lOcYqG*OnVmt7ePwhYeV)0jGE3^+*lqkjvlx|K@xJ@{-y@gk*(nR*I|zfjXy^3w2R%LVZO5YlnVqBS;a&tW z_k^SSvY}2^|3?PTJgL`tr9e7OS3+5s2jn1LU5NLqW0k_VcxpvX;0R^-aRr~^5TRUN z3!qTIHxuP>D(D~2{lN}?NS%l?T5`A|xs-v(8D1vCnhjOa7H>W>HU?5mqj%J-}d%*ncv(IgRpS!U}wEt zumI)3=oM07MzNiJ7NPHAFsrfp8@bQ-8jzUv|Bi-qC)I0pTb{Q$Q4-JE-)JLIIUX=$ z*(L5~9h$M{-9(FOn8nEF#cKm2w*vn;;k(ssO2gKxdr~pdV*IKUg(#St#T#F4h>xZo zed$wlK(xY!#4`=aNp>swG-lOL+Zu!lzLczBVCD;Hl}WYHc~jKmNi+%>>joAQCv-q* z?I4#CxeZGa=_v(ChE@vWiF@5@fQ?$M#MsBq^y{;`LN$CJDq-Q1nc|x7_Rt zW?BnEBb_{(@8wK;Lt)*INBGEuO_(w;;V;&%yYzf1BY>AyFNBUO?1z+uPc*oIPnQ=G6w+55&zG^0adG*%H0tpJzcAIsK`i z0o!;Vay5og^w8sry9KQNB3li4SYVVZ)(x^iw(p@AAXF1mflB$|7&c${qfYfqy+`3A zAs&$RCg{npie_Q>d;|c%^H__DDk)hxx;eU9IXaO@i;Di&4P*d7Dl#|CQ%!9dJAAs^ z)4Onz1(R0vsvC)6N&=T+>gM$!Esi`PETgs)g@b!!zyzYf7c+)9x}E72a-izfFsjO50sHn-SmsBi*;cF z2x)KV<36LHatH&TRUA(6I(!{Wl7O}2bH&-KYi!4xIp=C|LPnSaW~D4IcAdK3I?&1K z2%z0uL0Jhs-OlonC5zUjC5gi!3q!2aUWb43kv_kr>VgEH5Q`rC8a`4Dz4-w#+RFAG zz72y{Pz9#!fZM0umG3CvB($fxZy?R5!pI{^X_Aq8cGl6UDUL%It)bnZe}$hX*PQo@ zPcefh|7cJ)a+5)rW$?$loeguU^P#@p7SPFqg#;fzBR-wC4fFe1LXtr{u3kkEPO~Y_ zKO>7g?pE}`ICCYBZvUxbd>XIhH*+nMDdP)(*;KP8;1_`JFAD&RP{Gh$g_73?J3bkXx0?FQcPW#zpSh68F;LJ-H`%yN3M%cM< z!qP+e7W{Vy;oAL~gAZIV+!76liiTelhD(Y#fCML2ln5CTUo9GyC{sdgE!>%4uusJn zBu9Rwgo_C!E{RuouDn@(K!a`b!-l95Q$3a^$VT#^z@bP&nY~=micJU39@r}SRzN-* zd2Hu~)``9m;UH=#vLz8;yk*3Ki!T9V8hkS(W}L)o%Tk*0k)bj1bArSIkv)3Q1gjoe z3&xHlEfUKpy56T@xc;bKbjA5xmk{k&6#MYc-6Cf`J+NAIPfSm2&X8=-l zNnY&qVEPWhwf-~MJC}bRiTn&H7iu5uXh>`boe07X`VQ$1R-%*|^%{C`q~0#H3DynQ z4ZL&8a~y@}9Cb&ciIm8k$DHxp&pG}%dbZ4Jc@HYdWT^d%eX3jWThm)zxTuhZka$R4 zlWwtCvEKs;0|?SxC21wm`*fpxqcWq(Nf1f%Dqghqw4AhM3p^G06{;%zDot~k*6b%j zC*Mz0PKxI=OR3H4+1A*I+3Ye!GDX>N%!g=T#e;VxjFmZ*@oCa&_S6v7!%s!!%hHs3 ziyu`j&CJah&HK$=&1}u4N8)Bsvp6Qh(`4w2a|<>KyVF(ETod<3?2~O136ipt4au$; zrW2Xd98-H4KMewFw+j=B>QxIxcM{2Dlnq(6SaolJyOe_`lna!PvRblH={Z_1hHx5l zn()dx#com+iq;z1;;XXUqCe|y#Sg5pvZ9(~8f8Mqv{Px-qbiH(G+RU-a!%Ph88$-m zWa^5ZW-J#{7P=NgY}{==Z0=5ZPRAD!7IYWCS)+c(#fQVk!r#DW&#KG<%X-P0%zA3M z)fI9Z(?fNntYhlKKyam#xR1NhkeG#!)Ty`ujRskqP5vl zqy?pA-*DRcYGrRa+2+uY*Eri8*|ciOK2g9Hgj*Uz-)g0+`S+pqm;KhN_FuSjg_REr zN3(pBfCYb-iYb+;xv)}Gg+A>L1i)s@?M#mPnSZuElpD(Rs3s z_~z-NTSsV1`Aa#{P=4pQw>r*dS*~xahZ%QIM@aV!mkk>Z;S8M? zZ6I-8cN0|_^;CJQNr1m#_M;woB34h4Bn5Z>UbSC6F$ccmu54jB)6$>BG zk5rXbkWQ7J*W+~f@nqiU>0*DYCu20WlM=cRv9R=APe*T!HV=_GbUC>;DKA+d!#F`X zg|%_b;o)+T-B-}xlq#iztw~h~>qG7V&OJ0cv{*Y%`-iq;Q-71+J&X72p0_PHh}$1HTx?l1*k83O4xaDYQkGGsQht-sE?w?n zeJeZ74!wZ;`!-%Zj(iR}-@a&XnzuembUC^0x^2)0`@Kegj5UZ==Q(`YqhqbD{X4u~ zvfZ*|thds&?r@XHM^KGgeXG{F#(Lvdv*X{Mj*s&XQJ5T*<^{Utw1pnQ5q__>sjAv; zgWo;3sE0~Rg};z?kh-_ndhBh~>=>-yy)rz#_N7J=^Qf}R%8F$q$Fp`UjPDj2GE6yp zTt91@2FpupQpF9o3J?%>zmJzZIML0y%<_FD7y7sd{n$8lxz z7+;Ua%VWg)xKI8mJKgbRz0==k_2Lij_|-a593FAUcn|MS=7-JkH|?jRZ+2c0{#x%+ zr^*MWrNa+`XCLc4Cj2fI3x3U4(#Od#rqvBcy=MPzjk~UCU#t&8PQ~U+UiMFDrz;4i zHTVbu@@{Zq_39EUn zUF6zV6D(#92MqUc5;)ML%*b^v||6dIj+Fabo7)^lfC5U5dncmzS&U*GN*@Ner z8HBm*=$mD=4Y(fmE`8UlORiYGxp-H|&&9@uOS}mOeFC=9;*k-+QiX>wXHasG_&Cw_ zlNwd~$-vmApbfr{wChVfL9FKK*QHP|(;rBK6t;)E_x-~bmvp3}4M_IXLB$}7y*-Er znU@*^(NhvSYLa`v4eo>p~C5_@7M*PTF zFbj$W{|2G>)hj_|CC!|d2lmMITubG^w-Bj>i4Q5jai8C9{w`=W9_=oHz{8&t}OR@cPTQV%i0nFeD)diCV;@8(i zAToW8(-M@xa4c^_-9ZlzGCw7A8eQ~9zRV)u$7O;#uh1NO0m>8^nmNm_!?$3_t}+(I zkg5u>3VpklqB49gFrclICu17jNAU5(lv**%L0E^GU=eTt5S*soRta1zgA=g5^vP@! z8PV2DnR%i)1$PN*m~btIC27IPC5tJl$rPEY#Ch8NDv1PNYjU4u4noGb7@$-&6A`P3 zN%I+jO@LOgVskXGj-Cl+prHgy^W=UpVhkKtQDXyT90J~7eZJ_ez zA=UV`#9l4EYIW0t2D*s-&UCYldW~IA+s8_naKT=5KL;{!-uj?2$7&af@Z`NNKy|G* zpmkJG(s15ZXz=*x&O44AqYIOlLOQ>3vyr7T)FK0W;o06IOVgZhACNT42Urfw?2G=1cOARLpsdzu)*;DCaEJX-CPBR2Wl5lY(n>t8`h=U-G%7LV?&e1!*H12 zhJFlPSv$8$0I5SWltrO(Alm@xGH(Z8PFD}YaOoBvA^=`Ro?ljJjzuS>sV66p%e`Y< z2kvxKCpFB15M1D-bVXVP+bt=%$}e^;K~LrZ`Eo%eBhMH{f#ETtU!qNS9&*~{w)?W{ z4tVl4D$S{veD&T|RA`r`-jX~>jr1hoY0VeDh_G|A$3t{v8h8iM8DO2`_6eOcjx4=v zl>EU3^C+G(PRa?viO<&6Ye2h|C4>m$M9M=_3`YO`FEaa+4YfM9KmgxibG?)-X3eL1c6D zY!HW&e1l?QkFXkQN*{kC+D%gh21Mxo4=MhbD667Po- z-SwMXkI_`Tb*AqQ%5KlMr0FjO&<^_&HzXZL#0WE#8ore?n(+WbeM5`uehdcs#pstL z+&U+w%yP&~a6I+`h`*9YH2aGP(z8YmQ#W2e99lTri^#WnWd?P%Xo=0ij%MeE8*Q1C zJ<1_Myi^bJUFGUXCF$l=khMguMwRz&V*)#zf2?yhwSP3iU1|Ph)?ZQ*@~v(P>@oe0 zJBtu(Yr1*@FL|n^GVju^aV7Zfq(}!b)<3b*K4tNC$lyL-i32hJ>J`zGBkj%eH>rAC z$@!AVC0xdWbo4mBIU@JEn2>H@O;|k+LC8AVVU`Yx8kHd~3&SleOPc}h75gh2i3}YP z`$^W2lL047Aq%+%rQwW=x}A|s0+BK?1D2Vc2u@{&kS z+P4+aOEHO>HYdBv2hO?u-k&u`Q^VSHjuS|Pp(gDnHslc3pqSevMfeqtPci9opp1xY zyK`A;Ug-Zr8)Sv?X$ub(hon)rHFZFtKWrRBpDWU&w%rzK7}R_0s6)uiBHEg|T1h&@ zc2<1Mqp$ocE44~%f<}&K3BinSw$4=Y7HBukbl8|2-EmG~M9sPgJYU##|N9>rQBb!y z7Ot2u5m*+k)Jm_8UD%0B5QysBZujeqHTzhN8BM@QBo`SDLKWE?v(!p@AGh zyK-p?)wsj|^9>Yb!t`byZF>JF4S+9)s0bsdDKsBAcTk5}goA06LHEurXGpB@Mh5 zkVo_N)l^JF9$}CplKxFxW0?X?6WdjLF~+RaMn0PYAvz|vv--}d^1YJ_R?V3>MQWuWT#9u%2Bv`vLhHY8uXs>f97JR_I+OUf`$ zTHyTGoC8%_IAo>Dfzh&yYdqVpCQQG{6|}|0z_Gs9GN{{zgIz?jnxZrekso*sKdPuu zACM0SY$vL;JPNa>>l5rkBIK}qMb;r4KuQ{Xu7!QnD1%1&#_$`a@xsNLAL3R^3*XqM|8o z8>>-79{2mKQ9f!lqEFk0HKyw-HyG8?9oNBc92v3+%DZORk(IP+vJhPwjlG44%n)T7 z4YtY7&}DPDRq$bmY?;M1|GlT?c3pB%a!id5Ar`pxf=Y`Af>TAap}~Z?CMD&&N=xe| z$sQ6Rt)su;m#4To0Zg>MKsQYu@1g6>V2crmfyz64;1Fql@^ zqP#6?RNS>Ry7Io@{_rJ*t}h|Ho|zqVlA3ddyd!c67QCgW0sSCMWh1BqgXJIh21dkdTt z(-rQ>WchE}iMxE!?kmjyU)r&aUV^86%|7rehx|%%N~ZsoTG{eDP%)T7Q)W@8GMLgY zpa$$KTTJ|9m2aHD%YlLqr>N!GvUX#y;E^on!nD3G!t{XiGD4?`#HRlk2whXiqDT{OQ?BJ)1aP5=F$4s6Am7i+>dWo+s-wr1ILu;&x5I6 zCKJttnE0SL18P&wVYmOyy50jcq;pC}=tq+J{~LAuqTs#lY}R7V@x}iSEc-u)iZ9nc z`D+g#*SLRCOs3+fr|i>tLViPrcKkmw|Z3@Nc^2F@7QuFkPUT1BZg zz=h)!S1U}=FuY5Z>@+FtsU6NK!p_eMOf9$7UKhEf3%`mjnF?lILiTSfr77OtWK@XF zORhl2@sN9h4CQUpZQ4>bQQO@A08B~dM;w}V3j^lae0p-AK+OZWb9}an%n$PPC7riK zdPFu4o`}!Oh5j2P8LYbhi*FA>E4BV5w?Y|05pyTM=3adh3Ie5p1jY*VoP$gT5n z5tnLditRZ^XQRqGh7)OJfm_Ad32@$1J>cFV*EvH;QLz=pT>Gj_^KcJT@F`nM~X4NynbC&!iiYGS0p)57obPq@Isc;h#<;^ zqTmnvt6;VvO|Ju^{o*X)_#{LtcPQ3aeoP|z$zM9M{!F}C4%f>G)(hcRt)Ck1S1m>O z6aCpB=U3R9^%|X1AnKLJwlL{ofr^c5P-E0suoJ@IR8mh@?A>>F;6u`aO1IP)O|{8N z$O4zR=Y)d&tPXRc+$v9y=E&&~|7LN@7!2w;H6(rirhNduOvV4i5s0K7^*L1d&>AhF zfl*r=woR$JibNAEeN4|=m~9f{R>T`OgpYWoq-E3bJrCQ{7Sb!JK|PvW)dZ~Nj*;yd zUaK}mCpG1|W$6rwZ4=Z zniIQIF=_u>s!AJGf*x2qY6h}iP0N=nbckF9@$-60fXz$Z2H<`tS?$sk?qSY!7=lyJ zP`Yoxs$?=CjKydh1RUZL4+#PTz=3Uj!6!wfSB9qJw*IK}8C5KK3(;czFW6YuTtN#!^&|-7&M|cCN>&0Jjw?V{ zvH9mPW!5#HBnEw?FX#5#*)9`DX!n%g*}~+<9ALTObI2XS@P|bn_w;lL6ofi*so@|5 z+Cx{x23KmM20NXm8t#tsvQ4eR!0>R$F9;FGGt?%Q+5zP`G0C39-l;8ms0@2owN z3E4Z;9_uCJ;lpb9%FPf$2)^FZ#vB>yqIubcw*ydw@_?v|9NH>LS^E!Rq)#|^>-oCZ z(;cK18EJpFB=~?+x&I%k%>0Kc=l?|&ADa%J{>4jjkY4G6Kru5!QOO*u;(ggDmZLAW zXvVCpADlU*0_T4dgGraf7S2G=Y3wAOe5Hz>&j_)Zye|!Zba-kY zLdeu@=rTxO)odL5g`uzWW=2*fS+W2BoAdT37@K;(c{nmB_Sfx4fV8-RSgnXr(EkAO C9TGzT literal 6237 zcmaJ^cRUS=;bi04(ouVgjH|JGD)aKJ12UTPfKb zE9f0on|rLJCPB~xKmi`DlnW?4!3shqaT)-bcYx;uFKkwUr+mP3uE33PAP9Mu?284M z#j{XiWyS)`_ie+K0ecysc*H0|1uzi=9@uGiN&!=RfS|guof=S93$zWB6ITEPcL71Y z@Q_Eq9be#iFB_XT@Gcp6@Z``~_V;5H`6dsBspJaTdUh!lgc$*!E55NYKO^_BI`!iR z;?~&KDGL1UKFKt~2vM@7qd@@3jHSdxdvxVJOo|#F7LTqWwc^`u#k*m(v01%dA1QKC z0DxupfYEDSflAsS8N48;>uip_JNA~unI5N+b`@j_)j;OfjPa4nEjKDzAM2;5*Vopj zG&+^ctox1quc7T$ZN^ux&jVyHPfwOwR@f2376{clXG`sa$67h`BcBN0+01Rks9x3* z-&`_`vv#W6)SK`;SkdH$&QtrB>G@!M2|d@kKgc3-Wh&D3wd{62`q4 zC}%CcThvWkW>k#R`2OU@NV(S?3WQ1*VXA>v*V@Us7xhSy8VaUT*UTx&{ya`=Pi=qd zQ2Nuo;okgbMxDg(#$y9psy`Ed;v9S3B?+Yr?g@u-)1*Gce+Z@VdRUsIl}j@oNz-E} zC?T|yw3$qn41<{P)bRLG#`Y6^*7(f%nT|)mu%IxvaG{VGas(MLj47}*@JBs?h#0IE z5dKIgf)pa3?ikP+KnrB@!wRAKFhlvT0j5{)@k~3kI&{Hb^)kz?R-3w+iC@rEdh@b4 zk`#q{AjCR3%ZH}@Jb4%`@EvGt>}UnZV>ctRHC&~3iT zzUtKN)cu7MkCTN{Q+r!`FGXLwKKD_sjFya6&(Ppd_RwUqSSm;eExeh!nTk$btbP8> z`x$RdeodXNdd1qaT+_XpCg+f6Ql>d3kY^T^PfCy_9FvVDjd}O->UH9Diqa>c9c903 z`f3VlY0B28@McjpPBs44P#bD!Z5OIzFRnSxzrp{*6$qasY?`!);Tc1KTh*Hf(nit? zDZ^=d^8Q`N30neClM(WfDUsEh`vZ?U9gqg8thMa>1NV!?63oA$kTwIli%^JH>@K&0`78!goPM~%166|o6wF5C5m~C&Vk() zmH#RyC@-W!g>f0h*y27lLUG#Tzs;I+mA!?s0#Qgc%>5*w8C{H;|~zDr8-KW{FlQ zaUX{o;T6l)Mbz*(P3RWw8YiLxnmOUxjtI+d{cpcjV>#{+Lx|Qx{CDQiyB4}80;Y@A z)_+5hbaIsMBTx@!sS_y!r?}_5*XhDw{jJG!@l^#yo%JtA?8fZ2HWv8O%}5gp6E_k` zok^x=sz?@%s&-HQsLTo^4sp*m2G@Y=zqHEMHQDC%4G+o48-6uBHvDTSzBe{sZH+#2 z9^Iq!ZTchnYhu={>GVpjuVog31<{_co3Oo5zo~jO88$zxb3d$@UB7Q!XPizAbwlH?G^$nAVtrsyBD6--9<-``Vpu(WOfa&mTAY{HD5@oJf}f%{L#xVW(ZE zCyP|`0dKgjh6fs_y}0&Dnsl42jumzlr@`}K6Y^%)b5r|sfv?)UGLJ^*R8R3jf=8}n zPh!ZxxG~8w1ED0LJL!^gQc^4OZ?3j3^S~o7M>x}|ud}ZQP}Ecc0cR6C=;6_%(X7P7 z#JE-`znrV>wjG+%+3xmk#+E*B5h2TCql?{dUUOay`(GBxbl3ct1G#VP&&y8?zUN)U z(Zt2w+`&mYx_lwRH;dVCGQUvM*9HJM2LJ>G1HkzWX50b*4?zIfehvWANdQ0%`()Mi z1hZ!iS65av^q%>J^o?SNP=>Wmdl*ssMCp-#`xsKp$AYq9HnW+erX&a?w;Zk7w|M>T zEP|4PQc=Oskl!EoBq2d1pp)e&#|J19I%o~uw)PC6jzcn5pP>DM8+ zOxL}#q(X)LBL2trhX7AALRpfJU9oh_= z5WwV3SeC7Q4=WvOuXlyp?MGc0;QOkHYvw^RP7PMz@QT{2lkPh%4_(ZtR4d|bssWEB zoWlBy?Tz9dD`IoAv#Sx>CRHLV3&JK9x(lNvrKO-}&8~h_s=tZ4pMuU;Sfp6|wQELFgGV*3M}N;Q?ozBd>_;9c2ra(`*uiPnv5>2zkm z=+W7F8?|BQ03r}z!rp^zoopJKI95u|=oLwjVh;nJ_$`^uH(jRmpbcRoQ+lU~3S(d& zWpcI&_+nY%Gx9!iv$QspCaoirBnj`~>&f_0GSyoY^ccf|t111wNN1=leI31I-NBz4 zyVdG=|LmbYnb)JGdcRw05B_*AE$~LyR6Pm=kxy=a7_VB^om_D8Vg~l`P_7J*!|pTJ z04RY#SZ)1}F`l>vkG{RpLCTAv-Xv?#4lW^RgF^*SS zbP!kon$yEDBiL?IZzEOqq%_dzr=GB;on6O))J{Z&`>K?ZKR{nj_e!U;O) z&#v8h$mTe0vAnJ8aY+b~o$GPcMkoXg#Vi+Uk63tGQMOg-2frlCr9BAZr*Fh(aQeiL zTo1b~ZibUTmd|fQFwBy)y{1x4Y^1n;HKbchd7W;r(|G?NNJ5gp(%8YQWI>X`BoEDq z#`y2itMKYaM5)IMpeis4U@|&Dpg~d;vOCb!aT>5 z?yNRLDpfiLt2uG0a+TxeuNtb@ftV~wU}AgyxxH0gr3#h^8VqjZkfs#VNOw+lpb7ao z!q$542y5wTW)?&!S|Qoc@9HtRGji0MmlabwK_`M)J9~AEm1{>wju%amr0{x0>F|S$ zvB)~u4h`BtZB85dsOE#BoauuL5jOHGQ)$ss<7J8QR1#Bqi=8@t1L+sXB$U@~T;P(0 zB$kZF87?L{N03XjJ<&X${I&Y2+U9IM0#H6p6#Cno$R? zPm3gUzN6#XI57T9tt~7Iq<-yJvrT1YTalSt6-jVn^sy``3q!B!I?~rTG;pLGYN5AD z9F79D4C~@;78zA;xc%okX_e0^*CeRqN(%;+K-UFq8hi_CEnl-4O3@{KoJ;*gJBQ++ zZwrO91}U32@BQZc8r`4tKw$E?qDSZ8>e_j*Zm3NEpOQCMA9MM*u;kgTqH4%9CX%Hw ze}Gw_>w2Ec5cuVVN4(3>iop&ZTH9wmJ&#cXqqIj-%(yL>e0x;GSFsO6 z0%a_4IU>K%Ea_i)u$7e?!FX|UD_o$GZF)Wf$YOXnp^wh%NUQ?A236$85dWZ^XRXX~%?=`wAFrHppNFSKZ z`=Nj3r}fhETOe{}L3U6KT=K=dWPuw6Nx|VCT=|)-WWfnJ;BTcC!g>u$%!9g$qEiMO z&AE6e0yC*EthQaz0|L!G8S*$DbOss(#oyb)gwH9W8If4(TG1b;hc{GDzXy1K!C;adb)C zmGZ8&k8WyFK8s7So4+Fqy!^Xh)J;sir6Xd*^ozU*)Q84wj;<#ocBU)!s{GdjEbe;+)}u}Z-IhZ%3qpD{bcgiV}jb7p*z}6?PPvcl6s3CH1}JOb+GTw z^a&h*xO4)nKY8xLAD*SZQ~#T`W4+}2uP?1)9&tKgrU|OYkooP`5YfH)m3G6$6;uMeW^a!1ErJHSfqq4*{DW3-3v~lt7qo+!MolojEc`j!z=+r4RowwE9*cF6)*1sN3ffM^rCaKpgv)MSNZ_?VQDIIG>u+yz{&~WH z&>Bl_J9YLlkHLJ=w_foTDr`^1YWo&Zb@Yy~%KO`wMR-}!9hSzpO-r|^<`wX7S=Iel zToC)W#YMUS!-6!;*@BumnHcF2=5!S+e$%5IqWNg>#6>M>$Jz%bufl{1gP@qQ$`q1HaF1g#60{K35@0p zvTiegu>6&}W1aDfxz%HS^fnW*jg0&UAK3CxVH_Sp=njg(lQQYSlketaA98~HHzx(n zEq|KCz<5=PdnEp!wf)~sCbV^4Aof7Z4SrOZd%%wlX+E#S;7s@3HP!1JH){7?xJmeq zb(@pn#af7K6oe~u10EiJ+`#bos2;3rIjV1$6Hd>^y8j^7II?$$^)M)$ezNB`eEQG* z*qtg%-N@c~);EdQuUoDg0|Gp|JRF>vsA7ALlgyM~K2sK_t_h6jEe?N88LK|OdH0@= zlJc;*P5E{e11sxnwH!L4*E0CBIlxmoSLIA1vUk9&zez*c8I5Pb#VU`kxS@!xro`QN ze(&5O%Q7*%cLA=yXW{Li87|Ap3Wdx)9Z*^GyEk2MQg5uhP}n1%Usgg9%M{*g<RLQ}FShi3?=?fe`E+(8&AozC-$5R?OMNuhQ;dl&zQbe6 z*KN7kX>DZ4M>$a33YPU3YKUU-;**WrWD2WAULw?Pu&+(0auGXy8C-5Dxhh;5SbY5WzE0UqLKf{ zLhy4`7`WY>Y{2)zMlO)sqJdF=_iq-a{+W%T`$J%;u;$9hovdMADKC(rt5spC#CDCA z@3|EIqv5CKWLTJbX3c9(R?V_m&q$?HRqh7*3YSM|uZ=Hlz$JnE3}gA2V#K$ypcN4O zl_)_Zuw;z>e7<+3PhJ?^@k!Pn1)k<1I8MP-r;9ZyE_vxX#!tH6qJNx}_2^|2MU?Z% z2u0lLtesqpdjmej=mru+gFEs`FNRD0Ti?KFOUURl5KypomgRXP6NmYK1JqS?lu=60 G-~JEFSNXF5 diff --git a/static/index.html b/static/index.html index 04e1369..d59d70e 100644 --- a/static/index.html +++ b/static/index.html @@ -50,9 +50,10 @@
    - + - + +