From 91aae189430b132fe1a3f6d9b88b7a2a26ccb331 Mon Sep 17 00:00:00 2001 From: Stefano Pigozzi Date: Mon, 29 Jun 2020 17:23:57 +0200 Subject: [PATCH] Initial commit --- .gitattributes | 2 ++ .gitignore | 3 +++ .sentryclirc | 3 +++ README.md | 3 +++ package.json | 40 +++++++++++++++++++++++++++ preact.config.js | 60 +++++++++++++++++++++++++++++++++++++++++ src/index.js | 46 +++++++++++++++++++++++++++++++ src/meta/.nojekyll | 0 src/meta/CNAME | 1 + src/meta/favicon.ico | Bin 0 -> 24875 bytes src/meta/manifest.json | 16 +++++++++++ src/template.html | 19 +++++++++++++ 12 files changed, 193 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .sentryclirc create mode 100644 README.md create mode 100644 package.json create mode 100644 preact.config.js create mode 100644 src/index.js create mode 100644 src/meta/.nojekyll create mode 100644 src/meta/CNAME create mode 100644 src/meta/favicon.ico create mode 100644 src/meta/manifest.json create mode 100644 src/template.html diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8923d61 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +build/* linguist-vendored +docs/* linguist-vendored diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..99b3528 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules +/*.log +.idea/ diff --git a/.sentryclirc b/.sentryclirc new file mode 100644 index 0000000..5c9df79 --- /dev/null +++ b/.sentryclirc @@ -0,0 +1,3 @@ +[defaults] +org=stefano-pigozzi +project=example diff --git a/README.md b/README.md new file mode 100644 index 0000000..770ca72 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# [`bluelib-app-template`](https://github.com/Steffo99/bluelib-app-template) + +A [Preact](https://preactjs.com/) website template. diff --git a/package.json b/package.json new file mode 100644 index 0000000..a047228 --- /dev/null +++ b/package.json @@ -0,0 +1,40 @@ +{ + "private": true, + "name": "example", + "version": "0.1.0", + "license": "AGPL-3.0-or-later", + "scripts": { + "start": "preact watch --template src/template.html", + "build": "preact build --template src/template.html --no-prerender --dest docs && git add docs", + "ghpages": "npm run -s build && git add . && cross-env-shell git commit -m \"$npm_package_version\" && git push && cross-env-shell hub release create -m \"$npm_package_version\" \"$npm_package_version\" && cross-env-shell sentry-cli releases set-commits \"$npm_package_version\" --auto && cross-env-shell sentry-cli releases deploys \"$npm_package_version\" new --env production -n \"gh-pages\"" + }, + "devDependencies": { + "@sentry/webpack-plugin": "^1.11.1", + "cross-env": "^7.0.2", + "preact-cli": "^3.0.0-rc.14" + }, + "dependencies": { + "@fortawesome/fontawesome-svg-core": "^1.2.28", + "@fortawesome/free-brands-svg-icons": "^5.13.0", + "@fortawesome/free-regular-svg-icons": "^5.13.0", + "@fortawesome/free-solid-svg-icons": "^5.13.0", + "@fortawesome/react-fontawesome": "^0.1.9", + "@sentry/browser": "^5.15.5", + "@sentry/integrations": "^5.15.5", + "bluelib": "^0.13.14", + "css-loader": "^3.5.2", + "file-loader": "^5.1.0", + "history": "^4.10.1", + "less": "^3.10.3", + "less-loader": "^5.0.0", + "path-browserify": "^1.0.1", + "preact": "^10.4.0", + "preact-render-to-string": "^5.1.6", + "preact-router": "^3.2.1", + "process": "^0.11.10", + "react-chartjs-2": "^2.9.0", + "react-markdown": "^4.3.1", + "react-simplemde-editor": "^4.1.0", + "style-loader": "^1.1.4" + } +} diff --git a/preact.config.js b/preact.config.js new file mode 100644 index 0000000..91d0041 --- /dev/null +++ b/preact.config.js @@ -0,0 +1,60 @@ +import SentryCliPlugin from "@sentry/webpack-plugin"; +const DefinePlugin = require("webpack/lib/DefinePlugin"); +const ProvidePlugin = require("webpack/lib/ProvidePlugin"); + + +export default function (config, env, helpers) { + // noinspection JSUnresolvedVariable + config.resolve.alias["react"] = "preact/compat"; + // noinspection JSUnresolvedVariable + config.resolve.alias["react-dom"] = "preact/compat"; + // noinspection JSUnresolvedVariable + config.resolve.alias["path"] = "path-browserify"; + + config.module.rules.push( + { + test: /\.nojekyll$/, + loader: 'file-loader', + options: { + name: '.nojekyll' + } + } + ); + config.module.rules.push( + { + test: /CNAME$/, + loader: 'file-loader', + options: { + name: 'CNAME' + } + } + ); + config.module.rules.push( + { + test: /favicon\.ico$/, + loader: 'file-loader', + options: { + name: 'favicon.ico' + } + } + ); + + config.plugins.push( + new DefinePlugin({"process.env.RELEASE": `"${process.env.npm_package_version}"`}) + ); + + config.plugins.push( + new ProvidePlugin({"process": "process/browser"}) + ); + + if(env.production) { + config.plugins.push( + new SentryCliPlugin({ + include: './docs', + ignoreFile: ".gitignore", + configFile: '.sentryclirc', + release: process.env.npm_package_version, + }) + ) + } +}; diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..6e3e84d --- /dev/null +++ b/src/index.js @@ -0,0 +1,46 @@ +// Import debugging tools +let Sentry = null; +if(process.env.NODE_ENV === "development") { + console.debug("Initializing Preact Debugger...") + require("preact/debug"); +} +else if(process.env.NODE_ENV === "production") { + console.debug("Initializing Sentry...") + Sentry = require("@sentry/browser"); + let SentryIntegrations = require("@sentry/integrations") + // noinspection JSUnresolvedVariable + Sentry.init({ + // TODO: Sentry DSN goes here + dsn: "", + release: process.env.RELEASE, + environment: "production", + beforeSend(event, hint) { + if (event.exception) { + Sentry.showReportDialog({ eventId: event.event_id }); + } + return event; + } + }); +} + +// noinspection ES6UnusedImports +import "bluelib/dist/index.css"; +import {theme} from "bluelib"; +import './meta/manifest.json'; +import './meta/CNAME'; +import './meta/.nojekyll'; +import './meta/favicon.ico'; + +import Router from 'preact-router'; +import {createHashHistory} from "history"; + +// noinspection JSUnusedGlobalSymbols +export default function(props) { + return ( +
+ + + +
+ ); +} diff --git a/src/meta/.nojekyll b/src/meta/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/src/meta/CNAME b/src/meta/CNAME new file mode 100644 index 0000000..5778335 --- /dev/null +++ b/src/meta/CNAME @@ -0,0 +1 @@ +example.org diff --git a/src/meta/favicon.ico b/src/meta/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..97a51c3f9958090233c79b66220401cbc7b1208b GIT binary patch literal 24875 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⁣Eoms26i{_ zWa<$sIoyW&=1)N7wbF+aJ1E?w;EL5Ms95q?j+@ua$lKPDUqqq2bBbG`FeuE}UPwfw z1#Igns)J$S&&}-bgTaiicHb${Lr%75H_w@Oj5jI+0yHjgxv(9XKMB>6jB36F+4Gqngpc+5F!x3-r3dEeEnjTDJH$;Y97Ni;yXt%c!xr!vpX0ARv2Rx#l zJDPmL#bOKcIAid#+PXYoBqLP+?Z_jS<+#^6LP5!)d(3Qs^9VaL`7C=cPx$3t7U5f_shHU|)|k_|bi$7RLwq zKAMRh)RalO4fn2?e6LFchCCP-guC%ZwfR+4_Zi}W=g!IjO&GHIknv|Up8qZdV;{dQ zUcSsPkPh>L&vuJWi;{-(;GOP%fLT)SfrB}au}CKXQG5U6-%+0MF{D8-ZK7extrG0R ztbvDGun&MGtoh}8d@0hZ8vEJP$n=~P%gwo5#E3`j@6m^Yyh1^q+G^Lsu@A@5!hr?( zj$&|meK+yf1f<-11@`fQq~U@yfKwgC zO#(c?9`h;+fDmP^hkhHSo2{Z|7~zbb2jo3`7Kg*F3Yzx zw08e*g;13iUzLdF&!5ooMc*4KZeG6l21Y)B+tR3(Qym+tUh6x0HLqwVN{?IR4*uFn z7l6?J_w#kkYxX){vVr;>{qvolZ-QL+*K86@0=WR-^xhpXe6Xq;XCXbj0_CarS?PZ@ zEXiZ=*I2m$0|)%olk#F0l#|wWuQQAYpld#+rUsF*&oxx(BeHTnnYN9Mjl`qR0hBVd zR!hNBk2s>EsA+0sRgF47qbs8LF0?7Yv+)TMARZ;64)o^FV2Y5nLNWzS#Z68#BRUGo z_voEAJ=Is0V`h2ZUi-uH@>>FV`irkdq%0PqFmAHA|BTu7FzjV0yZGvQ~-qC1vMw$_U0vgLsMUalDhWLe}b=Na9x<0o9?Y`M)fTS|Z}{ zsQ{Ft%14+;+oJwbN3EgRuT@f3npw8B!SrLWC;55lANHNv!z-R%*{OLNXly-p>ZaeZ z|K$SgXAR<=gM-Q7J2W(W=VI&~e<@PaUVT^cz?0@upj|i(-2KRIe{P2Lx}RB9H1mkS%r*T_F1?&yS)Wx1tAH_KJaM>A{mbQL}@Oizf-4#2vKc@yX)7Xaz-Sz z(SKiF@ytnWib1tAmxE3AiCS0_pXG8sM`}&*U*?!;;GUqEOZAP8hU-` z)lJXM7^3~BgS}rw6Vha>C%Yh-`R_CK{<5l0OoQng+hyuD3(r>oyC8Bja5bOq-?eha zk6`Aue?AjQkOoK;K@w0ay}nWsJx!V_ZFh?X+{gc~N0|t}7=Y67F%|mpg$u!bB{v|1 zkkTA(l346Ef|$v*_V;oS-Am4|)dcKA(PyFwxeS4${o!F@C3@>>oaZ{DH{ zCz$@FNZP>2rc)p&CXH)Fb^IDb40G-4Mfp~5W^zOog&nWGi|c)F+XLOd<>c>yI)&~B z_Sb>T6enp=v2gT}+6mG@^Z0YlulDh5w0j0L9B(!>%`S#+a7|Sy6pOZi1pALVdx;iY zP1*mP%Fz8Qm8_K}BFA;2Ex{`h8$zODjx3qq7VR1CO{G{-$nyZf2co66fQW4Vn9;{B zRu+~V*_yQ?pFM1ukn+phc#xKDh#;?OEC)BYk-c6mnm!qSylC6NCw65QQ<9*Vk@1-V zaB>8i7`(ZjUiWYRpfa}v%m6wQB1dd8KZd1e57*f2_@foLmTcw*je&j!kgF zGvEJkj~?BUjI`XlMw)5Xv3r^bav4223p;zk>qQ7_*MtSm>2=wQn|w;4@3}XYxgU2Z z5!@s?%AR?!x9Ut@8@fSt@J)=569efM?KgH3(v+A#+du0XV>5Rg zSicT^jI-(p!l8kR9hz67q6G%ybb?j{^@B;@2?_2j#lJu1m||`uLi}I92>UaH+~uPQ z_~|#+p3hLEM!QK1I^6^O>^XPZ&%z8-O$!$i;;2CRQ6H)dSgEWvt75uxntJRNDTk6PZJijTs}+PdTk z_OySs04;_dB;#j*kh^|&TC{v=Dbib@tW(j39Xl_C=a>|_JsM*ncXCq9Y=G)k8bLl% z!@M5NFSt9#=<~;{7@xqh(6vi!uiDPzG?%le8N@ruKlp~BN043!+}HAro)}(SBbmo~jXQZjx%&t4I;a}Xc^;rE1Xj}4*6V_908!Yxq0aV)rTeFTQ;bI~5Hiqi=3{D_ zye@Evp8)YtU8qyj=|EYIy`Ns2!L&gwo(SEQ(SzgcTA<>?p zzB_nIXfdPs>)%11Dnt5qKnUU9GdmH92!5!D%^wdXYoQI{kTW zC4Hh<}PCR=G@wtJt1+w5<(92NN`_04v!(1|YE8#`x2fih{vB6g6k% zaCF3E_r_E$5gu@hk_$dIy_m_Hjz&O`<La5)ZSh&9w#-X;L+D{p?9yA5;= zqHyR{fXbbImKpnI%Q^?zlpLPzPe=PHrxDxG zL>_+MY)EQd@l=Q#)G71jpcb1S#k@pMDZmN1QN{~MPAPEN)g~GM>5+{4NT?gMTRG#E z^pff(Cbjh-D3iaSrw)dyMH5nflpF(EVg&Fa_6Ty75(3(#*8-Ol^YsVkFMQ&s1l%w1 z7_@YP{1r;PCeJ~0(e#k7leC=NRoDU=R*^k3xk8hq?G`RNzI13YOE`ObU(sZkF?Crv zGLtowyV<9$>_mf;ggSYi8SuZ&?n7R{u<8L2Qx|Z=zOpjQE$5tW1M^S3WH?Filkm;{`@ zQ0mS=sUEn$yhxxzaiG0jv%AUpTXQ_3VoF_r%Q1=RYMMgl9V-)G;@nLAe47fPfRhx6 zNGaGQRW3Z?jC|`1s2_^<$#l-Q;4&{_EBiy6p$vCazVhKA%1bqQjO7j7tEt2T!O^ z@*XE6@gb;ENL~kySqF{s(xC~q%g}hYp85HTdgf=bc0W-i{RVhK52W4@Ry`GN{sAZD zv3)7H)a6Q69x1Uq?8X!L@M<@xY()4*t3%(7Ry4**+- z19BuJRlxtw^P!bj6917<7|qlg-f`NlJi;@SBr|p6 z16*sMR+qgP&=)=q0Y(JPfzC|_?#`jXen`_sWZ=B9!r<#=>(+`|z5wJ$c2W&;;k*Z9 zWG=Q#<VwKVT0t8p2FdKkByCfc=yU3>{!)<4AC$#oJ@D)32dr4o#%}Vb14Bb9GyV zoB$*dka=2g2Jc@%i)SLH)`GoumMbBaD&igRwOVv@mS3n0roYKZg~arvwTbn;hBin( z+%VKMn`rO%Tz-H$-9}Wris6qlg+vS0pJ0D2Z4#ZY=?e^bU*@7g=(bxuhF&#f4A?vG z*5dzLHJZ+e-l`}Z0n5Oy(TR5Al${I3EB@4oh=>=p zlbyWS^&@zbG#8KteP`%gsx!i_L(gV;W|&paa)}gN5lI?$#Z#zXsU z5*fxJp+abrw{%w+Ft-qDnyqMnj?336NvC;pCnDnCp}ZsLVR7}^AfW z7guWMQF>?t--?sp^V@hJLY@%G(tLPo*SD4c0UBlXu!4jgZUP@~fy&&mVX+rzF^w1+ zS}T;CmGt0JVAUE*&awc~jua^S{}KqrYUiEWV!aX}3(Jkfy$3c#%GPX!jj5FxTnFtb zbmW^iiCGr(5*^#OVzN+ll!jIZH4FbWKXX8<(51mQA+|5$?b0mh&2Bd=wno2-cED4F zM7OURZ#E7N8?}{|z%c9Qz}Mevm|Szd?p}csx+-)e4EJf2j7LEAhh|N4!EE&|wplz`{J@1DVrbS+Aj7X!C(La)UsNBxHoBzHXTm zH~#gHKTg^A)%EdmJ4$bUxJO`uB!TMBnhG_&;6!#+(7}(OEf9S6c;!T;B69wZ!MvD_5Wd6xq$k`NYhopEp8%-SEq{&N`6+yZAjLw5tA(FM=zKjlIGa(`NYK)7j`Yixj|5NqqH8 zD3@UJiL9en&&B^CfZ$rI*G==jrWciOGct(*j1@HOX9w+p99ZrNxR?4*Xg})KrnN4< zLbc2Ov_tn0tTtdLwZO>@3>UZ# zP*16bT;hpL7oJ!$F*;{%oblb%$>%Ya+06`+&v$z}4Ttt?1L*vtTS&Iut~AryP=xY0 zFA~>P3h7b6=FIn;x`JM`84YPHjs|?&vtue6=@T9@>3)f5AM^6%T`f zA;>HAl?gX`y@2d1s$A4|xV@b=HSq1Q`E~g434CY(Ivh@DGXny0oY6T=X#QLgB-=BC zq(r4|<|!v9Cxk*ta@Y}W@07fZ4bU9TP=2$>+vEfwmGOC7_Yh?&CuwBe)Fl|n&|$q% z078cGOWBnN-VEw&{&PjJA^2Qgz~#EVU$W)7jIbN&`G{fQ8k+>W3dGh7){xFqoAo5@1=FX&TVaX0}@#?`+x zvVoU@^Z*x{fSO{xAy6WKt&$IH9#kMK0=njqGh>f@Gyu)KTelDlP#|P^ZqzU*VhkB_ z9M}VTr*QjJ8tFtW+EWmJR#FQB!xhwUk`Qx|a&4eIXgho}2lMvpc;2=6Ej6&yE^zG> zoRbg+=XA?s4^%me-eF9;5$Yz6SpQv9*?N3Vc`FmTQ(a)BNXRoVOW-scPDN~ph$R)E ze9OoYW}qK!wjbg#0jCaL3eBJp#!_3qJ=*4-G3aY-4(awfT?MKJ)jpRVIr%ZLHs915 z6W>*$c)RDu+Emc+5P)hUreGcj6Ivv{{!k%;numj!;l6qvM_Eiu{d+pl&H-7@quPn+ ze`%92viS6RGU@r{JOdMxC}6B>L5_I0X4htbfxH~tIWi)z_0>@%(KdN8JY6KdD9Tmy zWC!$I|Mq$f-GLQvp(`dHVPi`NWidVH8)o0Gpbyksq87)Ay{#IF9H&+%kk1}8#F6@^ z5ddl}RTNewnrSbm6&8lSBegc#ddE@= zEe0xQi$N2M3+`80>T!d9C_aVz!bPf`z$*q^i8oWp=*xZv#a=2j0cu&?4b1d{hy^}B zF%|r-$zVIb}O7Iq?e+P%`V|P>N2e4_LQ7ahL(Pw)1GVhkVBL>pO0Jj{eT@ zDoPqm-XS#N!$9=`l&4QRSRaXQuv{JLE|=l=Mm_z#A_`>&N8eTuwU|Wt{c{g@FR@a- zM~$fd7N*a#*nK6{DKp2Yp~;A!kY**Qk+vLh#|8M-Fq6mrOeRZVsg`Tsf}IqwYU6^s z=J0p|YovZO@@;D6beoflBV@#ikI-{IMWN=qnO&993?kwu&Og#f_v1PH5Fou`>>xD% zaRgLvXellL`~rlvlAd@I6YC5<+g45{pl$S3&I$wi3W|V&fe3FzF&>lr|K%`UflQE& z>Pd-jGeo(1scj-4x+C8XG8~%vN)uSn@4AjV+&x#^e!%x>dtl8NMHnpV05}nXlk7nW zNjW_52BH_hIKN}}-hh^L6Yr@#S)BudnIdXfsvPu>)cT4%a#njxvy1(L0DmKDT@zM1 zW%XTYMHb}20?ix*NBiDk^4#ER^jdbQQzUS=S^(?bPGR2voE&Be;ee-2aE(H&bdL9? zPTPLPTxdu}xlFFmgH}w$AqeC7hYjzzeMe$8C%9zy9g<+~H=BEf0HZ*YKNMgNgqM8g z=XP$uV%vAOx=%-G`O-6UuZKZ9d;z@@^-KWnmj~mO(;#uQAcQ>o^;8@hrYE_<(cox_ z1KpVlcQ@qL9wlUafCnq=NzhnOhqf5_wEUtPQsc`G4|HB{ zRXhE%+0E5S&-Hq45^HZfJRZQ3|IcUY`d)E+L7&pFq3~oR{2p z#M_TVl$$ENb_S~*~fuWx=iBPdx26*jjeCBEXyx$ zZ5STlaNN#@$EWZ>==_VFi5Qdv!g$GO2yN={j-i{t@l9ntnd_oofW+s?=S#1P<|wQcJVw=u*ew=(N#wFetuXzFf(k7ws2598`uu0 zxgonRfP_u6H*XBR2M*bwRPUfy==lNbu^T-6e1c7175C~0bRO%upfRGY)oK8Fg;CdM z5n&mdufkK>T#;GOPESvJW_Zu?@hb67kL%oK99A58qPWsg6K8_y!ZexyKm%#}KD0%y zPKm;g@Yg7ai&4dez%R&AHTnQJIOI54K)_9Zel$mw*8=FzP@F5~so2}!Z4ff2aErwE z_f7+RF!6`of)EQNOwRa7C|*~gFlPd@3wa9(E!Ary+xsSz%#qOviOIz}0^Tt z%*@PDc<7IiH9?P#k<6c4flT=HsQu;or*WKzbCOq~b@+DR;YkpHIEs7!om(LyUnNe< z1Rj?}jwzH?JL0bj2pZgmo$i0XhWi*VFzPR~XhN4(^1TP?7_4!&=pNX5Iqd7?yQ-W< zOhd(oYpHoG2**!o2U0(T5XkcO*N{KcDMnzh@RC2jUu-2PXO4*iw#8GQsw&T`!-ru= z0uFfvf#&2pQsx@V3i1d$KUH& zK&UzBz2KXu0`{qn9`j`>Q2=-ir<&b(Xh$@}bPo{^v~RF5=l#z;q?Hr`JEQ4~J4n^G zyAK#6jN%RCC*fV8`j=Omobb({hs;!q-X~6s$kYIZ`~Y$tlH$;ppQ&9BGlm(%#XR({ zfhiA#0GH&yt4*r_vS!1#5J%MEx#iZ?>5sbo#586F0haQgY}7c9Wdn8Qa_qVNP5}k( z!l>Jo9U#FT)q5mIMs^Y&%Bf!h{{B8`@AA#bKRI{SuRs$0{K3rG(|W47FX$C8AAZtf zFgIxYQcLg~Y6`KvdaCexPo^B#0L9A5%>2q0*hLeIJ-Un2!ot5W4OxkI6St}M#lkDW z@NzU&P*h2(9|P;7Ms+}M<$tf&gfvP95P?iU%V~63ctgi8AYkDj*VEG1 zy`7HwdYlu(3~(JHU%$x@Q#?dJAJScXkVH8NT>SqP=D(3zl(N+|i83HZRC()ug4L{^ z0~0*}O7`)v=?v(-%!5tE^b7}}VsYH8c<>0WgKL74G8Aw;#%s1JWLnzV#Hgc7KwUTp z$tIZaBnAUY$cNf-j#6=Nmu!ko=Qnxl$5c&KszGbw4Nfkgj{h0*wT7#81XuN#GnAAIPqP<92SN35S(+}Jom(FDH#ARFu9!gjapjZ1jchpl@eFf97u%ZFoU zpT#S7p(_gIaLiQLNlMGY1zlPodNI_$dh>@`h9?VzS9TQ|0S6H3^BbWHaB`V$ZlHOM zLCckc&sU!6$8VNN;ez+T##Rl9W&mE@i1p4W1@VCD0O(NgO}hyzU}eBVSVPW95{u8k|6k?l|7{h-&cUxNVEFWtXetF5?7nd>G8DZ@$NrX75JYNf}? zNe&2G;!+CcMSqfR!TT?@&$@5SnU$1c&*c2s!>HwFCLp{2m zD9TD_;h_FVN}^Ib;6;rr5-NL(Ej60u3%H_L12(WzKIKD5a3<;Ylf(Z8ui=^4=yY0S zZp@;r7oLyBk$`%|X69$3@&eWt$Ibq8)lPUunfB^+PFR#<0v2^1dJBFJxWk$06=(t{ z>c@;w{~{jB$zw^mxbX5C#(i}Ps3OWZrW+YTb>2X}^w_$;U}VAD$-!ICo0FH{`Ks~) z@u=bW$JPR4BkgRE@wl{ekSq@$>cU@;k;}bz8RsO0WHJc}5vL}t?V+TWgNDdd(=URB zL+sD8NH{JeW^PwS*Mhe3pV)1)RBeHSg1aG&B??1144RW)P+;Dp_>esm?ReG?;p3t8 za0kyM^V+!6bCj(Y0+8HA0)D2=xRt`UR1~#KWDH)DyYWJr-$jzR;-DTq<-zXUz3vDn z8EXDgXe{IRjSnIXNEn=lJ3t$9AKYg|V3%V{8=hZ#WLuhVJP67x{af7%ZtUN{=3`LY znDws=avxlKkCaFQ9aBAear6eZ?^g_HzBdEar(1DnZv+A9a5i5Lo^pXwhw4E4^_81k z?lY1c)rRJz-RjXpT<1Q6wpYo`B(y4REq2)S%R(gr+jsvOKWvJeBK79K*9*mjg=tl8 zKJJfBNVpC!Y+X?u8PJ%ta)|v^=!jZS8FXwf^q59x%a=D}PEAK0!{P1QO4_$LrV{%$6=NOo%08&X6NB!K^r$z0 zu@{Lo^O^vqfj)=BXfvH2^!v^zL3ep1S}rm=M%6b#P-!WR6XxDM>hld%Q1!N zOFl$0vvg1|`Td*Ke=(yf+D;k@{!nN7@0*zyBi@2zc-~ro$ilTG$LwvFW7WD_5Bw(4 zmkoWVC8O4|_;ec&Tg#LB204ahoqYumFTuCh8>|Ek_ARa2lOi(Nzeo@#Yj-bD(S^g4 zi*lexX6X+tbMXrjt`K7TD+5Z<$6Hc}KDe~cW=cD;ShdSvBsf!!xo#CM(&?aIasMS) zn+6UQCVM~oNd={Dg8fCf3>TX{VVHquZwDaE56-XnMjsObr1bibu+FZA)E}|J_E0*p zwnNzis~NDZqp+xI${+44s!q78WyKriPk`8*xv8ch=_)SdaN~L_RWZ%s+5P}B) z-r$5o$&V594RmhQU@v|X63Od`nf1AJ;mI?2&w5?&y!+eTnLm35*RQ|EYManfZGF-j%+&NQ#Jk4J{MW?hZ{{)n9V>-gJ6eI;pZ?o3QxwLE6f&&&Gye zE^vvpE`1fL8^n;~Sm_Q4v2u1aITqy^Uk@Li>-{~o#CrJ2gS0dA+|0}@D_QY##LNZg zpr^Dn)VPv<2?hYs(EBhjxL7T!oQ@KBd2rt+yDD^4(qH&*I$QT1-VSbR;`1MS>gD*c zJ2KBWr9Imr03|1b^A0`f?_XnC`wwc?GtR3YmpsR1d4A_j)hoO#+>E>}A!-!Uv(w$(Z?``$1_S-)M?}Tb=vQx3TV_aXe=blf0+C#& z*MEik*>QzW7=96Ku?(p&X&^l)hzyXLNXW-hI*t`6<}|{abcZHsungnxmf7C}$CarT z!*e|l2Z$+H*nju@k4O*>5l)#}TMLxL`Xclm>7e*qji!r~t+$SiJEydO<+bam-WWf(~AQ0)Mp2FMHJCwT3} zDkNmK5ejrk_fz~bx`OStX&=H30d6Wn<9Z~HAvf(#xw3ETnoJOTEO#U!a7}8ae*@lQ zj6A5#?UcU;zd>eB?39$|aQS2z8nN`k6b5bZmaC-y6rOdYeBDpE&BilG`QF52bi!+U zJPS+Qi|*<6cyVLNpYUrGytzTkqDXTjQ#-pP0lZ{0hJTiipWk_Ld4p4GLA~er&%D)A zdlKJ>|E-d&2>C z;GgZqU4`zSPzz9?zf(*#;jdjzAdUa+ANi~+mK zpVT3fv?VaNx{fP#@iYCdvJwi>zpg>|uj)Z9(E8rGz1VvckBGvFg=LFkN^9#EvIlC1 zfV(5*Ld>fCoh>0`U~nDJTm&_m|CSC<*Q-q@XtMwV!WyV~(~f#_p0l@Z9Z z&zsu?#@n~60PYf*ec!cfk-*(k`mDf`z}t=nUk?aNf(d?{Yd#vP&aF)Tq>NVYUIxZT zAcBJ}-&%TlYu92w+#`n*lmxEbS6bWJBR+2<$A3HZhh3%G z^cXR(7~ZRhqY^}uirpEV;ga_G>gjCln(A#W7walDa4tmo&=VTzY?k*%qoG-SnxBvF z%4AbC7odF2!!_`Zr`{KW#hHJd&aOYUrNlq9p$8(t@X=Q!R(z0NN1+q%ZaaMT|E&@1G^3Deo1 z?@DssIJU-1IA6tig{i`?gz8+baJc=WB4&xX;r!~l#IA9H;$9kDVj$FcP34PBDcQF+qio0zekVn}J7|sj-)WL-*S8I*H+j{- zthjzwUDy&SbF!N_GBaGGi|5KCTDXfU$lBcy(ChuFB_$0rvK?V4(fjD@JykJ0^;I(v zVC@k(P$0RegoG4{flZvqMcwy$4ZO5Z8l5tgGPB|3yw{{vc3%wyK!z(0pZMTK-Pnmn z6Oe_-MZNByVS?E=|I(699}nK~EhP=P+7hn5M|*?r5GCD31P$Iv46h8g9ALdds1JfH zwCCS&I-qc-zPFPO^YrEP#q9v!y-@EdCtLy~jHWQ{<7dYU7GI5m&22?N;R* z_#lq1F06@-Wp&ISM2};xtmvo<5VyGzz zTwT2?{rEWRU}p)!dn&;vJTOUL-fL36L^YQ5>8t`@1w(gx2*aV{L+Rb@O+Tb~Xx!HVfuNK6yYssaG8(xD(dP z5haRQ7q9(yM`zxDEc|}V8bcpB)N`8GvTBl-^iJv6H(xn<%0@u%%B-)pb6Y7Y@^E2A z!PSF&r4_@P9qXU&sd+va&8a?#k$M@33f{*DCZA6(bnnjr!zp$dKs{H*^k$o}sV3Y& zq#a`_msVEfwS!)hj$gJgf zfbj=!2xD(MmDx7!l_9d9Jnr1XM5jCD@FAj7NmTrWpv-GB`6rJaH5cJX5vBVB@-(dlx)f~Y}j{ej?H%amNBDWc~Bf_s1fbpNjsR_Lsn&BW6P zb(NVS4&?yWG(VPP0Dhv#U1qO<6e{)Eft?gNk#zW7n4# zCFI51t>imY?(1;v#+34!jw+;4U$(o2BW|`kgGC7XC$8aa(X*@mMnwNfqO|a&B5X7+ zrc~-$wKJB!gfaj+&8IJOP0dPVMckC0jsg8)<2J_KTSJz%cYTEO2KfT#n9l(YV6BiR z29ijUfETLO;h+h&nYqe+KewG*I2lI85>Z++#5>dH3aaveF`yVdrFx0Qb9db=Wd{V3 zO1IX29MgvQj7>W}X3DHm7-vZFxEQ`aT|Q9Jbv+Kl=<31v+zC0ZLvF@x))5&S8#P(0 zN>bs%i{!1v!tXk>${Y2nFXQ*c((>P2@IHR8PADnNc5>Mct9Zczs4`rT(V7uCvrJg_ z<82-OJye9XQc(90zAiTo9@@2I9<^EUAUmzQx9vvVsMo|S6L-rdaM}$8$fts*Wd^O~ zX8(E-x6AG)JwaE#U!u)rBx=Nd!B4lF&+E+|&z*O{ZmwCg1~gLBeDWJ2Hwb?HSd;H|hV8rc zQM%A$tZ6Ei1fo`U9sz~L%^7o&l8&nBO*ISb+TiwM{Q*2({5L1+qcqO#=)?G6Nj@!u&{3^(>XjrHE1y=E z&GD0QhSy4k<^hcYKko|pcJ9$qZ!m97f#FDgYIy70c>eCUi0PXp&CiTaJk{1b<#GF9 z1&b+DJ=jy?O&TfHs08#`@CO&FJAsL_9JAO27mXQ+3xor)i1x}m3d5XmM`P}N_Am@d z>Cf)V%oQ)UUOd|Jm5%l~TyMN~k*J_(rRVU(xr}yTy6YPJRrwncL-IqCH9xuXXX~K9 z^o(qU)lmUt9@puq=La->QSt5(r>o>pcG#T+@D1%AfKuGY)IOUW_^3g4@z{O6_!XAU zSY&X-=zqC=Ju~@(C`ZI@!^PCr(Xtm@>XT?xrNpb&uVG}>e$)JN`IrUwmGUBWr@|zy zemKMT;?5l6DjJI`@;c70BK&fq!<<0h-We31X3oqqdi>;koDq${_-dw?3vMzGAC9o^ zwk&E-a2^gWz1fI`K~oEUvP5=##m>!6->-F^58%FQ(DvJB_O;=unmz4$&$5t3_}Ard z5uT;gy;4S2NogIiic*f(v&6id>9U7MR($beCfWL%eRg!ko)Mr&zw|s{8{O ztHuog|BF|eZn1Yvpd+^y=$g7L`okWOb78CGQ?QoWJ;klPX+EXANzakq%3tp(QFVk$ zrvd>xkIg?6MknazA_=FN7-au;V-K-Emzr?MRJu>hI*mNPX^(qEfECwI`hYSZ%-GDI zpfbdA&v&ZdCJ25VlyWw4r~CHX>O1NoB<7bkxZWh53%t}TMnGdQ8Ts~%lmP!jC6ATo zD_VTrUjUcfZ@EJIOkaQ^u+CWx25V2gRNV;`QzJq%*5zRNy;lqeU%lonY@b2zD;uyH z!+LH2`SIDQUT>K)O&VZdBVSwaFnK}?>5<-H6#`@CYv?6T&|$1%;?1&kD|&l2Swf# zKTliZz46n|+Dmtps1NTkPg8hOVQP4S{;MgzoRBNf_=y9C=kJ$)FT&p^;eVP#?VnyD nI2^x|{}F(` + + + + <% preact.title %> + + + + + <% preact.headEnd %> + + + <% preact.bodyEnd %> + +