From 6e650c19e50fcb2dc25d38f8b69a87c743485e1b Mon Sep 17 00:00:00 2001 From: npty Date: Thu, 14 Sep 2023 14:36:43 +0700 Subject: [PATCH] chore: done --- apps/ntfy/config.json | 18 +++++++++++++ apps/ntfy/docker-compose.yml | 43 ++++++++++++++++++++++++++++++ apps/ntfy/metadata/description.md | 10 +++++++ apps/ntfy/metadata/logo.jpg | Bin 0 -> 19716 bytes 4 files changed, 71 insertions(+) create mode 100644 apps/ntfy/config.json create mode 100644 apps/ntfy/docker-compose.yml create mode 100644 apps/ntfy/metadata/description.md create mode 100644 apps/ntfy/metadata/logo.jpg diff --git a/apps/ntfy/config.json b/apps/ntfy/config.json new file mode 100644 index 00000000..63c85cfa --- /dev/null +++ b/apps/ntfy/config.json @@ -0,0 +1,18 @@ +{ + "$schema": "../schema.json", + "name": "Ntfy", + "available": true, + "exposable": true, + "port": 8166, + "id": "ntfy", + "tipi_version": 5, + "version": "latest", + "categories": [ + "utilities" + ], + "description": "Send push notifications to any devices using a simple HTTP PUT or POST request.", + "short_desc": "Ntfy, a simple server for sending and receiving notification messages.", + "author": "npty", + "source": "https://github.com/binwiederhier/ntfy", + "website": "https://ntfy.sh/" +} diff --git a/apps/ntfy/docker-compose.yml b/apps/ntfy/docker-compose.yml new file mode 100644 index 00000000..4f78ae7d --- /dev/null +++ b/apps/ntfy/docker-compose.yml @@ -0,0 +1,43 @@ +version: '3.7' + +services: + ntfy: + container_name: ntfy + image: binwiederhier/ntfy + environment: + - NTFY_BASE_URL=${APP_PROTOCOL}://${APP_DOMAIN} + - NTFY_UPSTREAM_BASE_URL=https://ntfy.sh + command: serve + volumes: + - "${APP_DATA_DIR}/data/cache:/var/cache/ntfy" + - "${APP_DATA_DIR}/data/config:/etc/ntfy" + ports: + - ${APP_PORT}:80 + networks: + - tipi_main_network + labels: + # Main + traefik.enable: true + traefik.http.middlewares.ntfy-web-redirect.redirectscheme.scheme: https + traefik.http.services.ntfy.loadbalancer.passhostheader: true + traefik.http.services.ntfy.loadbalancer.server.port: 80 + # Web + traefik.http.routers.ntfy-insecure.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.ntfy-insecure.entrypoints: web + traefik.http.routers.ntfy-insecure.service: ntfy + traefik.http.routers.ntfy-insecure.middlewares: ntfy-web-redirect + # Websecure + traefik.http.routers.ntfy.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.ntfy.entrypoints: websecure + traefik.http.routers.ntfy.service: ntfy + traefik.http.routers.ntfy.tls.certresolver: myresolver + # Local domain + traefik.http.routers.ntfy-local-insecure.rule: Host(`ntfy.${LOCAL_DOMAIN}`) + traefik.http.routers.ntfy-local-insecure.entrypoints: web + traefik.http.routers.ntfy-local-insecure.service: ntfy + traefik.http.routers.ntfy-local-insecure.middlewares: ntfy-web-redirect + # Local domain secure + traefik.http.routers.ntfy-local.rule: Host(`ntfy.${LOCAL_DOMAIN}`) + traefik.http.routers.ntfy-local.entrypoints: websecure + traefik.http.routers.ntfy-local.service: ntfy + traefik.http.routers.ntfy-local.tls: true diff --git a/apps/ntfy/metadata/description.md b/apps/ntfy/metadata/description.md new file mode 100644 index 00000000..330f14d3 --- /dev/null +++ b/apps/ntfy/metadata/description.md @@ -0,0 +1,10 @@ +# Selfhosted notification service + +We wanted a simple server for sending and receiving messages (in real time per WebSocket). For this, not many open source projects existed and most of the existing ones were abandoned. Also, a requirement was that it can be self-hosted. We know there are many free and commercial push services out there. + +At the heart of this project. (gotify/server)[https://hub.docker.com/r/gotify/server] features a WebUI and functionality for: + +- sending messages via a REST-API +- subscribing/receiving messages via a web socket connection +- managing users, clients and applications + diff --git a/apps/ntfy/metadata/logo.jpg b/apps/ntfy/metadata/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d9003a1959d28c7aea6d6c2fd726866c5ffe9d0f GIT binary patch literal 19716 zcmdpei93{k+xLYeDk>y|7LkOcQnpc2WSNkJB>AC;scd5%Z4{y?M2t!)LPElfQ9>n4 z_9ZhS%h)cm3^QitJ*VIO+{g32f5KZwM`f=0Zs-2_oY(j6Nz3DFMPx(}1X*ipa?~0@ z_~D=Y$f}j_*Bri$34g8dIBankK?>tnFS`iB|F^iBSX&@Suo8kq+(HoEBN3wr;=cz$ z#?B*%P6~oZU3pS&r3W9ZykK_xD8l9a&Ln3i!cT;+nArOwh%%S=hc72x${T(tQzGspg^g+({F_-1^_3Ke3lP`uFzEtVmmfmnovZPS@ z^JA;4hTgp)?H!er5TcKFSZKISsW)r<YQtFNqG4%T?#=SHufgSCl{Nv2qehwttHt9SOSxAG%;F~aJ=b)%=@x!blO|lX zAiHRwOjk`uOUvzga5X?ZG0?cBby4<937{3+)j?BL2`5=DbX~ z^_z-bP5k3v)hlc$Vaz(g43Aw$z5nnFs~t*-d}w_c#k@_si>6NeUdA zUrv@n?ubeleB|%`DA?e8qh{?RZ1mmEXpyilPOnAIvn<58JL!&Y!*E6?5Bns} znYwru6q={BPM0Dz#7OWcP&$AV}N89SKyA*dVO}x%dA3Z^?_a-E^bL2~e>rfs99f zshY!idI25paeS94zi@FoIj~0c&5HE=ozVeJt{#)iGX2~KbMylXFiXFz){een_PKKN zVmJPE#y>iDu$?DISHnoY)a(q&d2@+yF<6(vsir__-JUBaVW=a&xSF-giC$Npibw2> zUPzvMmGxuNU>AIn(W*w@?fQLE{o`#oR@Pl1MLDOI>#)!1blZfu1GOYi*)zZO5$?8V z41yRwh<)HkuBWZt`44a6?gUQG#B*?}>yRQvcDnb;DG@j;{T=#SFJ0(94!&l~x^l(z zi?Kobybaf@B3$*qW9ZWF`wcB9PrcmM3EEw-90p^+Le_1GGG)5=)Rw74Oa`(sO7yCC z@$h5A%*zRWuQZ2;vLb`>kx(-U0*HLCv=UwDlFaZs-YO27YM98_E_{JC8!F4XPQ`oO z?-Z#j{i{{4L@-?(JG^5;kRYrqOi^D$Wj;L$hCO-EL)z8Ht3)$iGJ+ym1D2KP8LI2! z`ce|kr`9akSYKO?H+u=bKyx_5UG^Q!ZTolboIf-N?an_J>TN3zv8p4HDO-JU26#zQjld+FE0(xef|@dWm=n(cTYnn54p@8qkVOY zUj;wkAgxL_3Ul_eMWo#CKpcu#xaLBWdLjX0j5kfSU%1%Q@P5jNOm<1{@S$eq^_CZ3 z9Z#Bcyv9m9u^`c0Qiv}R9V{I0$hvfD{a&TE_rBTpLf-sDzZhI?T^<^9Nq1zeY%R_H zD4@F!-*0$tlipF+NYT#z>jJ$=X1BX`UwWeH&W@9ML)dO5VUhT7(JnHye?HKT{?RU@ zbr7fCuBA$C`%{8?ItB(3Pg{t(- z*|f#&5=Iin&X4ABZt>4{9`N^R_r|KVpc!XhjZhtunD@LG@A|Tyx*6pPN6@7*bo@tz zBaCOz_A=AXH-NxKRAycz@4}{ z)h)@Tro9Ub?wxr~tic%k@Ra0oWM|bmn)+Gt*C;>U=Pf!acU{SeJh>dAZ9`9vvUH*R z@ngaj4KHlDNlR~r%kp=)D_Hc%Ye}@de{*uEWR6IpPg;!6rw5f@G8#D@R2923`k3iP zo=cB3)5)CpUi7C`i2Ei;Lyb<^IwF3cg3)BX>_m&OCsBHvMbtR-g(oWN+!&wAvf*^+ zWrNuy%q9MwLH4Y)IhjPD)@6!PG3vwj=Dp@_9_MsziS>&4u^_b6{RY|mPj}@tJ@WEe zr}-~o?D)uf**&)7+tevbza4Z@V)fJvM@3+ogC~sqgwgsc8#Zu{q~0BTUY|TBrhyr6 z4jMXm^quOc*0;uks~>D*qZK$hLlHA_dp`+7#n`T)VhmQIxb{^j(dJD>TiKtxQN=#v z!)p%N-3Z%JAzW4I=JDh4oRYX$-JuIC$=25}y0n+;fm^!*O>sm)G|5 zX)j398xBaxsb2HdhksAWL~PNO$r~&dNwTveY~&aPsBO}%}h!Ldv=eL&sDQL8YEF1*@m~ysGpmK9&CzYV7UXejd`go zrkSX)ZRAWs--`30-O?4;(A7OdKxw5Wo-m%yTjOh2&);mPXo}g5vd_cH{)+Uc z+Rk4;L|IEKcUvH}N$G{E@#=m1ZK_!)emxowi>xdC%#unlT}vit$vZB+EPvh;u5#rJ z8x%^a02bH3cR-sc8TI~=O zx2yU}ny{f7SLV~$J=tO(vnIO((;R!>yjKidIhI7YVAxBhjN_*{aW_q3t67eeF0a|~ z@y>&aXQU&0V8Vy#d8>6}2p7yqgypztPKRy{OK6-u8H1rxQo2IP1m^>n`x0j5d%vBB zS&nyim%n|HD~?iTjd|x~HiNs#X!5S9Jc|+oH&baZh|6RGt-_`wC_XDY_iI6I4#lY#Xt9 zrQ8%HK|BE)O_BH{Vz{O(gphoYC!%%+r^8DEPaqK}!+37aFZPP6tnzmQY;Rw$o;Mq6 z6j0||j3zJodpB_s#V8(hZ!Mmy_~|5KQN_xR`N+y1`^ZNktS@u#^g>@-qKCQ&4JG>yR6014`=$}q(!Tne4GCrH)i`Q$%vc~ZfFdJ)jT%E zZk;^HQ>NYp`y2+gTbWAfK1QN6ttA(Z*O3TG1M!T~P5Y>{L#2yS z*D921BTqZOE{-ugjmYc_rDOVv#Zfc?tlZ65E69T{g!`mpVusW0TXN3DqAQkxReB?A z=tv@5!{7;NykP4DerU1x);}vz;`^rWw_lzIZxwihQShF@IDep@%zuS)_ZXi0^K~I3 zu-is0iPIOE#Juy1-KV&ZO6dWW9MHJ^p8viG7?Tg4dn)9W@k~=ED;ulhWWEHdf-9{q z*3743>Y3K_k4{M6()_F8t{0{`ms}lqu3E8p`#U%@@Q9@G_jp45@Cp}m#M%m++0xQl zI1g0v5e|adgi$R^*}IA*b)CUL&UAJK1aU9Zu)N414Y3mRZCM>G!nB{AyHXWNI5ER% z?EA&e3rro`0Sn{D6Y36U#lX`imvakFeTx(}yhr9{S%n<*%V-9Trr^QG9A|6s1h?`C z2JSAS$;Ghjc$LQOq>Rv!~5R zzzCAHg1PU{ZHA5UWZ8R%QEEwR9ndJ`Z#II-3PZ4+O$Pq2IUKe^M_1pmtk@Gh38Z!d zo6-*sctY|S5}_uEGsybLsu%_@yq6D)fGZb>{o%YB{~@2USTH}-jkZp2HJT{;GP&(8 z1N&VPbuQ#7La$5DCK91t*pL6D21-0|?PA>)C;Z&q@?Xyi#y&l_Y|FeZ&^p8m_6#qX zR}5^J&M&t2wfRm~XUM?1{!V0kgzYV@@0U`k#|kT7xIt-=7LuppH1J%5f_}E|_h*VP z28xq^ci_2mbbDM5nNbiplYGO8?_>#?!uobWLn&@^9z~bE*=b>>Y3$Wk8=DC+)cO0S z(z*e5U*qJFBu=7oJf6_`^T;%3UV~$OMLZ%E&z%gZ_aX?z6SD~HX=7%xuX=N(Yn_ML zCXjaN&#!BxvF=?zW$F<-+rg^1 zTmw$p^+JyQvcMc?KWqyTsbU9A28VEqV`cW5JEzW{a|-$BOn+h&*McN2Y)YQotRO$+h0a;6J z=+u2L0STllhl&Y8V1PNTjok7kfg33Zeu&-cS1YIMRz4g$;mf2789XB&o60ca$8)># zc#h6|4KFjHuASzvh5HNmhH2$8RLY{()jI8!mKos@K0%&O^Pga_}-1_d$XVyrX*UK~UNu0o{6`2npx433Wu`-IJn<Y%p1>m>I$J zgZ`A_yHW{ZR4QeaT;exPM?YJLOi7O8_wZbI*%^*0YcmNTxhK1u(yuoM^+)mfm5^XVUUFeiE%V?I2|Ct@Ajf<7W4n(-RPIJ0HvOJVq ztHXJNBtWp-(lP&w?d#DTab1VizkNPtw(`|%+`+>)g#!B7MZ>%`pg-?0u%3o9*m#C` z#Be`5#{KvGr_5Y?w7q16VCta|nzeF`iHs10A5{{?%jdrdEzWlbnV_#xX1U@ZIOEd9 ztJTNH(y}w2s$w`nWRKdzbfH)nJv&bLBda$slF=kTUfyUYwak^tG`jlwCZnMDwYGP> z{(K*Un5&Qxlp)&XdtupR*EqX(#5=ITW(Jb!c}Sci``N3{F$;PnKODNAhb;bLkB5%Q z=?A5%vqpC?r&vwiOZTq(xvE#QdWTcg>`0VqOJ4obCU=X@mMvV`XxK1Q&0<}-AY+O? zzIxv>BOt=Z`OgQ?JG)$M@5_e_NtDU|B3jHZ#^-FWV1Svwh2(ohV~-PNLbKBCcJ z(Znf)n(X&gQ`zfF=Dt}ghy)mz;`p<_A+JI)#cVefGv7iH>b%UAjG)ibZn=}4-@Iio z`hWL+e0%t&KYWv(iVe5&P-vUhUYQVSe|c{L0aH=i_}-n5&vk%Fc`zkaqbGk zKTWKVYk%h5ntpAcZ?NGU!Sr(OUEf0{R3;uL5n|L}fpy|348|x^wsysq>&qe*SeRbc zCQu<4&EUAOS%;+PZ-s4A6$EkrPX&V0qEb@v1TjPFLji}f9nn{7skElqw<=MVDQ^h+ zBS+ZP^byZLuk<&^^MSDKgQ&F1#X)w=-5OTZ`#H+Zh)Tg`1rlLiGl8l#Xqc|&P3W8X zDPDfLSg^I6eWtj>E@CQ?ciA zG~@$Q17!Cd+{%wCaJNCFN(7HVnKvA}$q>nu#B+o9UT!|0PWUWb&J=fUwil9ndR<_H zr3;BL%!^gRHLQ>kwtnTN5DI_u#64>Qiq1$sPAIIn*Q|}@tae)Z(KM#tDmGChi4w6s zctV9C#C4A67+b%VC2Z(ChO(;nsS{N%O;%RUTri^J#;ntn+nH!np2k7HOL-h zL^0xN5e&xN^O9AT)0}fxzATzDF&<8t+?kK@p6HK|;=+*wLEKxAiK)GZLI8|O0({;B zJXZ~A9pi5skSx{jt?9;HFaA#TaF)|{E1$wo2|JZchv%J`zXy2+O$qX*lO#fk53_#5 zAccWb+$4B%Ew8|m|04ZZK(|tJItC8PEM9m2FIfRRmsk0wRV_#mV#wKX)vS?j4}IYa z{3jtGypyiMNJR#$X<5?3HaB57g6Vy8vI6qK+*mCq5<$0iv{{@NC=eH_KmOsd)E~Wa=pU&7~%ZQVkE-!W<6dY`93>`^$0zpwa`^W3m_4s zc^RC4=;p!Yc}{*v3EG;Sd+m$}f{Lx(taT|zoi&|3udN(*(lt<4T^Mz442ojldc>)e zYg9_7MCVO2KSUML&Ht1UL=dyA+_mRQ6_W1XZ_XYVbZ&l8R~zPvK#0RZRf)Yb`Sq^u|U)Aw2U z;#2GxE1Q`6x+2~}64G=YY!Zk%AB7@=B`6;8vaOoMWy@*PdyK^{nc3N;#hHD0@}a4c zNiQS*2&9I*SBl-#PFhdJB=b8Sohe|p5a8co17LBhFfkN~Z~Dlk*AE!l2^~J&Z|dba zMd}}>l*{RNm&PWj9Uaw@GPRr14@@HLiS5awu-_lkAB|)VEU>oLh&pnf&*$>t3H6ZV zzPSRck$U_*gjg92)weUBiBqH3Z#F9<1&2G6O(1jCo&5UTn0>7=?Q%;PJJrOkayR{` zzu>49xTHqiW&GN)(WP3$|EKsApkfM@<3|uG7IO3LsDe~sXrBzbzp{6}%$a?PL7Ka) zStk;(*YnFBr{D>da^`bltG&?Xt%JpJs*+>uS<`HKEfk`iTfsuL``O|Gdg`1FBAM5N z@!WkO;X&;u*ws#yA9g;K4l&7UYP(mDx-3syF>CLlorEVr*W=9p6)VMG+qC-K*Ih4# zA?5$Xh4Sbv|NTX!+{cVk`*$IpHL}bewa!tT57|U`#iLzu`+D=WK?J?x!c9x!86-d|1}?Wxf-e|7Pg zsC16TX5Z*=&V#10?*gJIgXi4_wzL=zu(hr;#9|O7By1J0lIglES`<+4&YPdvR)Xm$ ziBYf~IUuieN^vkUzD?Vm;_Ta4W}tPu zN`sdA8f5*KwlhYb$*Omv8NXbP7;AYm^yg_%Uw-$I?xVo7Fj z8k^X!M8SCX>Ap6adBf$>5K4 zSXc*ZfAHv@nEscToG1UOtx_Z?-D?EFxusuypSDK=q0)lr3$G<{qh6)wa&a8aO8utl zTOu!9s|?eFs(zJ^{WP07GFBsy_ynXigA7Ay3*ES54Txe~^ zodLYZ$rpl;{(Tae(3dR$IhU}HTq=s_OU+nVf$a?=iSFzbWPaS?a zNeR?vvwUWN2AKOQuIK#F3C`PQE^=BIvm~VeXt$=-_7Fl0l6Pzd1AG(QLrU z?R@BBYpIyme4uohh$4wF7T!X>YWK!Dmyi*dZNMET(le5ivlNi5XUqRnH`}4ae1K*a zVncUvHmD+aZptR9+2${*xwH=%QUJHKDKRqb*J^60 zt#jql2$M?m0XujMRsZG;PuMnrDgaQ@^XC&QP6(jHKQDIUeok&(tN9=+#QEGamUGxS zkIh#;82Gl`m8s}m#Y$fZ8#Y*nDmZK9zBo0_8Tv)$zbHbb7#{!WQLJ_$z`%U8R@JX& zxy+%|t;p!eRwzRLH?AQ@rD=Rh1BvtwuwVG0FVvjU%NGix{C?c?^#g%;nb~Dq9KSE~ zcMDKJ&TvYU`$LekWJ0)^nf(BWPVEegJN%uP8x!t-+b1ZXu)Ms&SN`cpKilgxC`^!8 z)+FFV-Paka2)R=5{_GolZ}U;exL?K2HP)_W{tyTpA8>Yh>X@w8SbeJ{0z9+!<@Y)p zcGw;w5%&LUwgfsAb08o4J$l{?iVAL~27AF%f3C+&^sdm63XpNDFp5j`f`@9T)0{k= zJnp`&YXrghJ!F*rsSxk##rh9qi3L!Z-vdr8}Yux?sKAa#N?hH4psC#vDJ)g@58KS)hS9_LqHC?AQu3&@;b}csSn%RKySYlb5Ix~Jwk_*HMX&Ohz>dDTShxhrA?P!AXW%yM2^@3EFJW)7M)jZ*EBMq}Axt=aKU|ZVr96&cO=SMT%L0_A*kQSiP@X$kE%A61)Kw?IwMfUa?A$wi>8X8L|G0Nc@w=K z=od|;I(K^}?tM}1D?3`)aT;ahwA1Wjwe+8YU0|Y{NCayEU?`FXP{!^p69s$&Y%i4U z7+9jZ&^(hkx8!Qs@m<(vf?;cI;S z8;L-ydS!jz?Iwb@fH+`kl7(9A!Jz zcD)R-0OT_&j)8Xmbes-ESZzubbn+%s4O&pH4 zePwl4ESf=v!z3~xhb*+6;T$*r>F9iLK|*e?k4EpU<&}W#oG(}f$j5FfO$^uxUGS{* zA`vQqTPXfl+*cE`4^4Do0eTUNU|@Cqcyx!n8XK)*Nk%wSiQY26eFGJoliw|4u-@d<#6}4D=Q|2#0lW<^aS`FybMyQ9qB^GiirY#F1p}%pp;uIgV~hWnD)3;+Jk6Z{~Hu z1%5nt<5nK#SO8h?X`pvnmVu8^5!e9DaQeZq>UtNFs1)?$UQ7Osd$03AspzY8<$1#k z+on0T+ewlLi7;ix9gK=^Gd|wf5w$R~)nHNpbvED4!|6m_ED%5iHgb9O;f=@2)9Z)_ zraL12gI(soO>#f6wAX$F7+3C^?>Q#p{HK1lZODkVU%jt9imPvqJIwsTvyi{vx?xZ8 zkMY5KR{ETKcgC^Q8@6t2qQ>(iK>al3ok!8bGs*lPgto}@=wl=Ex(GfUS8lc6*B{C= z>xeh#W7L<9M1nPUe$fc>ceC+GJXZ!>XxTjOq$=?Hg@Ap=Lx@b6=6nOVW^k)P@}G6Y zPj{c0_&SFi#yI&=k_w!AJ#t5=n4&v1tcu!=W9)S6JbDY>g!gqx&Gq(1LN;~Iy8t5 z%~w1Kn;~%=9NaWgzzFOEW;6Us_}Lv~BC^T#+D;B9n9IW>d7jTmXmg`csEE6nU2=HE zZ_U2xw&e_6mhZYW;7jIs>XrR*KKNslis4BHQmknB*S5kuhp#e6pVnPm1v`7VGkRYj zeRcVTA8d!h!A8zzB_Jy=m(}=u0>P)p9VV~({VkqBJKSUx8rLCs{7L37*xr?m>LC`% z8c%YQ?I`5&nj`2CI9%mlf3E5pLke3uTP_OBT+nq$!u66Lj7_k?9kxjefpP^D{!W)H zzwnD4e7R;^R6!36PnQR4LnYo_@4_ZgG-{khocLDsvjg=$kHpla=aBJtu)p4Py|uK% zEM!iF)9vfDV{;jSl-=#0SQT@38Ms6SR-rXS2+w`TV^4ReQ!#Z#MRHVbimA=~kT~^u zSY2!&#`1o2iQ|Fs+H9%O&L(y1k@r*S1-(uo?|^PR7AC`^<4>=Z<)7x1?D#2cXm+iV zUa$hC&8{Qb_%9xnAF$cySYGZon^05E`MT88TxP6>$sIm6H$rcZPDA*=YqMrYbb`O^XzJ$ zb>b1}_+fUPn8NFr_yMr#3tx5X_j~-()2|%3r{o9>&>%Yv@MR!>%Szf=ouoyxrxu8V zH5TPgGSc&^mCV%_nj_9RS2)*Za#Y1sM*n(lVT~@~2KWO+Xt&kA0k3X;R2lGfiJ0#7F}@07RB8MgpTZt`y-e zo3@-gKvjr#g=QI^emXHeKkw-(DakwslGm3EZB^hUP{sBKLF{h)%?Wz}Fbr^+9sQZR zx%Zh*-_obna%Q1WiDzqVhLp`YVL;fFsy}Z;iN!Whk^G$IOs#l|q$U}fCeoVl6G8k=P&zZcO3 z%5O0vhtAF;DDxb&#j2A)vKYBH3|o{h+&%7BpHNq#HWtt&0En|LmqaiSo`AD$%5bFC z(9}wq&W~@N;oDPdVg+gShlvkG+#Y55A1@mlJJ!x{_VX4&655ai=6_Q`YG{iRl2^rI zVR=|b2uGMbFcVemKC4tl2!@Ka$DU7{UDg)Fl7JE?XNs*RHP>3YyPd`IwGzDujz;WW z)H#AZ<}smwdX_P@VD~P_QTy-tPe4`zM6Umzl%Fb8%5MHLp{jjY%3tKabY^t1wpBIx zQsbwx;6HiVzB+O9GaOxD_W|u}f4dby(GtLQ??@tv(({W0y<8~d zPs?pGd$$-n`hd}-S~?d6*>M{Jkl0|bd_NTBcZ3bMLo*USWH6Yw6@S)hY>w`jJza$Y zp!{S&%7K-r0_2Jr4&^_Br`WQ>NBQOeua2>BN@up)toEx;oGp1#;WaY8B*EPcu-DM|%j;U1OaY8&fKvgJj#ZbMnPNWKpqKmb8Dlti9 zUKANy3Z#w&Zc1H#buIcojSo=#B@H;ML4Qi1rCQ%bxkd#AKkrRo-x)#NE79CsuhaCg znu@6jGz7l3lL4(buvwaoG?g}Q@=ux`bj|pWJzy{Z=WSe3^&U#~Q>T5-7I?`M&Xi&( z#lG8jV>UZ0qGY5wfQS^rtBm=ZTfyYa|J4p98p zDWjCS=03kEJ}sw;!Zo`_k2bLf&nM0KZh8*wPOphCylCxY94TcRbT$yjpAl(Lmu!K~ z4duRU?q>+$O-Jn*2YBYl>>gm1xX%uMu5SK){E^La^&d{i8o8I)&3+G!M*6plsX5DF z`0lqsBi027tN0sd_%2SKaKZr%aFc<{8foN=_|<$0a(M4^?{bol>ImD0Xc-XZL2#qq4E5~5aiGA{(NT%n0#V&u8=U~zs>6hh;OX4 zqlO*FI32`_kvZ0==F5X?Hs;yv`^>7V!~3-yX1$%`EJ+f^^|Rtk=EL*10^ORjujnX= z@axUbxB0Lbsm)X1!;**Dd=n~z%RuFAfHi32xdBB!_3nMszeCx>kBxhJ`X(B~A)5t~ z{+00IATEai zk+1#i$ukvhMd3@oL;L2wAMy9;?a;wMR(#Y40TU*wumf&w1ohYVPGcU|=$ zWS9=Jb0^uk*R~z00vq49Tkw7&Y7sqOxOm(ui*+vST(U+=uH<;9(g?59Lf~?p8H#?C z-Tg!o85y#w5DlH<@OF%qC);V{o$KD$O(GM<25^PSBtjA28Tm)i#O#w6q&ZFoNeaw1 zrLF#Xx54!?V_lus2hQG0CXvtbhObMabnH#rMj}9Z4VYqur8YJ{w0Yw$lr2y}FVHw_ zjsTi5%b7cUdd3-0(tL-x2*@euE73&uy)-2yJrt@xgQ{{6C%PZ2EYB`pwTQ$Kjp;6zzT_CL)MBi@`?rS$m8$X| z(ZhK?#ZQev3m2il;*)`PzNk#VR0&e6X=ih|p>y(N5_2*IP?3MhYNJj6I5$+Yq>f)v zMJiUcvM@#09`o>~Iy+KEvlt*r53anfzt^ug&J@{v<_fdfzPb?ObG-M1F{+sCR<^~jJ+5yHtr%d6oj8Vim7_QzJ^-y!A8$i6OPFxE-%fWLEpJ5u52)gQJT zu>|;%j|T>yb(qK5H*C8N8CYFwu7ZRBm2!Y5o3ID9tUBnQ#5_~?~=_#S$ZdQ zXASQwZ1CP+Q23&HsVI2-<;$=E_V{5q{0!%Ppj0oRe^vzYy6gcG_hr6igY!%(`=DcL z;%@DGGIayA;6Ewli;f!a$~F>&9(gQn{Zsa77NzzvJ77y7WB4`XD zDJ2ym-!Pv`--qF~0y^6~g zz<84OC?Sws>6h-3Aat%i$g3#?N5#jtyO2vST=PS1#(%Ew8R_XH`INJGQ6)T}SG=zl#PYJwCpQAYjn_6C>g$J!qeSm&4wl>gN<+rG=1*H@hP47|QQ zWLFsfBk~*n#>fjiRN`LmyfBaK-WyDadCFTy7--7{C%4rV(v;HpR*5tqa z6FlC+1NQ4|a6KOw1y=1t=l@bhb#PGpD5}NBD>TBi;oXXc{Th(U|65s5#zj@3!5d?| z>L335bs8c-Nns%@-s1#uLpOA_gHGv}l49WH5WtBrNy0Zi2%VRLt_q94#1F5vSQfT_ zz3mgrBV52?_@eZ6M#0AGZxE9qXzQTVWI`ioSqq_}lYv!}|VoDf32Ap41rz$QMUe0=wB46+DIbw z7-&hQ-XK%1h7S&~iVHH6R3Cn7dUiF02FgXc{oM=CaCCEjSmoW zw4r6}7PyeZa?li>)mro4QyLs&7roK2HGAF9PPZ}B?)eEVK$+8=p!J_uRCVpHel)+`dF^_T55qe;lVT`w2Qq2nHLTJmmLu2m4?FAR&SbT`S?84tH1q&mL z9Q!Xb0(fS84h6t$KfL2Ll{*cGcOq#QpomUN8{D#C5Z-ptSm-_bfzkA<{H#8lB%nOy zhZ{&-#C6}LQY%rR?7e3!5YLctqnyX9sgzGtnk4k>AK#`h)W(1|vCfZ^!Jw9AgVd{P z7Z&6W9Wz=f>SsdQ;CI5IUc|5b;KRJ#Cp)q!zpLI&y_wEtCMNIQFFRp*OlWeED7kS`P*;kj=fjRUUhd*1f}oMM|=Q`nTmNT3^ds{#rmjCif z&~b_{51%<45<~IE+ygK^P8M30nVYr#Nm1`Xzr6o#yT?qiLfBCHhN{%FN}K-*rNz=0 zmir&N!-JOyD}Np)&0(6?G}gIC4}+%|`2>X!N_pHk z_Cpk3?P!dUTy~DUk7rC2r z^F|(>?5CKp#}$K7SCpXZn8a7o+#Bo`O74N^Zg6S}`!C)xI5c=A z-QZH>%7YCY)dnTg_=&~iTNn^{X1|nJLkE{j5U={wyo%>OArnH^P$>*d-CDVPxDuhD zRk@*g4`yl(S4+I7=@_ugGr8FKcem#H{{qrg=P0zwLYKMMNk3XF@zv&-*VwvaU6Xok= zFEW0)+E8mKcMfm#%uN3z*U__=Oes?6{F%)0#cr!>C*2q;c(CtcmEl_HgC{G*q+iY$ z9lwaKf4-08dPP(2bfSqla$&lPg_Y5CD0*q$DV&%+J}sQsuDRt-wm#gBpeH8ndd@5K zx^RS`?Huogfvtl|^jlwB_j`Twvyjt&NfLlp&TWTMD>YVJ6+gc#&t^M{DR#Xd_vAyV zyG2HRcSuvSyis8N%tbyV!o$zBybz6n;8`-w5kD5&q8T#zyxYcoG=;oiRTpvHZL?>q;GCZ4-}(4koz9F34(G7QOu5{6?j4vqi!%(y^|0j2-3Y zH~Q)>>te@4c_Kz>W(saah&Yq+U~a@+_6%Q_=^-lN=k$Zr{XymKlln%-EmNKy7O>~t z+wgPof#yrP(Bc(kwrhQwekTU39{~ z?c+UJXOWuYa`Q&;fCSuwP@k5d9`D5iZT2q(bAg0x7q)rnweV0{=bxYF_Hr>+Na6 zRder-KfL>d#C^5Z$p80e^8OH1I#u5-GEz+5df^K!QfBF;rn}?cM=RapzdVj52!s_p zcwUOR?-A*4nes`Y3j~#OjjTBww{NYD1>AHYv+I&|_w#Ez=wCy^oTV?W9G$+K2-08E zKn;lmevdq{6^2zTJl3M!dcd-Re~**3H)g@7tK6T3%}eG#wnqNhpc1xqg3M?KLe%qf z|5LZ@wFq*)T02$~_tN`G0RPF}A@00m>FDIW@wPXM*v*;_b(THHixx7Tx++@?iA}(b z08V8Mn`X7rB8tT$q}}4bKjLvGv%<$f9X}2(^aKge+WP8}(&1tX!_(9Rzt`UPfj$`; z?;L&jTIk{eRm<Kko=E#RpCMoX;ax#gUWpHAih>B!Clt1Cl zIiEyKJ=|0{*5$%TJr};)em*aYvago((Es=)C8UJSyZ1ja=kRy&v~z&#Qws9g4APl%~jul@3i-@;YlLvp;6 zD6m(hn~mB3ai&f+CQ3ltE&N*YEy^m8c1=opWLRIocg$+vnU-Uw0`(_E;Zh8(a|v?< zSyvxb-3JE+_xyW_gWef6I`@&^MM-!cumCy3fm=1c)CQY!x6%|EV1!Bb})DO2yn zPYC>7)`H&&W>J}N; z7V?EK-265Ul1EolGc z57Xy_!L=7|$}nGe^JV@Bu15T^c&?D^_tbadphp-N{*&tU?X!NbD|WD{n`VQ%h2g%O zO~uy8$u;BcvnHl`2B3Z-sz^=C4!Y*#u0@87t4_ToTE*-hWl&q?iWpFOW+S>*k z0r4Ae7!#>FVamAJDb6^jqPrEo9I)Zriu2F2gl^S=a@}v^dPR6C-rJ@7dh;kN%5PZ4 z_5H)Y!`XI~@h&mR$O)Xm{hxjLQ4UUh0zhj*Gea0kqyN=ILtFxww&#MxV^>^eNoZce zepLPv&@U%^rUDx`NP+u+xfeLDWW&7R;^Y4ZB{na6(*kr|&5}2w4NoUMTebYb{k)#a zwQrb#K`y}bb{@l;>0c&%_yJV1G)YAhc&O2<%80&`+jiHLcvkuB=K8ny*o3^NB3WRd~b4Wjc)Y>pr#A6WrZ7bPXC97FtA*7yV(phx}hRQjp4P5?V4Es zJJA8(6o5((^trKK=<=QPE*uyY@t2&B%~-cd7#J`N<+Ii@lz2xiiIuCLXP8!evlFP_ zq3+ELpy030Dz1OPmdol>emp>xWPk;m{``0QvS~y7y{t_@?W!fN5hW>!C8<`)MX5lF z!N|bKSl7T**T^Kq(9+7t$jaDE+rYrez+i#B)@KwAx%nxXX_dG&Tuhqe57ZzDvLQG> zt)x7$D3zhSyj(9cFS|H7u^?41zbJk7I~!na$`D=^5>XPASgue|l%JNFld4csS&*ub zSx}M;EYIgW{=~yk7^b0d%K!8k&!<5Q%*xz)$=t%q!rqfbn1vNw8cYtSFe`5kQ8<0$ o%84Uqj>sHgKi%N5z)O$emAGKZCnwXXKr0wLUHx3vIVCg!0GAXkDF6Tf literal 0 HcmV?d00001