From b3b64806f65a149165d3b58419f8a6d068a71ff0 Mon Sep 17 00:00:00 2001 From: Tola Leng Date: Sat, 23 Aug 2025 20:10:03 +0700 Subject: [PATCH] feat: Add Pushover notification channel - Adds Pushover as a new notification channel option. Includes fields for `api_token` and `user_key` in the `alert_configurations` schema and integrates it into the channel type dropdown and form handling. --- .../public/upload/notification/pushover.png | Bin 0 -> 28086 bytes .../NotificationChannelDialog.tsx | 54 +++++++++++++++++- .../src/services/alertConfigService.ts | 8 ++- 3 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 application/public/upload/notification/pushover.png diff --git a/application/public/upload/notification/pushover.png b/application/public/upload/notification/pushover.png new file mode 100644 index 0000000000000000000000000000000000000000..8e7b04d7764964f2969dcd0f79434d9efb0996e0 GIT binary patch literal 28086 zcmbrlRahL|wkV2gfDqgX5F8qJcX!u7U7;O_43?m>gQyF+kyxSfBkyY}AaI}i7s z^Uze!Sz`{@s^+JHoH!B!E&>=B7?Pxfh!PkW`0d{h91Lh@bYU|Lbb+^%&~yX?L+=0k z0Z*hs#sdR`8ZcMUaMF;K;R4!P(;FDs8XD8PS=)i2!N7R<-Rum2mc~xRhQ_AmHoO!U z?cEf_=0>~}>a4O1vUbA8X66ze4#vtJawVfwi%d0kNC4m5n2p z8!yE_c)38||84^)KtK*gCR|D)V*dsKt#~QSoSf{q00384S9(`wdRqrm03# zaxgdi4|W?zdV_yDwj?I{jnT^em$-upGs$j-^i!SEl-|J?ka@G7>>K(oK1@G<=d?7#N@f#m`G)vlHKzm)RN z;@?{N&xwDj>|cQY%`E@lO=Sf9kD2V89jyLw0V5#5*vi=2*v9Fvkr@ANBqJb~lev?X z@qd{}(8}q5nh4~3Tvi4)ro0qxbVkM|2F_Ma6nx?i21e!}T*Q(CmzNNe}seEzRj{u6qC{SkBnBr5a2MFp+6 z1f8ACY#sPiY^@B4WsGf1dH%xuzq_D7_{SXoM=A$J>VI_pKbUYcu={U80RrRt$C+&% zRBUan_=F8?TnvaQm5gnSj2(;}sECbhfxIGu;!b7;4h)=EGx2f4zp#-ZVMkA0%DVa$SNT8tn!E)Q{KiApLdpfITUcBW8z!*sq z>vlVqbyXjh7LWYCnJX@r%e;7^JA6QkU>w9obKl|e16_d|JTyn3iwsUpfDPzI0{H*m zWzg7Ty5|qX$F49~${&<~cP&vcRZ#&Iuss035naK_^{08au7w|Fjb(FgLUQwXa1b~O z#(qvd0uo65b;5l)B_rV%LRX2@aFklFuJVe+n94s@r`@YE*&^UcUyN~;4XtTlcvvK) z6(qtfw7$|&tL8`sK}jejD#9TNKr$edV3{dkf1C2NK$5`7Qw>vrR{{U|CZ8Wz#zZNE z`5QtQ0kQ}AJKl(kNK>E% zM(sT=s>@M-kp0j4`dupYQwVAA0oXvXfVZ{?PB5;dJNCTbV}B-D5fn6z6vN!Al^cnR zJ1)tm_j`n%&kPc^h5RjxK-iHq0XN)ORkKTxhk%ewk7%H#mL4hQd61D<`yFzbrj9^lB9ud^`9F~1S}7R7 zjzkfkn=a@mDBBUtq%hP4*idiuWAOTP^kDN(vE|4HspY8Vs^%bJqx7#8RhV)6ANt9O zW(yZ82OX-sO$6w7TAuOLO1cexhhA4HSs3t+?1FNP{a!^P4kuHa($|4xO2G9mg>?uc#= zO1-ml_p)7*k!~ncQ9?yddfjYW3*bPKK}sZD)tKZ6o+P7yLA%#iI)xJq-39(tE!Y#z z>6@E2s%<)1`3v`CBfW=m7U`1>aw|7)_N z_$Ljk`4z-6*Cp?(qKu_!D-!FOo$a(B_FH;5ISeDrf!a$(fi-&;G&%1cwJqp`P?bHb zH@eyv_UyQ()En|^5RKoQM@{QL-P8`gFc57=@Q!97xbURE<$Dt1VI)CyxsIkGS}bUk zuZtuSw35$py*oF5Rw$<46)l9k<)zM`o(d!AKIp+!ddw&0SD%Od%to@YQ1#Tvx%ew$ z8Oue8C3ns%e(=wiPFPZp3^-fxDDWbK-R&Y47YGz^l)MTRc{P{u>eU^t1jgzCgf{rZ zg>Rkqv0G&R%+OIqOJAxTGe=b_cxs@Jlpa;VJ^;l|t5FW*5g?`&%rqINV#f9-(6*I( z(8Cbhm#)lv$-wFmTuYAF+YjgY8%&EmfI`3IQU-rE?WY!CF~}t%qw+y`!I`;aj;44g zsJm$x1ovDBvN<)*-`nM3xa~$^I4LWkVLcQp>G{yx<@Ip;0c!{JWSpp`pkKwd`BW}o zH5VIe`0NPAR0wH~ipaE*jFcp|Rkn2eN&PWT_3V}T(3hZ{AiLp3l3gcl-B#?$l?_0g zqRzK9P;8fW5p7FDgeuYQxU8i*V1jvC-)A8jRJO$}V}9M)jtjdc0>vEU)0+h=8LxI`BKz;8Dnr^Mvh{geX?h z5nl%>E9LVMxKE{BGWCNKphEwUD~5_+ZE8Gyp~)~u3ZYe5q!o?>0y`SR0jMVl<0iJ< z&2s58)mhRs>rAZ72jZ2z5GZ*eli2GVkO5YpbI3?eg3yB*{Glx2zF7TccII~?K>iE@ zdz*0?&2f9ufdrpb4UiVymx0=JrU#NpH*yPfeeKolDXN0L>#HJ7H3J3Zz2+)iVB^N+ zW&3A7xDG5chs@y=rdU`)a2phrizB_I%L))u4-nEtR`;v#Tn9+m2s)Guc-Wx?+=CH8 z;9KUw`hLwFmV#$DRgkGiHSu-svX# zOxvaurZ?;>Nq1zbDSOad@>9NGr7j?{2=@wpK9ZMe_XC!$)|{IQ;q2982yN~^n~YP3 z^D@5L@i9Phi$%Z(f^Ti2+swDTR=vEo{pHT<)W{kv#m-Tl>+EE++%C6=HfPY895^P8 z?spfqA=~4u8;-lshHTV3fZ$Qsu31R8z^%>l81iFm;QSjq`6&XzDryzU0o?^x_rl;J z(s$@i!$$hEpPo>3B|5ad0|J33GJ`2^aj@_0IS!Eko`u$&szqnw-6V`#gt;yjW^fMS zEg-t90P~>8qRkdt0ufcksg{QA?g_>Sf=95qb{yw08a?a=^3tg@a6}la0>%b!u-*JE zU_}?Cu$lS*y|3g|N2Rj+x45VWinM$8>v+mOA&OZDB7h^ksmq`fhN6bk0=;8K+nA+6n{MjGp+xxL1H~uHi9ZD_wf7#d0L_EoMAQ+6m zr#Uh%vNpf?C3L9^0+DW;07k$EgK6a3spkA7s@Bvn)^14pN^`Wo#V+NkZVQ=}6>&{K zbsl08!3ao(v_XPs)%y1Snij0;zUV*Z4}|93AqSjCKIt(?Z+-DctT}fEj-7ZSx8Uyc zb7L*6(%BgI%DtniwR>pne9@t-(b(cSePJ0qO)u?fM(tXtt+1^-VL0fi!SoPmtiZ<3 z96V8$oBo|F*u7Yeb)1<`cl}35Illpbf$%ws#PH<5T21@`gBa021T-| z`{4Ac-Dr^@)?0l91J7Cs1s6o|zLsVXl3mI}j8>%J0g=&Bzd)!z`EQ_$AArQ&z_!d4 z_oqIS_T2ElH1=->w_l8nU^J!zQ_H0te{tT_=9ah0Pll@vAatOUW~wbX5{GU@s2Qdi zOi{uXxZ6~D(pk(4sRXg)4U)c}E6E7=b1U|(^wNacV9Jcr7IN^U>-<9H4sEUdT}*ud zp%7hjdGeoeeCTVOE!rN}%wcThT0)v0{uja5stHkZZ4|!#ikwiH)oU3g2tMLV_btjr z_XtLqCFC`g%e{8XgZVQ%g24_Znxn5XwGBhCZ)BIEVeR?L4R^D@&7U6QMv0)G zS^ZuAdI00gceEo@$Sa>^-tMX)XKZC7==I$Dfp+Lv*PnJs16K~|uO<;c!>ke5!~Y;< zBH~%;@IqM?a)iz$E2G+gM-7IxGLmbhLDQ?pUbyiipT1&1EC>M_X%d?xQyW6Z)c1YE zmqZg8$ydB(jAs})LEW{oW z>m{L1eF^ymm&~`i1q1lP*DjNgutdUeZmQf+XA>$u&MS~h%h3wus;;pt^0lg(B`^*y_V<>Y%1*X~odTCx`t>;z_i9Ao3;RA`vS!EfZtl8p zI*}NTz=-A5tF94OXynYgj!E2j(jJ6o@EM2p!7?)6;2w3qtAE7#{Ya8=kjw6dzM>mS zCGL{w1m?6>CRxX;4@nO*^AE%i=n}s2tcTpHC+Bhy429a%W>8alBJqay3GA~mDjz(V zE-0*0C>8dpRC!TihuT3={ColH=iJ&2?+#P`CQ$u(d-t!@DcMO!|VxcoH%iP+~TNE?OPMlNKic4`mEBHBfbiYZ5=0h@d3zkW`> z(+1!1;7VVnyU!(&peeXX)J%gG`hr$!_3j|p^+VQ=c`yZ1NcE#4E8}>-^Ne~a-$nN96su4=wzdM3&YA`f@V-NP^Y?dt&+WnTXRN9R z89Vg~YJ;wKaW`x6h)V{2S#^rfLO-rmBgoR&x8)Q{IhQ8&o4Ab z)%n0<8~wy?tk??(q<{4HP2sWG>vMLujbhuRb5co7z&q{=*2Vomyt4m^Kk{FZiUK}S zd+BeNuQxh#bB>P8pVTtmE)wq$zj2r7 zh5n5=$Tt?+UlA&Dx`Ub}Vx;|W7bQXXJA&ZGP?4$#@c&dh5|BrnQo|l;WL(X~Kls15 zFPR!fFm4yU!seN}(3|~kjru~4u_=_@(6A}ap*c06HWtZ94iSVB;MHhtUfnqNptKDA zX7WwUCj>zqe7tHG8|1~NL}*9{&2;P5+8P&%)6kvclPqqR(EiIBCu`WiyaKr(8j=0X z%J3KJwxrGyL;j#BO!fn!%Iaizz8z{t9&Ln-q;s17xs$wfx zqwni(hcjV@h@jZv>ijUThj4Z51@`=M`^&BwOM`y zpZYhJAN*hUc&9!PoI(4-DDfO~8C-y3j}mgtpyFqxheJ&%3{ANNkz)dYzR($`xPkRzvzTg z6^2nB5lAyRe)fTLYMC&UNntGtN(FjFS>2~j@6Bf1mqZDx%18_a8CCGe<02R#PQ|Nw zgd}DPgZr-FUT&T^@^n=Se1E%9j8~t>YeTsE_&uP+m~68DxcXYYn%E>`8|c<1vn8DH zvS~TSx8hmhDHcD;O+LVJoWlVdeSLYRe*FdS8N%oFl%e}{q_$Mw`jwZ9sq9+v>QV6U zbwuN9Q-yC^eDWQc*Ss`u3+_KTO#O>b?Hw=mJ|i2QjO}eI>!9fYc6Nw}W;P6RihoC) zgQI`@;(33yc`_px;i`@IqHE>s1M;ZFs_nRu3@?kfSCgGRx6)EWm375H*8@n}P z*@5Cu_&g&(sm!5*6*y$KPysITjHxfXK}pzvTdHX5(VHPz=yTt%lg}Gr$McbC%RLlR zTeAY)Ck&*OR)BGoHfvW|FNt$hjs<5-pp>~s{^S)Ja17^gR_SC~<=fmKG}WqpJGVFI ze(;7LzZJFJOMM?t^D2TT+#O{0A0376G3S_AwIu#4P@yY1LV=oa&KyXICGUB}jh^M+ z$#9kku%9=6sz>g8$A8^xHRx(&8vWjN>gh@<`jw`OaE7zhhkzpK;v)a_y>2)h_AO=a zT~DMt+PN{E3H|1~OdAKL&#gu_8pQx--ZF(bB2H-Uz2N>racHZjY}B30i?$i1hwZN$ z{yG=EGqpucF)4S9+f7RAbzX7z8f=a@hnE)_QOl|?QD*n4%cqVa^^*pXeED%MKSC7+ zw~q;+eKt~ev2;0IOe+TnAp*;E!vFl80bq1Pao~-e+03*TW{JxdFODq$C-A;S4)|Ov zyK@UrLs1XrrBqQrJ&o^1>GV7MMrOGoZG3n}y#Y%~PG4)}V#A+z8oM_fx)Rn^)!Z?7 z=au~sDeDn2l-VQXw;EaZVc zxh5R-4v42t1P1~%={F)T*BgO_pVy+N{`LSbqiEQfU&t5SGI%%#%`5G-EGlD?Pm55jWq{B>dlWgVJzm5{ECYyOj)wZ~#wOAjmD4$^3v4cIo!xhhwJJ%OLEI0ZoS z1GDd(b}gW~bQ=E9G^oKrIt=22QM;kikgCSR)IZ#Zw`b7DvXnapveW=4Kh)zpNPpD+@>M^eVSbJ@4TUSQn4wEa6+7o@Eldqp{?Ult~9f4r)y z7MQk{U)%WC*BaUgm9TvsBe-y!Dc~4t?#E7#x;NlTQFlS6YOf!u>dbOA4v+TFVA7$q z5l*9_>;wOF@urj0@_S^XSk^xQWjH0~`YQnzZk&*}keLLAK08_PvyuJ9ojofknVR`V z0Tz``t}2_0pAJU8`ZUrH*=aUlkOHY|h>Kp~kL(E!#>1=xZFQNJKJ_hv-GORJeRBe! z!&@n0ws`PwR#U;~gkVWf=VAtzw*_2|Rr%3Dg13hz_y~HT_LlIFGUxr5*+o*6sjiC&ZTj!0OmZiy2aIXZveIc6Lk#9^y?~|vx zSZ*#Lh@3L}QaTBkCk`DQmGC$A#4Yr%wjp@x%X^5}Fx|cbvnZMlamE6vq0qDY`r~)< zxsWO3!kBG6;`(s&`4gs-mHF=YAz#m-EsK)ldJjH16RcuM6u26NPf-<@yd~*H>s+Gx zfBR=H!;R}5Gs#9QqTui`Y~k*70QYPgg=}L6kG6q-yt(Hocf~j&aLGK64EMBii=Xr? z>gP1ckauir$E>o_qis?N=+}i6>;&IVz^?Sy3|Gi%*+rGP%w*NRJ_$o|-j9O{JvqJi3WXoF) zphdu})-D-I1D+A*W zle_7JbAr@$3AHci37b#m3GoY!NO93(>^ZO8_uLcgqPm6!&kj$AjECl-)RnDZ!`%3Q z-nJ~ip{4`(??C@hw!>v3n#j(ov%rx>qKWIR0|=tbq^+eZ#+|R(*hCLoAa~?xr};h~ z^_vwt|Bu9$*OtYi;JrGWoP4$I_4pgBJ-;tXZ*5h5%7{WX`a}lqq4$|R7p_;_*W*%e z3vvJKs);L*mQOq&o-1hXkvK~hfYYe(d~30AyAPjgM%f&x5;MadnyR21 z<=c_#_(`UPqFrg=|fXKisuo6wjj=a#WDzBLziJ)^k&7CK?OUUg_RZBlynIub zrgv3-K6n;X!CEnhvrk?8V0gNr%UHSeN8ozt;&yyZldU*kFH+EfzqTb!Slm^H)|;k4 z&ak+G-+eSv3sSmu;6kGw^~duZ1DXZT#wsp~^+P+wW!F82Yt{JGrAa!mIs}Pbhnbzj zXqdk?yG{)9TPWe50D7oo!-tG?)TtPB`s~cTKIL`!Fr}^3Oz5t6g(UH&JskS)x@F&* zycM1{fSM~OyvUZHY?(X1Qqg9_?ro1lR^_XNd7xkxUAMOT(^d6#5I($xR~wF8kFf-a zihR%56cOhl@96wC81_)W>6x}_n1vD+UvJ|^HtOz*blEe=qe*ix!PCsWH8>O^-2G!z zGTsoMle`0q!1&0Tn8<~|P(P?nLr!NpUSj`_0^-6ob08sFSllzi-7WydrN30Vh4;4k z6QyhQ_*K4X$nlD`r*X*eVpR1`M5+BEqu%U=-tU`QPZ+C<+nMFhl(uJj*yrC2gqQcT zXpbZzC|V~BMubN~A7p+yzTb*aCcS%sGH#(f^3CM|MBtNMGYrl2UG%4`q$@r&3!zp2 z;R=&%99h0-tJ*L<5;~G+&Mma6z>cITf?727+X4~IAnQmAWWOMk?9BL`a@+D9yP*M) z@x7k>zw)_E5_hl0G#kECldB-IB2!S>5GdGq(XMfu6#;vPOk5>#gm{=UjDy z%YymrMWYL@J>q&8gPb^eM1*HTg~eWU+%sN~I71LFe<$&5x^avuV>EdcD|D1dJqkHg zA3DiktJBGp-KD6U*iVH|IuoW=T%Tv(bB=p|4Dx_-2}Av|ck~3!Ri`0MXW<}FI2&m> z;kVh9li*9-m}xuaLa2lNn*zqIik_uE3K*KMDdY6K#y77P(us~^$wN;ATO7E@X=YBJ zHjk8XV=sR9vB0(2WoA0NnOEcGGAGr>^q2gF ztN!LqzHHMgG)=;FEn;=@!?m&$2DZP$8MeBv7a?dsE4`K&$|a|tBMbTinyCOy{l@%V zA)q;o-*duy*R(`oE!yiPhpU^?i#0#4_f{->)8_Z;Uds%phKSsmMv{A-qt9E+2?GGD zEa04q2zIb-!XVGwq<+X%UWU18<*dpq(A{`IxsTSuCU+fa%)i8XXPJ%W0-Rm-f(lBoB~XWqC0ciX6(rf#;h;b>(7i zv(;!d_0GEBOEUJ3PJed>FWdDTtbM?ptdj3NN?;)GG{xsWo7VXjA?rDzKI|Dwz4qeu zc<=1%A?_~(<|DyZoLnB&2U7B(OX6^foQT`yaFcPn?Mc?==Q7p}Va2Hd#HgWjZuXbs zqguWXJC(5fp|uxm6Jmga)|99-#HC(O z+v>O_SKjbpS#tr$OAHizsCXqrbM?g4c%r7>5shs4b?-4e=*7fj>)Ek^OVHze7agj` zXS1ZUu7eRL|K>*8;UL4Lu+>qnZ92;OOcRD&SCRP1d0SaV>xORq@PvpU+o~~#(K3S& zsRrbi(^}AQlxTZmxtenwsJgAk?(OLNsC^U~Q5SG7LD&28Wdz_yP}Rr5t=v$7{Udf# z7h);aOiytva2e=T#hp9yG@;JhH`1(*Y`@A}c!C?{4$`iX*@eGPJ^JHSeVz zq&+iatWWbkh@jg%Ss#DH{Zo5`br)*1-?qrq^k;r?ke#$@Mg1-1E0C zk=z(7X$cp7hO1e?Bw=RWukAf{%BHdI`>D_T?)2(2XL3M7uNq#tI-T^xp3cd`r7663 zL!5ih$J~}rR-L<@h}3Jxpm*cNZOGeu3YEnV>k!Pk9nJ8~K`4iWxQB6?l79%WZr(E- zrmJCFEM?8ZIeS1eUH#CYQ2Xp+dZV{Ot1po6OXa2pR2P(fPAxTrI^lk~T;SGhm2ko< zT#DVQfYKCVPm((;Kouj(a1fNSg}rVi5txc=DPXhk;!fDJmlmtlMnlbUIu#!%v~#P=^M1h0Y|JlJI9E}&x+~geJLA$G1z~nDTYD(1+f4LyUhgSnH%0B6 zs)h{JuScl{K5Z-3>~?E`qbBViJYq8_**GQ)dwii z2Rf*gZcGL(rZm_c$4bg&|M7wU5C}(WNa9N^9J#CXRh*kSz*72ex-&0;aS5T z(!M>XX+MR7^%oY%q)k(+BWsZu<41 zad=wK!K8v7+v_2ORu*S>4sSOH!d!+gO<+x*T{3UBVBDWZxmg zXa9AWqxFzIDxvUw{vLvcy}h;iV?0G;SJcEYL+Ft`xEvc|NBW&vM|0(7^aB#miHd>vJK zypiLMYFuQx)vyDJwx#hm8nwm>Dd$*pQKbqnLBH?d0s&^#<72iTZaY$Sbf^~w2c4Ur z&JQ#CDLCD`Q+fEtGGAyOLI|h0yUPith(z1UWVNM!abtaZoYbD3ZxIlv9KJfx5i`{t1F`))f{FBu%tL`aIYTFyX}`0lRJq+!HUpg)~z007Wss4IzE z{KT8{vK-5bz((rHR#Yil$=2P;C|VER9^4p0A>ZQlq2OQfwY_qYMO$YEck^LAw&P$U ze|q&3EJOFNC=p(7eYDd0x7mJL#5bD6j_)Plox9p-BLS5X#x3TSHkkvqwlcL9(@Z;& zRlaM7)mfmoSmPQ9e67^x{V>03*1Gs7?It2F+R+h?Qp^o{3T8x~(joJ7 ziT-u>oOTkoiSfjht*9oSp;)_!2%lPnZK`2jb4*TrcXM!&At6!M9wrUNO6T=VMzk)? zj@hX&39?+cGlU_ka4Te9lCO!$U<`Ttr48}5X0+mamvhy466e+U1T1sf3&~v2e(`vv z@|ct;kj{v#dKj;cLZm}d>DPXfdWz=H@Ze|5`J)F&ld;e$Vnj*35NiGAVUMM$uz><<<~ zJR;akD^b17su{#Gv8ZltvDb~e_h4p94=8TEQOH_{G${m>r&+NLw#LY)-56!#wF)s| z&2fZHh=n_ekSnxJq~E<@+Aw~Gyl>*0OXs6xkRCFMIhkm=*JO)w$oHSJKfQ3}^7tg`KiYxV zx}i0zX)*VnNrBBNT3SA-)w?P30-(n+8e@`va>f5~uGolJm6ly{Pbag|^_71HAU_*? z{bclFO`2OJ4nyd~-OU&)R(cYnR6Q#cng96v8tO!AY?wnn8q2jY9b1L1aYbjrWP&g- z2g!tGlN)>dUuv&JrM|ECl_*-x7ock7J43aAZR&w+Q`3X3VL7r7PF-MK^|C7D9IEC) zioSE_aqnfdAYFsjUrS&!(IolgN-!Z_2S19Z3o-$z`QU{+(>;=uK=cpvE+5wvEV%pW zJXR@pOMg!PD4K|by6x!ZLUWnan@jHOS+A2sd``%0`}D*9_L#BOii4`YX*!Tgc_xdP zwyiJPZDsiLyIkFnDd?;|WqQeKV8OBE09u_{z%2+ExPRLRyMMv-dYWMwHBF7Tu|V2% z`zHVJ!yPXOv|Gab(|TeNgA$2n4ec!R46I%$%<@p&RB~_W$7HKjOFyEq&Z@oJYFR24lWaa2UkZpTzjH$p$YU2bs$JzyKq0{x9|q!#Lk=Mf zss^=xca9&235>dfwkF=a5eRB86TA|2wyw99K?xW>BD&!;+44cXx<}W^W2x`O=AP28 zhJZg}e25Z-&!0GY#?|B4ue*t8<@V-pr52pYsHU}ZC8Dxp+F9?iKnp{nYf=Q1*@{~p z5ndff+OfBrTYZ&s4q>$W4(>fn2ORY`7L24AQ%?3vU!ai0Rym+Ou{h^cVkl$%gJ+!u z#G9`mH_LY)uYAeVm4L}96{~fwLQ6fq??B;}_cYRF_I=o~UN);j0&ev{v=zRAUN%n% z7qLUX4u-Heo{Xi%t?}>Ol=y$s%U#0bI}bMM@~!Eq$pt7EYB2Q~x&u{u-R;qi>M6!w z*Tch=FQX>X13%i~_Y~_NS676N^^pu|4T_?~!u7R{7Z@8mV0~{47nU;TlN*+FET*nS zreNyR+M`80&t5@KbI27?E#!QimXbqgrx>gbia|wOuteLB;V)thZ*H{5g?kRXSn9Du3G=F_cp>T)dbv z3sV2YKFb3^{PBIs>=6nKuL&{u`plne;z87dT6C*aV7*b1CgQKjYzOzdiqz%Y!mSZ^ zHblI!=ZOF(kbhP&Pt%h@GBnFw`ODQO#nB&hRY9OJy2YlQqyM>{SY3Z69?G~zGaaTQ zl}y;c?;nS|VOgZCO0!jS$+}@dA)>LH=(#TeyZJ*`r5V%n)0}70{n9OaG!>q?`(s$C z2bMdYOy=2Mzdu-+fCLjilL&>yMeZp!p9N8{5yqammnSolEg4%4eSgV)e1iEv?f1%* zVSUqZ#RaW|Fi!SMdp`d@ck#lGMW3D;;9ws-dIS4Z`!m=Q0vinH)*K|42hNNxUDL*5 zEQ5vj^kR+e@BPb~)bwpIzBV37E-lXrDTm2v2#TS6B9*4G#$&6936`+KzWh!b+9-Gg zF#M?lsM`Z=7OClXo4|9E{$UFV z>ZZnJmZC9t&CV1cDIXy7$}azd{#zJ&iD>2~t~Ihn4;Az+E|a;g)u0mI)Eiu&my>8* zfdTwjD*U*zw~5>X7p9lFblXZZY8f~39(MSzFXz25;WR7x%#k~mOUy?OTNSysb$L2; zT^9gkiyA84s`wUJgd|vJ=3acN_7;QRED!i}*mw$T4NF$x_AY!eSFML7sURQsSTv+i ziqv4LI*8q+Uv~3)+i|9oIvx;2Vk^{dm}!GA-6WJg(YC^5OJOBQz1ez!9j7fZC^x(! z;1-%6l)BTX9=*bLda#h9;j3lBDa8dJ67$MBjX&iHF$vUS`H&;{Jz0C|m({g7&};^t z1Z7X!OS?!Xf$f@MIt1_NX#>*Kve}ZkA93UXtNeXy#K6|;4HjEb3QlgLqo4M}L28T` zt-TS=T-e@k4dKs$i3C%JchNM3%Wxv5U!`QEl(lNB2AKYEL@!+0>Y7Y6a%1Z7Zszh9 z1sk!{m`(v71a6u8L7|BPV7AOZ9B@K({APdsxez&*g{IjP?bN(I!BFjQ)3o(Xk^cFh#6BlqF_w*z&z-Ns zZp3)3$FIsSnpQrJ<>&=r1qG-eF{oyD=av4AIsXP_-?HUJB5M|H`u%)BRMV`JI>mpa zAh8oul=?5GlvtID6ypWqYS*#ilMY*>kd`8<4e@!g>$KH-@$Q(hUL4E|ofHNO{oezp zMAu99GptShwQzH3#4uFcIod0U$d-&Oq@@}*8Uh!1cc3h9Po@1Uxv8ke&`ae^9|enK zGYEPs?FpI2H2tpKhua;+XXeDgX{lqg6He3_vJD1Q1X#L%^%zrx4pQWS&=Z#WhUrtG| zGvNirI$@XlRYr8R)DHHoF7#RKF7&flK9S=4WgUwn5_h9Ldcs-~x(~yLHep*N>MOIW3kk>x9C?rwkRFs)XBd=#leG?{x45{2Er)?=) z|EaT}9;OZx7Hl;3d?3wCQ~7wiqEZl5nmK9yem{_56_g&*urLpQgv%fEKvxl zH<8Wn+}m;5Q8}?w<`SwRgLa#t{<wMlyfV;W`IuD+A`N zvWw7ldNVzwP?Bc&y^6*1xr-bW4T?lV=1KTDtB(0>7m8?y0^}=X2A@k-c*XO5RjfVR z`kF| z2dVY+WeQlkiSKI z{6VFhb0}}@7YErk(}n?mRBNQ9J*+sGUB%mAEl)hh$_ zOMLD0=4*o!&9mHpZW1$>C5TYa{c9Dm^_PIIpRarvwdMlEntza2pe5dN*g@?s8G0H{4kM$_NLvUDh3^R7Fgf zX-5|9o3|QOe7y7 zT_MFUy5|@43NeL_S8ZJT9+CS#Ee+WpnOgo9Vi0X`)1V%&KgCw&?f%{)oaTU2tn(7; zSm0qV$m1A4<8_aBQai(<=cn zJVyY6#;R3)*EcTZ)J;hdB1 zY0##woHLXB2(^oxTyaw_IeBdcc?t@*`bNLhj!)!jOp%p|7gcE=*}eTSYP8KKdjK^A zp8b>0;Zt+DsjBCp(p-T+D%EhP+oeD3Td%b+Fw83{?}vEW*7TWpoB0+v>W(K}I-rBJ zAf0>pcvCBRPq=1YJ+^0ZQW2AGNL31{lM64VX;FTh38q+oDBNW;Rq6lzVN-J{z(xwM z@rB>)!=vT%uqw;7GL#>4>aWwT-;FP2B-d=AmFG3GX_tk1=sc6A zWL8@@J@tO0nnBfqch9Ttan(=MI@{SnZ=*8bSKjw(>i4TsmIxuVjJ{Xp&q0w<;TP6l zH>!7+19cqRiwMIam8zzel{?kdRXl zW73?E=fI&!3ZueHR#m!-`nz}d_@AN_F~_iAPeKmN%5%NshLyD%uHi8i7MEZ9JS``7 z{-GXa-P0-}a=arboH_a6pt^D3g#_w&c{bEbq>kr*Qe)9N(mrn0L74|~O+udy@j`o$ zut4*0S3U;PnJ0~hO-L_<7wgz8r|){n<+W035`0_u(fWPH_p4OCU)|);&m(Lavv&j6 zE^5o=`Hh0cvf-UD><6Au!{zCcicAXH$3NT_%b#=QT;F#2KCZ503M_ZS%gRDyir4f< z)yagj$vwoq`R=wjyfG&B%2Kgb5qw;gxs=`-r0+T*-R1D?XziH(dpaA+P4;ECJje(9S$|AIM3LH+Srf7YtLl$9&JN{Ur&if3+@ zNpS!dGJaks|M6ng!mK=8i~+XA+c(ShVpP=|<;M?bX)2SXyI;faL>B06OV+Y7%xOD{ zb=_|Cqo#yuTZw{zhA&C*($iYn%doA$UyX?P2ZJp!V_D$Qoq>tkTvUr49s`vZW%-qS zxW77_5o5g2uso>@mwXG(JH1bX#&Ny!zl8%1SSvaV%Xp*(| z8_j^n!yK=n)`|f7bPgn1%UOA5nevX$zR|yhV8tDqH9S@)7i#ix<9>VwLXSTnqd$&J zST)*;_D3k~Cu(Fn2>?RuRn3%X^x zHQ`z1n7>nDSo*da`;Z&6PLl@h@4bABn-jXO2F`I~R8FRpn=RN-1TSm(sEkv8G{M=w z1a9>wMc54Hi`MJ7dVV}oJx=lNI9l}|UUfm}FQ@L-wXzXu#_nBH8MR9yF0d?*$&`kn z?@MT0{+fU~ejIcp{9}L2*aGX?8}Q-c9%hNjAySw%*~bh0ZeyDC(+pz`EjHI;uENoe7Vs_1UZ2uidFKa$*)T%5pD4&(168SmD{j@&heCL%neyM&cDDZnU$ zixdk@&-Dxz^43XL{qY?M)Enc|*?}f5XLt>sJ`=f0Lz~Wl46T9FhP(;IIdb$y!F)|r%muCLEA%v=y<@Jx9d|mzdJ=th}=>*ZO z`9@pYdAS{F*qfKGoOus4C@fsx7eKb{TNW26p9pn8%VQzhM_>`J z;lEZ=ZShyg4K|5V_W(PqVwc@}12$I^c7#XcVmUQ0e_uiPK3l1!RsIN5FlIANy$$s; z=EOX(sX)y`2aQ*34gKugL;y3wKU6V{6)|I{4Lg(7GB*>V)4#`UXh> zC*I_tj!l}dvR{nYUrYz6_@QB7d4xnAQfUffDHi+P(P83g?Ysc_(&yJUt>xlll5hv~ zb#?pF$hp59{^j|BD1GZmISa~B5hK_1XsJnTR1*o+nhKV0Dz*Qo{p`)qvrd$HOZ3|$ zu+&i2-?pPZ=?UqeTfiN+Erhr0Q6r@9u?`q2d8XyQ_|d&g^@JmY_AX-%gH1x zbyNdTzomm4dqA}R+da+pwAAKnDi`egAuFp@_C-uoPk{Tz?CWy9=J}Ze4*Thk?36*L z-#Bd!S4PSiKd6TS^tBTs{-46W`XQ?C`J0gL&IMVJRFEz~y5mhrcY~C)NJ%X%Aze!f zQnKXIf*`#}ceCUIg0%9ze4anx`F-v=b7s!eYv$hDUtaz0Z|mUBc7X54RNLO)#?+x+ z_C&6%h_>-L1dvp|E*SakRL5i7_A>5`wc}n=e$xl%ad5G-X4+W!n{!Ofwt?R{I6?S! zRrO6P-`0accIqB^2c3tOCcd*JuLwP-;=%S7mV z%Nc{Pr7j7tsZIi=C2IhPJ&weO-Kmy8^wzc*t>t*)ER>jPPk5azjMM{KJ4snJBp6woq|6XUu&Ke?B(6;K$arl(r=udSjMRcmdzuep34~ zXE^=5a_EFq&7px((mCsap10pM{bSRZAKR?&h_AzUb_WzdWhD0Dok6NSZ1h1om$MoF zs+3@zk@QiH|X>8gieshJTwZAjh5boFHgNppIq+X z8Mz|KXi_!8Wp&y~{(RmxwmX%vK$?`h_05Ce3Rl9{8WfpJO%Q{rHIe!*RAe zU~cotKCXt76H!UjrcPt7|4!ALb_)n;BB$Iq;&WN!FM%E2Q3tMhgbS>J3uCfUqk{bd zleEQZd0itBC{e^U=XtGZ`g#?lIt7!^UYIZMUE7vSc*R{AVH2cAr;%7xeh_D2hgT!B znd-!pKJhKgOj4_r@dfl#LRnGGxQ%IU-)!5Ds=#;$qf+p1kn?(_bY^=JWx#=g*L!ma zEyIjjR36lo;M9)DoYu`Zjq0!f*)_Y|Ao{uzHY2DP_Z2DG5v22RW{f(KOVM0T@j&}} z-8dOIL*QBCh^Llebw>@Ufe;4wGGXxdx*6f|FN~%X0}Yh-yV3e~<)22pEL)T(ejYBg z*~)&`Wqba`3+N?nqW-BPC93n>^eB4$b3c+)38Kh{T}|$GgYlx14nr?m zi0tePBi&_S^~8=PiF%M8zZ4g(PRP9LUYM=~fy)yoZlsM|QumCxK0NFWePPqZRZaSUU-*Df+|{dA^xxc+*SmnhM*4wm7{$Y9(UI%Q%YDP=ET^BD5UC!Uy4>A1MN?JD(#w2~oWiUIC@~eDVhoUHExa||EwXuNU zYLwk(&mU;$sN+@GU@|;zaN;-l&!}r>TPFj*gcn}J=GvT5PkgKi)qBg|j^VW(6q!1;O={&#PQ=9iP3*Np02f_X5Wh$fGx5aU8|913Df4s;P~v-D+ueQe)>F zQm9wyjweMERs$Ry;bxF{I(b9RqN@;hhuW>&K6%a^^s}{awuCwUsmp5GAecfj` z7YDk5l_8mfLFUfZ+zK}X9|pxufr^-T&xHSr70^{F9_Drawjj;-{j)x}YQ1k&Hkn4N z?Fe)s9#Cu4$=fq~B&VTFe_=KEN0?%V_&=rSS{zyX;m#sb*_(?+w&u}h!+r%>SWu6x za`%Wghm@AKQ#7pWttSOo%tU@oADdIW=uVBum>$@t>Jcw?`h4_Ch5q!zsZeWOP0Z_{ zUpqkI1Vmf@H=iiYAfz|=?<)jk_O%ttuo3VhE_9Z1ZtGq?-gh*`OF8mqUGD7Vd?|<$e9r6YZL?zVLZvGj zW<1stxw{=XF~nauMe*Yy@a3W4OQ^WihBxn5dypCA;H=4DgYa)Zk>GNYX>@Yfd!#<^ za|Ll;%2Z=vQ!P!4BH;uoi-~6K#Jh{c8(_yg+H-OK@}Z!dYQrO^46pbHu3l5zlIt!< z=E7k#dtSLJ!-{u0EW-ww|8+R3ezZ&23Vg_#0O7=~P@GF|n`sVA*{#_0W+V`7VRefc z6hxiB)6jtYoH9vfYXA0cRDXbzugKLxad%mfsyfH*Tg{8r+>L)B{slmX{%cS%DY#)e zO%DXEHc%mPe9-3u_;fcZjPs?)C?G4uffLMh5wR$gaTOFEklIVp4|+FMAP51hQZC&_ z@9S7|7ENlKy@y3o3?4rb*O<2+sH8ef`V?!&wai}=AkxUt^_+^ftA?FZ*h>2|ryQ9< zoK>^~1gp}Zn4Ht;YwVF()qloBTyr;b^Y7?^ez=T9a{&QA2!wjLpXRC0C_Hic^Ie~h zx8Kf;lWmH2OHKeN<+TeucQ~_2r#{VgkoSw(<6LxPej+s2?=J?Jne6fAFi#>>Z`WZd ze^yq-fJpOmM;l8YAI0V|Kjw+@uC1s zEjn^DGlLz_^YPF6!6}Yqm$hipVhMIi9~}Pw7LrxXtDm3il8UnQn;HYCldt;+n0Huv zG9~S2;AHy;v~k~_VslFt-Ni=Es&&eE;r$2sZ@H00bvWt7p%utWu6)(~c>9HB%O*=? z3HAMCPP)3V8`p3el6b#=>-v!toIUsO_np@4cvRLZvCD`!bH9w9Y4-F1BZ8_w5%)|9 zk3bqGVtl-WYcK(sASwHlKssft)R$6Q0Ou-{jj6=;sfP7TK6O`sh?-1Mo-}#aY}EDz zHdr*BDB$WSVmiUE)2uS6Dku>I1-=%paCC7Q9t>NafGe9Adp-OF3L-_W}6g!J^Z*rm!wg?F~^tD1VYvONBu()$7e7MYUv_SaJghV88I=la}k zQsMdu6nc%d3!7DeXNkKeeTII!p7wlsq!@p;ij)c2itbeJo>_51zV%<&@mw#%Db;@X zA9n=xZ>__tWe}LyavH1-|Jc529{~Q^VwIM>eN-8S%#Jme=fnalnHbhxSsX6DVV6!M6xbgIHV|f zs`k(|7!edED4WEy=?EZe1G52+NMK4skmbw_S7#eN=+rf)4=%HQlk$7UT?Sqk+p=wR zI-*W7sxshzd@sjBw}8(P8K8+C&~bRaA$5g8vZw5x7pT4j1)Q9Uz+v*ROPivM0wiwr*ghFAM+vs z0J2$4m!e2Lil(o)y|NKZH7lai{@u;uTDWK;&5Lj21GDGqP(%FefK<-lWI`l{n{pdF zYHH9%xMbs*;x;fsK#9lG<%$e0d33x^ypaKENF8_!ISsz=Z#|yBl%#58@5x>OgI~PP zi5`9^*VZj7CPOVixfV!FNyHn)O<)$y9C{n>*w+#L((?PqD_*ZJ+5i@CLU$HetnK$5 zk7ac`VfN_N?Lu^1x;%-fe9JUiJ?77tK#+CwGr2di zA~&{D^9fj1N0lG8Vi_Ft?F5&x9!MVN7LQi~)AQ`}FV9X+0;?oV{S7F{BS|w#F%_)C zSRhNS#0S~u;|X0Q5#u&b^NHy|gZ}-7mILAv2ML_SV9pZk)b)>HvUU{4b|7^7r$_2x zwJ7#|Hg>!H;IFmFtA9F0LZ3c;LczZlz@?GfJ)yoJctGv4_S)46uR4@twtiuGHhl|L z`i@bOXV(p9RYkGVK00^yfL7 z;sURhay>s|4?%vai}S#xmyIr`%v{^(u~p3>vlAC!bCTC%~QC+eEt=^Fc#_7YHc&o z2j=ztcOm8JmfpO(i8v0BsU_rc)3+WNJsT@{D-rHJa_Yorw;gEA+!m{7PVA5IUME{O zrI&#uLA-&h)2+)M(dKHa<6jW}Q(Y?Yrjy~dH0#f`%aPmZW23eCcyEUKn!G}u9oU-w z)^?x3bQv(Jn6?yOy;A%QA1t7SQT+$bl^lit->Us|CSmcl)_QD1NNxHU|J~qowVN83 zZYMs(*Af@7z$z(fu9>gk%`6Pb_vZ4d_|0qEuYJN!@65P^kBI(gjFtNPcKN>Ch$aRZ zP^4rA`jwJeG7HEo5Of}&jJ>#2XY|XsgW11(vCOv#!m050MG+&VUVi^_`91b$0BYWt zLE56gRoDO7&+)S6shonon-IuE#!yP^dRpi!EZ9Zu_)-vg?TD){AYJk5L+F_!)ceU& zTwbds+AErab9)<*AkVHQPMQDcSIkT);i{Q7NJsjX-@oQEY9C)>bb?M><0vW?@Ia{uW%{`b;S?xXLdqWnr+WfqQPE68=c)=U{ ze(OvRqSqneamf2yy=Gi-`xzt3cjO5(+qo{4&K{ckrR_QtSaO0QLB@{3%#I<`X+rijc66wWRYvKFd} zR1(yGiCf9{2tbM!#&11;9op>L^BjH^Olc-&UoHbWtG~&KuiCs^k*U#f9W&74g5jHt zqb!E*Ck2H0iWUo_l>>!LCYcAa0@}wKttbAsJ8h5zLC75y>o+%ikewlS6$1VDi#ET( zIwj;Uo?m2liXAsafJzwD*Wn++S%U8rwiOvCNahqX-Cqfteyc-q*CNpC_hNc(5&U+q zFtsElR+MKXg5sCq7Iy-Qc6r4?7iEbR4mff+3;A)+FFvUIQMfxsjk9clBqevbNc4ZL{3*v5%ZDBUl8CzReGrEh+%~SJ;BN;B?HVXpILu4k zCSUHnIU|XQdvVb`OUD|!L=zq-*2kzs7bxZgm? zUMl>czCCC1YsEm=iWI?drR$55xVTmqRu^(l4-*&hIKW%g+UtWiHap8-nkA{s_xgSe zxYw(P6G36q4ZFxX70tt?%l?f^A}kRS{i9t2GOliZ|JuPDqLHs#8-|lnUCwQ7a|`)B zFPuIzDcE`b3g+DN^yR^XzKkJT5?nw7pm66=g!z$ z{P4stdR#Z&L6e6lRrTDV)mJhOa9nf8;NL;2HhD|m8uzn-11SBVk&rP}-_j#S>Mj;N zwZFK{=8w0?TrF{ldQ$7gZ2Mm@FPP60b^Pqk5^8%?Q^o0nmPf!i8=a)%O5F`D;Nr5# zZ}I0?{wC|j3+`^28tbZet0amcZfL10N1WHRStRgbvI2*VvvpMLu-AH@T!n6SF^`Lh z)p<>pLLQ_3>i1go_?d~mCKPjhS$+xdTI$NiHFuGqPe!Ap!$Vd}`89b)aUTgYGZ9E$fqU?alcb!i%IsHl>wakzEGt0NaDuX1S3kuaq4P;Oq1+Hf~_;cj`4c6 zj};EQ%!}5%KG`B+`mVB#qqK?u^mJ{pmEzn3-BjMO(&1Y#U3__T5`X1lJ4LO>oU|Gl zix;x}X7;EP8lh2I#pe^261`jp8Yjpv$$5-1H8>Sl{z%m67KbvI6G55Em^X6Q#;g!N zuA&I_&$m$=?K<}K-FrU6DR7M-^VQJYANLDuE{JRwR#8&0g5~BfwAq==EPHoV=mIVi za6s!>3rK{~e5c=Z2wA+Yw90PtAHa;90(o_}@KJf1DTDGj*@Tr`K4^jxpm7X1z%q3< z?y3YwpY?)%Fx9}qbfM=2J8%Iiy%g6az_o8*OXUvF`BuJ<^XDC+ep!oATXNBtX2|bq z(l1FeRC+n??H}M{nxfpYfA~~)se{Mswdh*vA%4DHL+StXZ*HnKmcFl=UN^=zdUiu7 zh*eH>nkJvP@6ncc=qt}CxMa5nd$rOU>_{PlxP7CD5na#k(v7F%-t4#A_pI?&JF2}G zZGiz%r~EPMR9d61Nq*O~F}s-*X!>%LHXzU!O&VIn@*;RW7s^T;lsatP-!CnLcmq5m zi>Z;|rja%h0Y|_ri7Q|Dg!LDngWQSoOUM-`NK#{`;7y9-`HWjxev^;zFi6~-S z;!55N+%+3dUIev-dYQPN-)Jt0+Q|XqdQ5V%K;8k(TW|vdE6ObHX3VWd&}DPfrHVjm zEmad>q8q~!i!f$fkBd-j=cf-z>X3gX>J?3j$xbrGO#Vu9qcf*Z>N{0mD5llGf9w)# zD}2f{t!VY04x?u!{lOQyB_bFPpFFY)a^ejy6>bSY^8qe?xX1_b zdv2c$1dtinYmKrba=Ce{NiLnN3Juh|1Ai+QcB2#7*D-9oj^a7 zbHsDLY=roajXf$0hiUE2_D0S76<*y4CB|{h;=LS%tlXDuIUHL05vfgg%kpUDJ`rR> z8nFfdl5FrJZED&^K1fo`UWza{$gGRZO_HM7*S zna6lUftoJ@vOD2DmKfM##!hn#F}a#1m4r-}uxJ)(KF%_wgnAnY7CO4LTk1c`(-W1P zAW#aZpeB&GMetnRn*^ZOeV^%4w|N>LM3PL=J+%H4VLZGuzra5@p>=Y2`Rz&V2M7I@ zs@UlaYf;IuTZXyD;9-~d9B;>{C3@~ZcXB9PyV15Gj1?5@>e~9cCI8J_mT8ti`y$_X z*DVjm{?!qc#yP?TDJm#js*$x~J2nk>l$H~82CLRup=aWEKMH=d8`Kce`XJ&?n|1d|m0D|tauI+4 z91LzyXN^_lNFF#dH?Pnl$uBFOzQ_NI6pP@^W!9Es_Chuk27ydV3^FeW1rIR9NaxUL9(PVq$UNBl*(WNG1$TZW z{D+-IE|COLAyQioc4PTQQu|t}h07;Pt-=u1{x0rW!F2HK#ygi&Fb!D>{we1?9o<{+ zy{9uWQC$qIe{7d1j@B4MWSzNF05%4d{JX5iJC7?IeSbTV?0vrbDrPr>Miw<^Uw=qM z9W~AhPW3~vwLXYbuVi@`WS?+R-7=YYTCbTU$G;YROZFbd0v0fCUcZ+&bwwQ@WUCV6 zoJpGUSLb&e;=`B1*?gGDQYcN5&-sYw0Lx6&-wW!kub>c{+E{(muC9aR_#EiYxl6c0 zO1&=JqV1$C@GE=_q9t@yn9DEv_^^;C@*LZ-rD^v9`$AY3+O0J9_5GUj^|K;f8nOkP z&ZJPm?#6u{XoNoS5tz`#-|8@b_!Ryta*23|%I8JYxOf!ZnK3k?G#o#eIbgem%`>_$ z;!(W%+2}DR9P=%6b*>0|9txSd<*Uhi11SfG_~&QBwC8e2GO|i+RET@wTxf`^`yy_| zmpJy1|9G@M-SFHc^T%aopJ89@$}89z!dKd!b_?ApjtU7mU{nUMs|30B+3wy8dkPlK zDTBd$b35aPVSJUN90mBn7*w%^?~Vx9Go3EmAwN&V-})U95Yrsw-E1RxuJA-2HktYa z>f#6RGp#Rc5rGN{a^4*1(qRikH)Y13Z`gF8+NrzDe|D-r-9HhdTdCj$Hw}5sa-_U) z_83}alF(S(|9rh6M z;ximFO&X)TeB-kj5)|TGBGU62kbkD^`EY@RsFtu}RQ5meXW+^!eU`X2=EQGMTjK}^ zSY|AKXF`tQ)jvAany?sUCx|TNf)2xdkHOifV~65QX76Q_Qkkw2YDiOtpzP4FX-ZGw zSLxD5Q0#fKX|oddIa;F}A1sh3W)t$=E344<6!mz@%WT2T0Y^~CuP&h$R-ZhRGC2|} z)G$+Ss$I@=?t5C;0~KH|KV5gUT7oVz`~T%$W>lBkVVBC0dnz4LLQ zj*t1V=XC20m$S>BdoKkF@H@XhH(KyU8!!y(#&L)Q>_*Nx;gFTM@T6{JwblNcvyldt zF4VASHy)n*yg?hS5ZmF=xP;wETNm>^woM$HMCje_5-Uly~fysj|&Mq z!`kz0`@b%kIQl#iRmjy@EvPFUg>7t<@Q-7zMub>^b*0@}Lx+c!Q$5@`BZ*n-w6Jur zcFmWAJoPU;vd%JPnId3UI85u!QBzh@!7uz;0C@9{oMy)dPU31zUCIb$-g^5bJgMpaD#XS zu4a1VilhM(ujICsQQo}dJFZ#ak&j6Uu9z{Wg53@@8C}T6#D}>7!d97~#o)!da}sJg zt3p`Y**HZNV4NHNIdVJ=iKxRkmq(JN#Lc2k4YZ377c+&WX(SRf7^&W?jhc#6rcn|@ zzz_a{)R?|d!B`bVRYv!o8#DeS-~)8O{v!mbuxH>)*;AVd8EFe$&aFS-Gvf6>(*1{5 zKa+n#1%8;l&0q&9t8)R%30qEge)=hGe~Rp3d1Q)oCFucw>;8lK)C#ok=e91iVjlW> zzqXFK`3jvGM@va^L(wG)Gg;hB#?Ejz)2=0km@Q2^s^Hx@FDkLPc&z_J?8Za5nt3Vp zeUH?+eT$v#-7lpv>pC)S;N6gi&3~*fxN2XD;bk!aw_oE6Mu4e}pF@y3Y7t>wdau7H z?C`IufIVUghy-F}V_;I%h?*Yy(FqS%XBPsH()a(Mb4B7j?*;V)hvdBP2m~`QW1_~{ zz;#3QeVW8yA)8A}nL-x;LmOWZuJa!W?hd51l3rdv_r!ns!iSw~ffaR{ZfogxZJ=zs z<)<~d)iJxz@U;GW$xU|G>v)we;@N~a^HSYJ@uMeiY<(S(rsXGqD7jFB8=>Zw-cA6iOp^!LW7s!qdBXZ9>&W0BP0F^YU#3y|mD)>>h zFw+EpHwLB8JJWhp_)KfkbVD@q-1F|jzn;Mh8(-wEf&fYyfbz3EFRIX@kaErL6kV;) znHV=;wRAX9Vj1F%<*B@RHUNMzOcLq(%m8Vpu$FhIM+B7{?`~nK&%=A$JtMGz!{`RF zf0x5GEAOKb(}gn9J_#L&{Wms9@8M+W z4u7S{9*J+xK6*bR#bLY|>go`R(ZOVn#`^o?6C;vW>z?)`3p_0^nop%y{VU9(@#FsY&HW{7zKtTpQN+*o%jGhMTE3U;!n@K&(?YR=B+CrXOq$de z*?K-nYLlHM{?oXudJ*p?`cAaD;#zPM)mdFot8#sQmHFbEADY_9VFei#JIDQinxA zBUF!dq3Ztu{(GXQI3moSb~WxS16bE@5Q=#%o9gLi=R-6*b3Fgyz$c$Mb6tN=R|k-T zRPV||9oxZBLlwRlAq0&3!TKnJBeH`cL&rL>YL@a>YBcE%ax-Kl*vN zJc2ins}NjI6)q66Wf`~7!xz2=xnGfjONolu%w7R?y^V;4Qn+}l z_*LryeP8JDwL|h-<-63pq&!svVEq}1`^|rUw@R=5#h3+cS<2R0=Ab7{N2|0i543Ow zaxk)I4l~F1@Ih*JmixUN1|Gc!T@oru{ed{+g;qkCIG8xa@iwKUBzqVl>&v<8qC_+$ zccL#QTngZ&(fH=N_NbZQ$@JqNeO{)Jg~Q%tK{0eAG!49b?css&{GPrfDXZ%e;=|>` zIi0-4saoTMRJq$X>MmoJ8)VsCd4U2`^?_NP1gTdMpyW3w=ccKZlgK?KL6moDjcV$` z>bGiH@9AfM0NLy9R(s~A(q&QTe0Y6*=e6qQK$KoSZ6C(zsjwi3S5{(gD?^6Nd15Nh zxU$$)YW>txB;_ga*wnk%Oyi^Ubkf*wQ+i`*l`&x9m|=e>)w*;ObR~2z8Bg;h-FhOD zq+aH@eP}(TH2(-LmZJ$w*`0|nPW}GjG%#yS@QCv?sz)b1&VuLqHz%4ou{Oi2V}t`@ zAC-@%Cn0H4@h6&?Q`cF458VFJF-m#r;FjT(4M&KM@nD`g`_7AYP;TESEnltO8ur)r?MB)d62NaJEK; z@2y04X=k4Zp$S_2cBG$qc-VM}AR+A7)+Ryaf<$a)u`>81w0)W#T4D%!Qs2z{drDRr z;62wmb44^>U)tI|IHck2@NulPF=qn(4&9jNZ&1>&7v7pO)EqIBDmS7?s&H8~#T635 z>+=WqP|g!~|K_Z~7F$U|Kd~b;zxA`El%s^MT0M=qxVZFKd~>#Xc|#J7Sgu*+fX=oV zNeg9XTrDZoA1gh^CBE;D?UQz8rpWU5`-OU*xp9G=$3Gq>h;6auQG_;x=<>USVn;qe zc_G!BjE)uakq*nBCya`4V7b~VCE04|za?kQ+m&V&tpA|#5J+hlzPW+|8y27nFqo@I zj)sg(6`cwWfvDhrK>($ku1pj!7@Ug1?L!9C4FA7J?n5Q6@rH|8xeFivtfs1{rBEwp H_3{4zK**s_ literal 0 HcmV?d00001 diff --git a/application/src/components/settings/notification-settings/NotificationChannelDialog.tsx b/application/src/components/settings/notification-settings/NotificationChannelDialog.tsx index 4d47b44..7b20f9f 100644 --- a/application/src/components/settings/notification-settings/NotificationChannelDialog.tsx +++ b/application/src/components/settings/notification-settings/NotificationChannelDialog.tsx @@ -36,7 +36,7 @@ interface NotificationChannelDialogProps { const baseSchema = z.object({ notify_name: z.string().min(1, "Name is required"), - notification_type: z.enum(["telegram", "discord", "slack", "signal", "google_chat", "email", "ntfy", "webhook"]), + notification_type: z.enum(["telegram", "discord", "slack", "signal", "google_chat", "email", "ntfy", "pushover", "webhook"]), enabled: z.boolean().default(true), service_id: z.string().default("global"), template_id: z.string().optional(), @@ -89,6 +89,12 @@ const webhookSchema = baseSchema.extend({ webhook_payload_template: z.string().optional(), }); +const pushoverSchema = baseSchema.extend({ + notification_type: z.literal("pushover"), + api_token: z.string().min(1, "API token is required"), + user_key: z.string().min(1, "User key is required"), +}); + const formSchema = z.discriminatedUnion("notification_type", [ telegramSchema, discordSchema, @@ -97,7 +103,8 @@ const formSchema = z.discriminatedUnion("notification_type", [ googleChatSchema, emailSchema, ntfySchema, - webhookSchema + pushoverSchema, + webhookSchema, ]); type FormValues = z.infer; @@ -145,6 +152,12 @@ const notificationTypeOptions = [ description: "Send notifications via NTFY push service", icon: "/upload/notification/ntfy.png" }, + { + value: "pushover", + label: "Pushover", + description: "Send push notifications via Pushover", + icon: "/upload/notification/pushover.png" + }, { value: "webhook", label: "Webhook", @@ -570,6 +583,43 @@ export const NotificationChannelDialog = ({ )} /> )} + + {notificationType === "pushover" && ( + <> + ( + + API Token + + + + + Your Pushover application API token + + + + )} + /> + ( + + User Key + + + + + Your Pushover user key (or group key) + + + + )} + /> + + )} {notificationType === "webhook" && ( <> diff --git a/application/src/services/alertConfigService.ts b/application/src/services/alertConfigService.ts index 9df6e6a..83a702c 100644 --- a/application/src/services/alertConfigService.ts +++ b/application/src/services/alertConfigService.ts @@ -7,7 +7,7 @@ export interface AlertConfiguration { collectionId?: string; collectionName?: string; service_id: string; - notification_type: "telegram" | "discord" | "slack" | "signal" | "google_chat" | "email" | "ntfy" | "webhook"; + notification_type: "telegram" | "discord" | "slack" | "signal" | "google_chat" | "email" | "ntfy" | "pushover" | "webhook"; telegram_chat_id?: string; discord_webhook_url?: string; signal_number?: string; @@ -29,6 +29,8 @@ export interface AlertConfiguration { webhook_id?: string; channel_id?: string; ntfy_endpoint?: string; + api_token?: string; + user_key?: string; webhook_url?: string; webhook_payload_template?: string; } @@ -85,6 +87,10 @@ export const alertConfigService = { } else if (config.notification_type === "ntfy") { cleanConfig.ntfy_endpoint = config.ntfy_endpoint || ""; + + } else if (config.notification_type === "pushover") { + cleanConfig.api_token = config.api_token || ""; + cleanConfig.user_key = config.user_key || ""; } else if (config.notification_type === "webhook") { cleanConfig.webhook_url = config.webhook_url || "";