From 92877547ef43d8b9e7bf999b4f58444406b3cb56 Mon Sep 17 00:00:00 2001 From: Todd Birchard Date: Tue, 14 Nov 2023 21:02:27 -0500 Subject: [PATCH] Remove Netlify logic; Resolve error when fetching comments. --- .github/jamstack@2x.png | Bin 31076 -> 0 bytes .github/workflows/python-app.yml | 2 +- Makefile | 5 +- app/accounts/__init__.py | 53 +++------------------ app/posts/test_posts/test_read.py | 2 - database/crud.py | 35 +------------- database/queries/comments/get_comments.sql | 14 ++++++ database/schemas.py | 48 ------------------- database/sql_db.py | 6 +-- 9 files changed, 28 insertions(+), 137 deletions(-) delete mode 100644 .github/jamstack@2x.png create mode 100644 database/queries/comments/get_comments.sql diff --git a/.github/jamstack@2x.png b/.github/jamstack@2x.png deleted file mode 100644 index a873541049882a24d3d4ad30c030909afb31d141..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31076 zcmeFYcT`jD(h+n`UP_06Zc88G2*|A{<@ZM0N@hi`5zFFoy!IQka2jLS_D}b8Ynr#e8nAIU{0>$ zVZQ!EXaGP(J*=BjF_$xxH1yYW_3+dU4|FvNH!^h& z_jXovfvBtTs)Q*K5%{_WIr4`2`uM?>!c-x@@hTDT&mT)bcz=Tgd8-_L}5XUTH~bNeM|g2`OnYscTA-vPx3&ynikTky@aO zo6>Eq8-HjKKdC}If`a^&BqTyZL&Za7#9@K%5>kqaiV~9264KIQL=&sMn@-DaF8m5$mzdJ@b&)>T0i(7F%bnO5$5PGAtf$(zNFuP zF3$gf^A8U6`Ayu#S;E!F)z{T82u_5R`VXwX2P_B%_kjJsp#IO-{}TbCXblbjL*u{Y z#n<;gB;Y~XA;e|;5y*cF4L7~(?<#TI6%GpybavGaA+pJLz8Zfe%|KVjAXuO&4CeD! zQ8)jx%quM=F3l@!=;-X}cfJUb|MH5fmSd2sD&$;mVv-7CQZlBJGD=d4N|M*ah}x5s z{1?;^=Hlsg_rC*`mQ<2d{GULHM&sfbvO24=FLEuo2L))3;1mv4PL0W<~1qBYuCi2#if3;YiOth^@9gF z`Z>EowNxQQ@rZkRx)7J-rXZu>s30cis30jOD<$hHrr@j~E#@dKr=W1nS=L2f-tF)E zS}^C}b0hfszRUmS`^JHuL??9g`9H>U?waS;qonHzC+hX?ALlV~4fu2Ci2?apYOe#DZ59QLk?KN05zuR0t1f{wEV?9@ zU!YP`Zzh+Nj<0bEg}iCn1J}pdmbrzvHSQiF{_nMV zCp8!d`Fl~k1n6u1xdIJ=PyYjzO>&j~&($kOX7Lw3-J7!VFFgMwlf%P5FX)zwpc($a zr`edG1pdCz`1=16_*X{%Ya%KmYGu)5af)b;v-oI`Ogvv4 zGbI(%$%VR z@zHX;M>B+n;CpT9(M7o5$97UT#wz&AbuLrt31FM=eto74RfGIYJG=5}T)e_o;JNk9 zd~BS~d!5k#nB;0& z?%>vI7S}uo$dyZjwByuHTm*VD3z=pAt5iSlF4ql-HvhI?D2j-4mj%#*Cc$`Mbo<5P z!laVoimD0GOmzj5I>5#^3_CIhC@#lB$XWP53E@HVRF=Ub=SXjY-fol z6vV=d83QB5T=Kg<>2hvNhtO$GbjRTc_f87)ET8=bAGt$x^3_=l482?PC+0BeF6rek zpfHrKmy?1iMtah8^1Ud}P!rd=>!+0yg9$%UqcWokt4KQBhvwd?ylyaB&kql$;X!|N zKp|)0G^}QOpPQKe1urCmgDKH;SS|R<5Ep0UTH?U?Q`DvR;s!2Y4!k^d2U}?HHLVX> z{y$3le#e##CE{}5-yunsS6vokYfA3pIGIM-<%r%i?)`Cwr0pAp!w619oGks>4hG>r6)mDs+KsD zm*|!sWx3Xkd|S8ARixEK45evI$H!(N@7OEgYj#@w^m+iTrWnxA7>2FQ568ow4F6&s zCt@w?oDPUysf}KdsKOT!*9}F5JM0vC0C8jWho?)6F188h_M$sUjIrs>cQL2euH3O( z_Akz<=H0rd#qbh%|3sMX=Bq*1@jHJt_=AX*e@pQOfu~YOY59FQ?p2=$shK9KN`Pl+ zTKQD|51(tKL<{UypbC3NHf$e5eJml;%&_6c7w|-GxV*HF?py&`jOWXC1B9tzf&F=@ z!BUVBo)=^);V0|w#Wl~@>N0o}B_Qoh6CV(*D&4iPc@?2Z=VtpPzD5TXpzq5k_p(&~ zw<5D-h=}_29#t=+h9k_%Y|e1JfujD|SA^kRxybj*T!$a8=U07If1~s#^Xw2U%Y}u? zsQg)SB!%P9R?N>g8{u|qnTm^_T70w-N+BS!nua&O1*1$%L|OEpxx@>UXKOy~8#lXc z?w^MVzOG@gIEFi7(D51PUxQWD20ra+7rRh;9LV^P>poM%RjpH z*ESS&h=4&{C~jDTaaQBHyKQp3OZSp+oF*ZRAXwM!{6~S(>u(;$^)U5cH(lKr#8)ZC znnU38H@^(E?WyI=Zst^rYyTFK(QTB#dobKWHU13IoU-ST`!rY;lHNi>W;P*TJ!|+! z#XY%2BKILDlGOrLiHmz&Fj76sNj}K5H67K#>C&M>#B$wVVOA4`31DkLF`|q?LxV(T z?2Q9Br*OJEs~98+{~Iy2)~*soN#ivJwgktkGwP@e+DwoIH&}!^T;W12_5D*~UzZ44 ziv#`Q@$ES`f_m=BV|JaF*mrVOF&Yik_|lBJse5)hs)J20 zcW+Y-?Bu^0tFVuFGppE|dDGj!s23P>9n5MpH!#^<-uoxCC>jHw_FE1%wn?oNqSH&g zHz;c_afOFsbq&7XcAaF(2`DCgqt)8&xzcUiSYGq94@yI${k0sDJ>e3>6 zo7x{kC)&BRdt)1!+C?fiTPRLaGUizIu(YD+M2@J=7H zv=wWvwh29@B6VJgfWjM}i~k-U=#^kPZJw`Z@urnu=UFDA7@O9@*sWMPbLAvL7D6x_5c;04<)F$ovi<{ zGOZ(Gcx}ptt0?GcS=k_rWwSq7~Zqv8RNxAlsLoy4WVhujX_} zF%7P0E4K|~mbema{QTP1QLQXGWJl~8H{)vCEJPa&sT|F>?iD> zo3)l!Akm$Q1e0gr%4=M=6pJP zJxojvP%oQE>>gB$^v43~A&(B#uj|pqO-d;;a_{NW*x73A)T-81>N<&DcCHNwWRw_W z@`eakHQ;ognit8Mdt}LUwcOB4!ek(un~fRVe@fIqeZ#p|$_i*a=cD?}(L*aOH#a*; z^vMwcj4Ul1_&4g)D*}?x>4U6nRVC`m$zkd@D%@xidJGK8&nn-w#?YJpu|FahnMHbb zRdf)AMr^PSTgNvQqxMGH%oYDK9zlrA5{j&y4$N^Zr=Hm$^~d2>d1c4-l;$Hb_5%So zCSv1t*M;dSRe9WOYjP}l>wkx;T@iHp_lC!H&>L*bbBmo_eY5*p@w%b@=$lhR#@(>h z5@+-CNOOMmqh8bLdD&zSl~3Igoz8f9FT$J6^ZWhyew(yZxgWkZmev`;BEN+rtw~wQ zFBc&4%Apr{r~az=0T_Kb`xhTX<}0fGd0d}p34Q`kG{WE65h7Cr&>zWgs$A7L9nXz0 z2(Rab%)jvfhECQWOb?5`|2JM~xm_pfwX0Kv-{LxI$<7G9DA)$4-v|+)eAINMt$Z%) zFXc<;l*MBSpD_ySb8)D^g9z3%KNh-5wS|F_kYBui4f|;g<%^(nl23c&$pcMv^cyPV zrnaBTehmCoZ*>tpQPwYPpY|Z`u{~JVH1(H2@26{pT!Fw7fXwFWRkLaZe@KoHeK|dw z*C1{+f46|d;&n75MB4h_+HU4Yzyn)>Kc-LwJr@kinDxnB3Wp)S zHG}jG3JD0@pzX==X3windg$M2L5Wx=Kn?Gz_?*TK+>&V0d`SY6?*1q6&chxX`ju}N zS+R{(qEqxKfBmxNpK}H*d>yAAUnfe4l&8Ry*az2BS%SgShnFU9eE1s&tcW_ky;9mM zqCDu|6%c^t9EO`}Wn=uAVtC5mmAkpCLYjWy(G_SXEBjNNbo9$@HMx-o&ub@aIb(oAlCsrF1>2P(Pfk>WMG+B^v0sC7)m1oBRgoxIq zA?721HA>+Hhj!Bg5)jnTvFKXiUZO@mJ?aUXq}_%)Wv1_`2^*(m}qVCgZh@WW;@ zw@9DL*L9Py0>A)2XyHG^^pRBy2qQcF)o6J_apxHcl6u?Eu>fKVJr5L?{$KX0rpUyD zBtp6vMweqC6pjwnY|{!lrVkaIyNRXZ%0I~@Y7{EPu~FYa5+pq2&1C8v=TnIHU$J6< zHGzg9288TWV&Wkpb8~X|&bzqeKXFJ0Uoz<*aBF=L-(weL_HylIX|fQjL65)qAxKltW#pD(TC9y3=99pXmMhU9y9IJF+NLSx&5YmBlNy; zT;(I;aKuw%TEnhk#aio_s?vzmu3)6qnB?>#KH|Gb8L>QD1P}Q>%13ty)r~ble${}2_+Mq5&cAD{sB?xE}EC0{+k!C zwBx^@c{n$W9JsS={cv3qG*4nq1DP=5XhvvNl7nddL{aKQIh|9y6(%4}O$>(|xaZ7{ zxMTTl$nqv57Zb5I=zkpU5S*%sGSS5W%t?6Cmrs8iW+1T>EP5?D@X~=sSb^tGyn?nj zZ9)*!D|ea6IQwWx-x%Kp>fe<@|8E)SnIPxcEs}&-`JR6Bve0TW{jhvDii-C<8p6*b z?7))u>(lVsXI~37kKRnlp6Y2eP53#8R;qlRoqlpaBst=QAAWZURfrP(qH9n8W$Pao zt8;&AmldnLml+qWT-Y)mA73+m4P%EHV}ccu&!wF+nr=qIvIHuLTQWCMWt^hn%CWU1 zs`%o$XuBwQ2y&njR)zW8pLOxN=A2~ZWcfPbd$l+c*5Vo%eH#B`6c8hcp~uGx4FY%; z@%7N0S^I3=a!;l|;_X^9JpS6rvadCI*;0$a0bL%ZvL*fc&>LfjPI!ET6!Ev#J7J;s zoB$vMCJLjwfyGNPC5+OgP-0g{oD)Ek49AzQtVt%`EuEoB)MeQG)Lg!IE7En_3-UUv zJ~xjO1q19EJ1*7(3ZRZ{5XeAg3hf&sKz=;fHJHD(?MZxpvf3tV)&n9YW3KHp=8ncV zr+pH!TmcC5O;e^se+0cf*M}=xw_hK6VuCP@7kA;RSe~&nJ+1f7XnOq0Y%hKzI>jr} zQ0OkCEI{}ZLsmKwlVN~U$Ep2hO3Z2TjaahGk{5@ZX_nGCZXV7jS9%V*ik;AdVYw+Z zYKb_Sf`VX0lWDSM>I>0rx(-Mj@a#hFGjyw#R`w4U%o)fC_(P7FKJ6&%3mtn}(by&Z zqv@v%v4`X@4m^;|S>UwT5+ZQ411HWm#-b*ML$E_b=aZ5+$fgFPW5+7K>*OZc_s>i6Pb|G5U( z>!{GfQ)5Cf4ip`f{xaBLi~xEODF4c$Fuup&PPOYPUzjwYhIBjAxQfeD zg_pU;q%4W{@;-GmAHkcq>#*Mc#mj_z!^Zh%? zJnxLsIU*d4?vUby-HqTB+WY~`tN~7r7uEC6CbffOx8D#XFhoou>pBD5(%SnESSZ^@E7oF~a>b#Dec-8*^1R?a4gs-&m1s(jZ zF%AHfl|{D60c$ivO&91rq2-!SZkex$d|kosy;vtU3q<$V6%C9U6i8<_y!?3VvCt7u zXkI|%t2j-AI462&20K~QwSPw&!9*VjKe||QFMcKW7BRy?JVodOkx`s&rKSD9OP@5i zPD@tabn|mBTLB?|4&Am`$Nv-OlxFm7mdE06V#9UA`u}TU8&HcLhp_sWx&r)q{~s@$tlt0k6#cg$7-CZi-^BV2(h}Y7p1!y5G?*~;cp$9PI6wF zZ7!&NPVAG4`&KAN5B+!KK&IUGBv?c`;>1XQd{*m_>KnyR6wh<2`}pzKe9vi2qoo{Z zZ}z=503@J!TNfBw2N_O7-(bAUmb|&i1mBCuF#p1L7gHeBN%8P~z}bloezJYl*{ogN zFC)b^-;NJDnLaDB>Fcn%RW*>v@Ffx1@)+A)3pks}BJ5F~hDjY~vv-4K1m)>Bq|e2o zT4h}6b-kGjdG87&Jt4q+eZeDQ!nHp*gY~(#15gs2If;h@BP14tG@tgi8NVaxz@uE{ zE4inDK4cS15;ua<*4h2p{3-pJ{BN%eb?g`BQ%s$N87#PeK>a}Hp~cWUXhZyo{J@Ev z$5;pn_9kYvYcZuuT|M*V#5}$`lG`8bPf^Ly(6+A}q+vclcgB{7I5Wixn^Bm7yVJq`HrZ25N>oPl4&YQ#9fjN$ z>R7WoB7f4g;Jie0!~>ECadMtbBz0f!Sd0s<-gaCc}70(3lCjkc$IOKo=A*!1F z?B~=Yb-THww#5k$ZbT7hZ{R*AG7@qwA!Jkf!yUXuw*x&C`XpYa4tZ@$n#P6BVr+HD z$gbaXU#R8|L1y`p&I_-U~dJ!7gzz(t7QPxvuLs5!Hr*=|m z{WB<9sa-NZGVw0^FRpjN-&a8Ky@_FQZR(%7!uTJ`A>0@TlJ0SkH8I*<8Kw zO8TppqMbR^!7DoAHWW5A1U8F@NQ8i6pw^U0G%Fy5l;`8Zdb@#_YSaE=25Vpk+7|z1 z#|dNO!2cpV5Q#DO2~Y=~-mQA|HGu}9d;+F0M#uH^am)r1ektCk-A$rU zKckhU3_jRjAS)#^TLNWSV=HERR~(A3EO#^)lcZ4aBqIl?mi87MeuDERE}sx^t5t;w zv=OlGwz#9(_HE)o^0o=CyOZZos2_gU zqanVibdxwi%S;AJkT1-C95Oaa%FMM20%0Za^m;qe=mp;0;q4Ylbt>>}G5)Nyx|3G( z`$@Cbq$;KRwH&9AT{Fx&S^#f6GkZ)b41kf_CDJko8X8e3r_v$YzlURHEa%n$SQpIR zetXZCtB4Tf#G69eFem2-F{}xu5A7?q%}H4KVS|ywrsj%vJdP#~)m1{#z zZ88CD{=l*V2@ZdDY`vKIcLxxDazUC9fK5YJ;lH>@SHe0?+alt@Q8lCrE&H_rgl{i% zP-h)ytvMUH^vW%G)K6x#40cZ-hJx^L&45QaoU=Xvg4H05t@ciSHr|h(V3|2lOMl`H zI7?7B+C%zW@Z61Re$*zhNE``zf`|c%=d5lxW+guPu0At8lt`J(H{FW+l_aD7KHmi% zN)_s`tEV4B0{O4AB;aq+2w^0&c1c@-xk=!xFEl{J_g<*j_R2o`N59X^m?jEIVy7LR zauSFU!(%oUqruWAw^V>wCX6b2l(E$JiYo?+UP0}V>~$E+_kUc%SMKg%FB_Pd$<_&h zU>zx4KiSp#n>f|2)*XIgD{z{lBKxS%Dw3(*oe%CGfll#J3jQ2w+flL+DKVBCoo&Ur zRL!K|Z)Xyx3JroE-n*?Xp*c~{M#3?Zr3gYCgtj9N7rLCnw~o>A6i`*IWB0UC9H3Zu zh~yCxAvp!9J6Z7upL@6K*oHl4$jPD$|p@WoLf1AfwD@GLOc>tyoQWLgciPLNI}cMl1n zc<;<0qCkR-K=v&Fe=9(~cE1joPu9$OX4RV!rQ`8S6e~*5&C|#7g}!FY_~lW@Z-7am z9XJ|Sq5{{baDgAI(SyTRZ^c&}%Aou9`Mx2HPG5I%1DhG}6z?zU7Rwx~9o!;Fttz8g zu_i&)kGr0XTH; z6E2JOC5+7*r_R6m^h=cyT%;zlr9tDQh`2v;>;iTW@Fhb~hL7wCc}E*dAJQsoSrPY3 zZ_B*r1z03>T1DT~;P0+#u6_R6qB|#H z)e_ww!NDC{K=LE(eI9xCeL5sTnLSJtp=V>Jm&9@Ukm8#8Q1#+SK3#L3Mr6Yo_C9V4 zd)>1nic#C`Rn|DSmRpe>JQLg{ioXfbdRa;yf1THS-)Z$n!6 zUqDdae7ZDVq(-<TE)87=PioGHf1zi zpE$ySq!;nu02t1IA|+l#eeIRP`wMIs=VshS<2YtR`3cgI;GAb}w};1)(JAD!>K>e* zj5+Tb&59~D$OGJ8*X&I$N7&Um)5psC2(_d=yemDsmGc9w?a7p0)x8ATclB+Zzf7pw z27fDk9?I0#wBcj6YoPy+bm8R_?9!c)p=fF}ayZJdAn1H#$Pp*1H0ShPg)yyBY-p>p z3%%FV{Z1bmA&iCLzkWRYrgd~Q#r}~(TcWo-*E8>7L3U#W&S1Z``5W13+N!z2i45UT zq;GuPs+JxZt(NDPrQy-PI|ru%Zws_wZt$pZFOHVmt}nYr8aJEQ?O)4y&(WZ`1z|XH zNk6;E--W~m2YftX&Pp>v^*Suy8}WN&p0&tDWJ#+=nKSp?IFL)}-d$4kWwg0&XI#1t=3 zQ&Bn=4Sz2V>D~pFe{PC@{C(+U^VR&y))V}O*Q=N)XQN-qyV(pl2%$<8%7@>05h~Pd zpT_olZln#BVz%qXy4D-PYoVjj&y=e6X9R2CBS&^c|HJ zN$d?P*zisV>aKx;h^$~BH%1Wipfpi;_+b%aS1Uu98Rdy@@#2b(NJtE0wEU~e#i1|r z6|@_4=h=Z#n`Cmj;n^)bgFPmCzRZY$WtC#E*h$VUqf5Ujdb#VfTc0A7o%6{T;qmVnQA<&rPJI@>VLIDK-`@Aqc`r z)8rP)oU=4X$vo2|_&s`u=KXaZ!b5+m$NK}WaahB4@^;ED z+qUa3EiYVz|AVsJrU{U8`+74JJNIITrAlsTnvbhJe&AYxn-utXxcL-!w z%<5uN%b3vs%I%hKVN|UJpAT~g+%zr#q~p}X(+f6Z_(MAa+1#qfBpp~O7oc)+v3djV z^ZEV_+h@xXVdb6b_E+%hA6tL$TvDM_zqhg^GVX*=+-8uu^zbN@p%>TIL>4CJzjYN^ z{($yI9Y%9%5wzH4Uz$&&!gBWWF4ZY6ujXRI-3RsbOPbHF^Qh!~mOHZcAk3~Jg#0fwnR=Xe*@V@Y+Jy!aPX-`0}YaEE}7O_h}hjJnWQw&*r&C0x6AAg zr3uL$D|7W+#;0C=2-xzhfqfs3!h8DEFYn~PE=XZpSCz+KY9Zf zUB3iA909hrS;k?&xI2b~ZOZh#89BK?muZ}6>_Q~dU9Da70QUGJ7$PPg-M*s zS$fWym2|grAns3yW02AIz&+B1;bjDl6;s?*=Ou+D8EJcJ1B#?q05{~c@F~)+nGsgx z*r|9DX^RTTRVdUG=n38{n=bl;pQO;7p1$9gP6e^uhi=Jvkl!0aZ$BuJ!8sCTCciU% z&n$-Ctt{G7BarPu@t5NEmL=BAmULKZ3VV0NG3xv4!eIVsGIyFz3XUy?Id={&e;z47a%b8^lp5Rk$MFFD$jW6Zn@b0h{T+~dB|=4k@}6R=(wMY-EnyD zeVpq|;VmvTt_XFtFeGO$jqiC&ST{2I%@otv`&j1H1qD{Te5Auve}wTPq^&8o@Sq%s zpoyef6x}S?=hK3Dw#C9V9!w-|CR1faIc| zvrWbDEO-^A3W$+2-Mgw&AN=_Zv*!XS7DQmmwof%ETyz^l4Urg==BHs0wC%W$pW!HG zkou>TW{(g{Tp7B1pU>Y2`lcLoERId-R}r4Jr^YiOR=+T&UwP*UIBSqE6zbK$E-mYR zJjvDLRv*Wji!9t2Dg1g6v@DxII~=+kQ}U2%3x5@%w8DOI7e`09P&96M8hH_EV^lKa z%Z%s3UM5`V;7?jE=3RIQE>lWriRx7v-$0k>9_?FzA{ox2({;8v$^!$ zhuJYhH8tw&y59GDe0G4X*WUvtczYkcgC3r$)2c(>PGh}B^e{Pi5nfLonetC5=^odb zvuo&)*N@rKRUa5#Q!gl!?v)U(j6QngLD<+K1uFdr=~hNM4qtaW1)%}>4FgWB2|E3z;IXG8 z)aoKZRIMNS@fDtYR7a?$?H4s@4>&=*soo!bm2BvN#0&+m%kRT4_a3#~yH=2*YaYLU z3F6~&B+6&x9uKOpx+^J^zHpCC9gTaq_5IeZodZ(LtBZSw_2|&di~?Fcp?^1Xs+@d$ zPMd_qO`i|kHL`hoE37|F^VNEOBwJIfq4uxWN#pytGjh(W$Mp?O9ePXU2l~d=EL@Ge z8=kBr4XTV0@7Cwc;6K7%Fn83cSId!zpnEd*?!I>9-ZK@B4&xl?%XVCm zH8#qAgtD?#<9%NV3_Y3Sf?^(-dw-BI(3lYfY0dXzi+u$zIkHUIYkOjflG8optE9v) zn0u<6%BS{w3^qCe@D$kv5Y;EP_*);W8Rm+0UmnO0K${+jn(@VZXXUPBX63wzTm63T z!zG1!R|Ux2dX*e+Aep?)Fw|G?Zavr1hrK>s5m>*@G$%M{wWjMmy>p0uxrw#RV z5jyQQ(R)!(iYO6Zdt^(yDg2<>K6V8z8QZ8elG6Cqq09Nyxw%-iYH14EmaOU6J?P`d z*R$=HY5^+Z?N)+@BDJHHvBsM+%Oz`$@YeCxZ!s1~Nn5vyEL@W<6+9m27e#Ad+=Gv> zq*v6(t=(AgHEy86778LrRYYQ=>P>j;b>^=m4WkCs5XB=l#*LsXz~JRPKpQ7Jb`s6U zFt>gIyU0H|bdz81ye?iV^|LJ7rDxkut_pZ*0W`CEosW?+7k?+S)aBh7R+Ihpd+`z# z%zCYyf9TGE(ys%*$g^TuAKv3j9oG9VtU0{UEf@Eywcym#lNp1{%qecL>dlVZQ*A-d zP^%Tw*{bSlNx#gW`^~cun7p#GoTKZ7nup*huu!vcn(4WND-`ZN;&utBqT?8znP>DX zddFiiqWbO@ZS5QRLXrD4a%N9__!YGw6(dw}^+lCucZxz)-lRoln!j!oxgVOk;0zbW z4x!1=%F%^i-Uw#dr4J>U-6Iq-mXi@%gSGp(=?$7O-laT#&d3TfHKX??_1d?IM~OyO z;{CVzV*q{kP+{}CQ%R-=cxXgu&pX;tuC?5)fMmqFbmQI%Tiqvod+6QSB5(Fyd0XS< zsLLC;r?U2=h5UtTC{p&S*8e% zI=TqG))Oj=oA5-xC*1;^g|~s!lWx-NdZH~a?p7q&2V-B8;zZKlxv3=)kNUyQC_)tA zQad#IpblSl@uuN-8Z+Nj@FYgX)t>Jf=AQ&4&heUjAA-e9RoaM`s8CdoH9nq>d57g6?QOt$K8myqB;BC13(e#f4`G`~@k;t6MBY|{Y?~LxG@CoR zwxLSE^WJwey&V^mys7UbFdz$m5a*r9#S#gD8uhfgFP$w#U1S0CWPZw)vbSle>m!;A ztR7E(9Z@dms;jjYu=@ZP3gDu5VRVT0?L{iyC;yaWXE*ftF{SdZs&jeuQc)&Y5CsAc39K;z45r z6Kt;fi4Ip?CIOfJjf8_b<8|1O7TtUsU!}qW-bB*ABh!xMauu3p6V#K&S9s$!S_(6O z4oMu~5~qDZvjwM@k0lTPniop$QJe7YV^C23&m|wSR&s)SS8(p!)B=eOsSQcfuBNYY(Zsc$soBFS}LLc7KT&Vz> z%@{9xtz1+3+9GMpR|#lMEa(a)oq~Pu>*RACXwB)W&8jo$r?+n7QXTpJIW;7J}u>~VIVS-1= zu_epceWG`H_9ASxG80B@9nSk z0k(LZu3|>5Al#I9%%nw3HbzqHR!#W2nV?squ!U5P{w-@(>(oAg{{Ed!BftVcg;_oJ zt@>=B6+>FZhUd7FZcWZL(TqusOdfP);Gec-g@1ng?p-aWxL7M(@Z;eiWiq>lG+VgWe zDPxTY-m6*clhS#2(bmy%Kp2JJKwWNfEtmSicW|^e`(%2Jn~sA()cm*1obHv7D}WRr z0zja}F5eOMeE-R>{<&K_~5wclUFvPakZPpw_3@(ot{ zPSw^n>xc^NmDC29GUuUU^cNw9*L{clY^|41bg-=J^9mndCbWg+cq{ENr>}=klE6q? z0V+9>twtJ{4ScHwF*07B4OG&LFA&6EC&bsOsI``5KW|)d&<$Mx!`n3ovMb#rX9@P- zFAsHFrg@%EmZ|!2-P)|xFRa>Ye{oAl&V{uw&9?+!%&U!T=mCxGEi?%%D2*65etFh; z{GhXx1MH$uQLGe<-uc{=P^bTMSQsGDZk%S7k8M44$&ExT7aWz8jD|aWo#(*(z<>Q_ zuZK9foJSeSjQ7TD-p9=+4HfecR({?h=+^nk8Np57j(YGthaVnE5#mf}+l@sDmnEON zUWW{v7sTw-hs9@eeqCmSgO59|<*Ri`G*V{s*X`fVK0vv9CWsjLWmo8zY?_z7?J5an zDXY)yZQ=YBVqDhmZwH=IS~KoDuyQzM-Zx2B(>TyCS~s)#s8o@WynBF9qyTr@mr$v<$*B_{E4=#c^gVEVgu=BydOz8x2O!d59Y8>r=0 zob%I4ckt7GL0yvDT%I;H3%Qne$fHT|Mt5(P`o;0rO0mQ19-jVwKgzZJy74NM(_HVJ zEgr%n`V|lAmYi6u_iQ3I1-P}EiS6J#*e)6zEXkVFAlj^_LyafJN@HveJ_v7m;)k8A zzPNe0628AfzB=g;#TNQyE7Azg>++Ja@HZQ0Wzn6rkDH@bhzIdp%zn48K7q3|?JZeM z^yCeOd|!W-<*d60oSguT_{ zVYY;9vi&N&s z^PMKanHYOwtwP*IEZN7=A0=b9+KtP$ya~8SLV!P1L(ZTQm#NIT!hhCK-_{bpy=RF| z#ELQ}tmYFl!EnLCO0Ht4#A!y(QGQR>bvBD1*|i_^j8X-w z`VZ=@$o15LzET~mQgxWEnLOeqOSQr`XShmwut1)h6xMO%?0bZmKexZAKcBz4S`SCN zz1BEZ6l7%AK!%5BKq5{Gn=@8#BtJ?U;<1=#Aipp-KZT%HVFFnD&@Wh_Wl03 z^iuD`LhR+!e?Hg4Z+d+Ov9QxROkvUQdF>vUK!Ud;{aaqSbB@7Q_# z<9(b^^&~9;B>Ie2o*mB>)73KO*xlJ}D^n$LR zP1tN>1bUOq;FUJU?f%{D+F(1*8(*~*gv!6EJ{D=czA|4~` zxZThqgDrW2P>GF72br=F;CGwYpYe0-fs&^UL(D(mcdddJlZ(u6W|fSAM5E|ubpkk#xSlSJ8Mw17GL!z$qZ{j8 zuiGoVl=WhrL`SfBhz)<`baZJCz}d5&;4^TQTb)^T!=(=5AmcBB__=F>{q=0HJZe7qMaq=rCganbY{|RT zQ9yi@Uj1EZgz3w{J%RHs)oWSLb+K%18LxCT#%$M(?q>Ytw$<9iE{P!+dauK993=YB zUPP}y-;;-%L$LXeT4F_PE`g2PkHl!KHze0359&JE1VjhN-EFFe;sJ}Lwesy&fL0pf z8QIM%o=~-uV1jWMSJbq?>txz$BG(qi0JX%uCu7O$->Q;)%QwmL^RQ~(Xe4N_E2Zgk zwOfS4&L{a7#<$rQpWE>WJ8a$>DMTZeV#;Kj=@!Rq`Rji(OyPHHJ8p=!zJ+f6d4*Q< z-3Gf~Ke&~%-U$7;*u1U3LZ7}mmmIK(Y(Q3(bYFJlkZGa0{SP3vsZ4Clg8N2lcNrVm zoW=Yl2!&6~={iUo-{OFKF~MJshY&B%wA>-b{^L!Utf)N21L0bPl?s&DeX5 zGL%!*g^txUkN`DkIA3`>RZ@q3OlYrq z7AMh6WFrf`L`5HbTB&WFk@IHloV`(q!QS;+%O@8r&3`ndJ)E>ve`70D;#F~Guj(e% zy`HkGrqlVIJ40G2Kd|@GV3mBew2%)YE5v5>3+uiK`KZIH3|ddg=8F!1q;=z@4Y=50 zuazIWNB_76foWhmnoXcnmwv|`waKIZJ}UPex*p5-ctmpEBiBt!R-MF~OMPC>la`Dp zc8^_DY{{2WCSM~;6MtS-cLnq zG==w$h3slrx++C8xXoYNDxK=UyXKlzh_6QQwl_VNipgQ1%N9?!H7c^LjIJkbxX>UU z`zx_V%jAN9oFo3Zuk3{e{v0o^Yd864-hZeF*-+K?N;7+zK9{gJT~~;hZ{pdy7$L(o zTnD;j#&CZ%q|d?2HRFKEs8lx$8M^c=&Nwk`yD@>~Ak~N-s1CBbX!GRb>3YUCWkK1M z^g)m6U(`kZ$~oV1SDqKvdM1Zv5CUodDshA)%6^$Rdtu(PaV;=qGYxgf?_Vyx%~}p0 zwd@&i8K095A^p`7^<#0tHqp$Fr?-eaEhcfxd=5MYo3?PUllV040v-&|;nMM5d1GWJ z|5EAr^Mje!)AmgTt0#}P$w$=k1%pZEH)E}{m3AJM_Ac*KGvLkBk$FEdDiTL|Fki0C z4PM4S*-Mwz_*wC==;I9?@9vxk-Qt3seRQA66ij}WD)PbipO@Nb@YRox#71P#k3IHo z^+n0ER?)1`W-+az$s^t@R(V2yrFe6R*PB3HXyD3SI`7sOrLNQU^Y!dIg*#$!W0&G??nHK@MaC#vwZ72O%jq6LGGkpw z8<47;z}a2Q`~HML8qRMUWs$g_s(vSL%nJ4L#W$^1Ud~<{C$cxq+P_zO^@hD7mz%+T zM}JKRN7c&INIxK{>%HVwLEjH*>Gof}FIMs{MHyXLGR`+P@Ic<>i53Xtbxy^{AuFwV7+U}pY5tyd7*8(#=vC5u!0P`c$iCGQBipP>c+=5 z&W+Qk%A%p1E{`29;SDuiAU5?rPBE{jz&}7x|(HzwnUDSkw*vg@@985?R%-~-PSFB zG|xU8wts(BVzHl0p0qs79YeVqEMx8jS1~YT|L&v3j~uon$^YlT#3Mi2-uA6fdlbj< z=5e(I*|ogOee1>}g%3i2WskHf(g|^>xU{+Wz6~vYd)y0jHN!$NPy%=w&kWil^=GV0R^@k?(X_b%QeuV!8Wm7dF$G1|PS29{=dejbAT8+&FT=O(v}z4%kV zc-sf8`JE{I(*d1{a;uEBcT(^a4u;zQ(cXLi!})w+<9aU0|SwCF@jf*>M@MDG%! z_r5Fw)(U#2#y?oBjw~QSfT$P}B;)q~}_i52JQHZntB*#NFDJ<(EIbL6Soa{=CY0mlG&C zl?vn{Z)OeR2p4DyxV?0CL!gV$!dVRds|I&yq?qs`bW!i+o7I#kLexz>Q$7DD6zvd< zfaX^9h>p%tR1>9X<~_0B!h|5Q#UyA>I$4LBHI%HCR8;>@!0cK8k`rgENV|WtVWUo4 zcYS9DmOnz(c4Wb3=~6CMwM^8JWI{bLVzXqqI#&NRGgFFNetc&6EWoYQ+Hb_}MVO`B zo^NiGP$kEE&4vXEm!uoIj&`i!vj$^y#H#nU!*p4QJqcUMxkgTJoSQ2N+F)K;K#wmhua}nH)qnf1M4Y+3nVkuLo024W_8yPE550kX@PdrP5 zryOgCXu=AX3Wi!hrt(qy`)%YZ1;is{Ply*O=I;(+J-f*7=tzUBFy2U5n%VA|dCcVk z;y;|U7;g!=DI@N=Bw{{9ksNayNrPuG5(GSrBd`%q{JFhP z*s`wyA6zg}YXwq}pG^t|)yn{f*TJhoE4^xmQ~Fb4r@7Z{NS{F!p48F9ayF#gzOXSY z{CNcq#}{Y;5iYUo_kB$ayP5Sg+APrnQCSku*OFM+^OB04=L>ge+)2Y)v$W+~;wfDn zGYx6u6`NA$W&<1AED}5cY<7nXY+HLNl+;H(td3^AHS)@B*YuZC8Q+M~NuINK5D98p zxb>Y(0LjrZC*pL@0oIXbl)WedN;=X*gykxmOm+hc=4$>`6)cwQM8U zf^+sK#*y+5!&4eVn8LeMQG6~xsLOxlD-k1iabH(M;g}s2y1mQc*+ly1bi_QwS@EEW z)MLqC+EPY8J&8QvFuAdSn-?ALO$h3i_NTT{*lls}E7KnAYbtbErYhd|5ce>tfS^F? zys)oeS-rAab=5gF5w+h2No{Z40Fv=)lS%pIkoW9YHH|+pdY3$IbjuOcqU$v{`Tb*G z+m^1UyI3skcsR^O|BspA@wcfr)#*hK`97CfS*7eR&Z_HoS7p9^UXzx17!s}K3=hFA zqL_<|hh~^5a!=qZ00&M*u=X z>mqG^-`=X}sKL7ZA>)+r2{lbzQYISu?j@rwA=88T;rNSw zlTr?G)r&$(PSLt1N!L{GVNWS_@kaMUQ_NHywrLt;n)YY2rm^baq`UJ8>qaP(m9Ws^ z`TK1%Mj#&askr)pqlrfC^hOB*HJ;)%BgdRHr%fhT*gH(QBKOM14`VtP>a>&b$rCtK zw$^0D#?=)~*i8oBtYUzmt$MI|3Fwi5VB9FL7P5d^^}6ZogN5Jms3r3v)-4Ndr`wCI zA7zK3#I5VEV7`%n&1_$XdeKQ2Fi8rZpu!I+lzOjpUqZ1+lyj1^{g<3?X>33 zHi*=Hwmy#IIcj_tz+RGU+Kkdr+vESoZK^y>dtKUsiPi`5}wDhZL`QsP4z4 zy2bb|eZC*IJ+wB8unUHAzkJ#L%6Ia)UnOWo-(_R@ReoFdmpTI7gY7cyQZ)*1&}B~8h^7t(oD>NqkZ9N6-S$g?>njfGMoc8Az%P*n zzi*ve+rY7WO04yYOJRvz0Pzh_=(SoK6`ta|cgsY1HPFxwU11iEbP4-@r_uWy-Z@pa zxOlc#K=*a3dxzat3}P?i)H&Dlu;=m&TN8vCCT*)E9Kcx@F-#158!s|;1}k_fUHj(2 zyxg2}eW30TZA9~=ukjttV>!r^s(4@NySw%20WCU^Yh!LLANAUs)}qoW!CoIbBU@wk zG0z2x43B<`_@M5sHNn*+!;JPlY6&1*kMkI?Nw~9vs8y#oW>v`@`j_thkx~5o-fvq7 zKzAz@xf>|7zV%Qt56iG}5>r0~4K;U#Lq(x;$bVf&}% zXyG0YG3C=Z_01f{$z!j3#dw#8T!y>zpF2jQ1F@vkApQUsOs8cMGmIcZFnsULc_sJ(G} z<;=$aL9Y^{11?9_0jMLCZiPNuBod8SL9_1uCN-68)&Ead$El_^--@7_J%}1*V9vQ) zO#xaj)BP%rqGkkhsoi!0vWbKJ>^SE)3u9mL#$a`<%;|G6vJ0MiGK7VGz8G-J4|$!g z+LG0QR(~tFe5U@Q1AaQtH9J!$R;Y@pUpf$ZvM+e26ruXd6?7Z>AG}~#>UsKC-QlFPff9w>jvWV1Q3Wf7eAOvZ#g!^q}ivgq;FPcBU zoI8tnNjWaCurG`=R9;vX0mh{>8wKK4{QaC`&iNW*@caugcq9z26(R9H{19(EPtwe( zhB;J5f?m064CV5}+Sj^(pQ+?=eW!O79fCaM(k3NdBpKTj)ZChjI@)PpoE z&(`|gKYLoX{I`ycsV{cA$zH!Du(D=UHdOzPJ>HwBx<53Ri;{mk&5r_*H}bxMCUxf#=cmSthwFL=U&WN(_)%(Vu zP<)T+h8H*$*b6`9g4NE5k4$tA?We6-zfDdeJJQg>7^h zPf@^~GF=8ZtROO9;uwfZ#6@yqP0I5((D~8}KNj}LF1`@!e{+4#jWF8(0pQWek{uoS zlJ*D}sphjh6svp$FDlM3!0#nXZy_Fjd4li5Z0hp0){~b)?Mj|_ zLC->@QRP4=;i^)UU)HeR);N=zY>HWM51;T&`^OYnMMp@YsjWIA6mP}b8alVjgY_ssDQnW z0LY7}48ahZ+pPUs$V|44_(_4Fuf>SRdvN`V-52sJ1zqQ@v~@KsIH6WS;~Y_0+!tz~mg5Z7({8N%=IBSSF@R82TPi5?|6m2*=xg1RS!68jz_u5C zFW+CoExIjKZbq-Bg#Z!Kn1FCQV}z&1z4L;J#g8_whGKKprWGA5N2H@$*|Be1x92g$ zh_K);vPZ!lDB+W}tvdHbMKm;(*8J6>P)tLbBRhFp*@F#ndS8Qq#|m5zwPBObwFgvy z3MlN733LC=mnu!(XLUTt(AzkIZA}>%$I?^0O#4|TKKM`g6aj=7&j#XGmY(x*+;zhX zr3J`QD|0FkB6^!XGar1YrU~Mbrbl}aSSQijSZ5d;lA~qu3Eo9?D3wr@O6>60lQxQ; zW#U#@y$gKXIEpXaqYVMgE??gLj{B3sO1v`jXYfg7l7d!TQ&L)RiAyrU{)ZE2713hnTf^?{Z{=M=ShEf8~bM<(p={ zPNnXLJ&WjpkmisLA2Qu9A45y*hr^0^X6Ym2g*M1YnHMuGeeOL+Cuv7Qz-P+B%Em;-{A`z_39f($*A3ALL^R122) z&oYIDZ-!p_?UDL>qCV9a(lM0~{&TR%Z*WUyq;Etb>i4KMP|((@^#nqFrkBt$1rVWm z<6Zgs3%^j}H*@`Q47OUMi)RJNFp1Kx*dQ2?Y&Ens3*iPqWv|R>?_cPcz!fhRaNvpjmfPdQ!|YQq(GPb{S`vv|hbkD)?j>4ec+l zjGv7`^G*um5@TkR-*dNKXu_|x#-F<>+EQQG`@VUR9O^8g)=CJ0rM_yZ>%S3x`Z9wy z1Aq}22%z&MmZ451$6@RpDHlyVpkZZh&TG22b<5Kt-a^HL6;Zxm;v@d!Fu`!r9tlDT;v9mkI0&tbFV|c2NQWJM z8y$$FJ}1^=%^G$A!vkolAYym%z8F*dYnELKjxAiPn*=csydOD!0q&hqKix?AxUUw7 zgl1mGf~?Xzd7~VRd)sWtKlY^5P>#!HQ{ZUANfv#6KrY79!`OI;^g9rBSQ(42 zy^(3#?=A$#f^U&sRQ-fXvl>VkgQP~)POENEIn9Elt%jE#{=&4Yr@C|F_68E$(7G&6 zR!_T^XQKmC_Jfb7PNTZQE=of4lDY5tVUZ&?Rs6uo0$)r$XlkhxxE3>7m!l%FC@1$S z>?F;5nZOr6|5o1KZKN?L-3uP^x&BvejG+73)5$d%KDd6$*#-$VSgv(SL!d2;=dr|v z{mL`^c)J6Nuj&*fSo~3NAqJ+Mh!%u(;L0~Vz$;60sBbp|YE4I|z+Ts+&Zytpr5n{>y0dVVY3hT#(DezRr$kQly1xvSQx-#2^jZtmO- zlr~;FZ3SJ_#2pLC!N^{?VSd+BT{PTHfN8f67L}!wOZdLm;wBE#

nwChvEp|h2DJ3el0xP+Q^$x&oSa3s{%@Bnr;@}{RmbqsLgyte` z{;|T`T;cYk%5AKl6iNfnw9vDx)qq*CkuND+f)sdz*}|#AJ7-I9h(O=OGiW~%c%q2OR+T;_~rxP4=ZtY!tzL9#v4OT;`x1>}6Zm{t**FAM@ zUovsi_^L8O=nZJQR3adTSozg;?LqdNKQQaVjGp1YNoj0E8`ynU9CPB>( zngW|n%ev)^V_c-fYpzpV+!Xsm9aEEkMu~}30JBx{ew*{`eqv5fJLgQI_B4-?W+f_L zmjhx$#Fap=m}2ia-9!Z9V7tJF`ea&$1p5@p)!uCdjd0-O>Y4y_gz-nHs*1E^FoG+R zUi68po7PfC!u1Q)=|FRr&czjNX2ggqvnmO!0FBsozI63sQ_DWe>P7&NlW5L%5P2x4 zO$r*;@oL5C7-<91!3s2$Rrvp!7GCuz*%=aPJLlSWuZ!3D`8>3jU8SkC4 zf;u3AH_)vb)E0A*q9Rz{c7QJ)=pTG$L{U{=Jef;S% ztC%UfiF3EU+Xu>$ymoYOp#ody<70KQdR#?wNf}l*Gd8WU8d)n>n|XX<&H&-H?uP0e z?bInACtGqkyD^@*IVbtK7RV;;%Hz%)2-NbNuYvH7V?vP~afV=|bOMaNyBBd@9*<9n z*k%fptwoe$WuJDd>61-!`h5wq{m-H+_Kic*W$C-UBS(h5zoE;Lf|GRS^|v?ZrW{61 z?B{>lwvb=`{G?cJPdK$r_6yPK5nS%}$`=uu!(l)ZTPZHacvkk{)kUJOS+z?~az)*x zkBQ$x<67HT|jEwL)hxR`VRRv?<%(vWO(DD_(0<)W3f(1i0BnJ&`q%`n3DJRw#h*Iu7$Sg z4E-+gyV+j@g@f4?m$@cQ+LMgWdQ@?9-zQBLjl&ndu`Gou4tk%MI+rcXm!i2HE>DYg zF^3*%gX`E;q2`0EncZt)dDl4a`?EIO_MoCOWuif6j|LpA>Ma0J;=B(siVNCTT!ep_ zNCECA+zHU`Ljy!WUvKjzc2_718{qrd*yKPb#@7@QA5=f4cDi?%5~|YSYx&d5umzX+Acz{F)vZVf`?0vT&k>u z&~*;7RfbzD;fY&~%+mc8bxx!|gq8W@V!HpnY~KVRz%cUuGN;$Wo-4}O+^9q!Y?rsp zL-hq}_=L{wE6EBb5{<>*y5W-v0qP#&pmxY7jMKgz~vSlbkmT? zpp{Pa0#mJc!zFe0R2aGl5-mqM3nY}<-DiCv`)4D{onL5&2O5iyEBY?`LM_J<6o4>o z=_o`w)a1N>LTmco&ny(93a{qt({&rtw~(InwGb2#Pjb}^s7jLcFq&NB|8or~`ZWy| z&iA!wPv|cjR{GU^{`p*la&IVZ`L2RTJ35!Gm4hVShOJgy#>+SdH#?!FxgAipcUHDB z(eA)1k=LZ2-H>MtTfWHtb{P~P&=|a8S6ePI!y6OtU0?2L;e1q@GNr3q=kUFlIwL1a zRpcq*h24k%xXj0Cl3Cz8IgSa&%V0c#kV=LqZqbGDlbQGRp4a z)apFGV?xbb0_3a7bsV`ChNRLlR3*kRJJS*X8@o06OG?A0qb{&J2 zY3d-t5<1D*kN0}!UbAoPG~(gR)qrEl!9l9#NsZ?pFAWRSXIiTPyz^+im>Bc^U8HP`zmxf*+#4bt-7i-BtH{!5C2V)9ivj{($TW}*IL@CCi=tyZ6j>vi7PcNk{%!2?c9 zLT`falC8$Yhb!hOcAcw@wl{9Pfcw9QQBtfHOC%mv@CqlZ6S;CX9~4PV$J&U>+l{?0 z_mFH+u})T_gwcePCZd}1o~CjKji9~F;1vgXO!IEMdTl*~u;DR+u6s?1H@!uuG4O0M zp8hf*@8Hmat_DuFDdrF7b0BbHJOnB_I$pgnIT4$WU@%#EyI|AX_{s5ca>u|joi+7* zM%(UR2J9D4fJGqG627+n)mr&=h&SnY9m0(SMA}Lr`e^szM_aO%?-4H5K|8-wX(v2Q zVLvxY^tr@Tcc;~bVn`3N?kdOaniLVIUcOf|^73ewGe2KSn!Bay?<{Fvb7-(F@<}L$ z8&#xGj=c5lVt@U16E8dq61JL7XkisSgw~$??w3&&8DE_EmleAY0Nwntot);XsDiR_ zId#WwzS-~><`*LSJ}ZFbVp%8;5B%frR4fi#8dYC1q-GhT#1LCa5{U#%Y<@}NTe%FL z$=QOQ%seYMet4vXp6n+^cL$U0*Y8^aaS@bIA76rrTDks&w%^v z+5cRxBDYVjsE;ij1s7CiN62X}$!toR&vCkW@jtzBmM7qYvB+7^z4`G&ef>qtkZ#ID zH#-}(22fJXC57l^S8eJj7po`7;`8$pvCym03opv}@P}zuwMNjr0!`RH-@s9fc8*jK z0VLl4iIRMxWZNASy;Zb(a0$~?~e~z8)IQOx{@H`b#;y^Wt3Kf;s zPg?v;s4LJ-(f&wQZQd+&sUsj25!CI4*69(=XJhHxb&2LyBoeW&mNPsV$`1W?dDauM zn-|Jrp`VM0;rMN(bW=aQd2W}Q5d6beN`2(caJ<$}zlV>~SQ+8i$O?cp`ReJr+VS)` zP1rIm`G?t+sAWT&s8`gp(WvD5dT4VpNXRak^fPp^`fI?@*3kD2Xyx~f8YiaLMqg;n zBsWK@yM^_DE|h&swKqu=+=9V8wJ=Ikq!YfL^b4hE=GwxP;WTlDJ_ZZ=m@`Rly!Ce6 zr{l;6RL!?$yI*b0{|QFvBC%$yynh!1;FHGu6J+=DueUmY;bDSa=v;0F`!?uYpFlQ!>8uZV?W-+ z9YnQ`{o<~p)>-P(S*#EMh3YqlOc6wXl{b~!lpa#pUsE&9 zU4$4Ra;Op4=k#0!L#;_MB_!VTohS4zNklfuF*6hFzOskQzu}-t@dsC1Ha{R7lCQ*` zHZ!9BI=8n$f^e-^H-mWt{?^tG^la;VG;HoHPr}l$BqwY@d#OTePY8B!l+-1yuRtW^ zXtfo7@Gfus*G8$O)%ncOIYwlP20*jZT_Y3Vysa*IgmsU7X|m3RdA$H^A$2h|{X@|~ zw4w9}(((u7tMLT9xN2{K?e`VP0b64PoMH@iIE8N#PP!*;wUsx7KH!R@DPGWjQHYzl_dB}a$ls@rM@={r2?*-hTJn-DH-K!IPk?AzrKZ1h;jb*OVo=ur#r>pn0m zc%CqF*E_i0-g@W@9gRK9*xsnYL%tg>x@pT^ogUcESIsU;6NmfLmM3jVDjtU@sx5EA zs)(HS>acaCK^E3SIVb$B?FZ(D#KwjW&3x^(kGtS0k%0u9(*Gl?l?N!>Ee(jz6zDqU z&w3HnO*4{FuL8z~~`1iMN9Th7vvE!orOGC)s^R&5q; z4ch@LBJ<7fUIpEEdrep=S+ zuyENxC^9TGI^REU^k-RUXb==)PMyW`2(jLEU|HC4YkytGe$2O#2liuiO{j?G;4BOr zQ2*4u+3gPBkCY%{z18e_<#pbd0w!Dkz=7f=_C<*|3Utm+8PK;i=cv}X=9Qg(O)pt8B=PQ`b74My5+Pn03P+|!@J$mG(g7wuT^z5aL!)&uw2gRqz? zaeiTjJ`z(0_-!NyvH-sSU!lm~E?!lxH2m-1;PbYRqX1V?JdDv`U6-1I;R2`m5^?MTZJWFgV9luoI zPi%?3)V#z{7Rc5k-G3J-ow;=xs<{|jiwAYvgXp{$a=qLtNSvuY* zVi~@wZD%}PIi>{n^FExWs88dnkR72l*_bG`rcOnq6!j#-e@$BK(8h$^BpYyyTKkVI z^wFe=kb!6#GjU>F5{sL4@cvQDgSetD>Tb1wKXTh5bWJLZ=i@89CccCYpPwo}_4cU0 zUKuvn)g(yuc%15jzv!&{OkVoDwen_gP4WK5yw#%s zR6A6X;$fpekwI?m1S{kHe?=1|J&L%$;O*-5(=`@5>2$N_MMLmdM zeozb}i6UpmO)jKQKoz1MByIoFTwH!D;+~9O{Cf_$Sq1PQt>4vJZ8a(;wODz20$cG~ z*4Q2scBx{?ps%GUcxC1uQ6>E2kUgx6a9d=T@!jsBN~0^Nlk|A|hR=Q_QJw$Zqo{v> z^=E6Vfg7Op7tJ?V@D9JsNwn5eKGt&T_XlPP~icl-Yt#NPwurve9pWL|31HV$o& zyAGl&uk)$Xt7ylmJQK4+>F?wKiXeZVY=GvyH!3McJSeci#glyUh1FZX&mxl8DY!}H zznx4Y|DzBfdGd(hyLapL&gR*4tG#iUjyaM`mJ1;tB;a*_5_5GVh>P>%03<+udyyf- zV`m1aG|!~&y!X}_i=>ewkpxxuE|Scr{+~v*fkxX(w*RbwBo~*mh$zz8H@LiaN;}ba zk>B86ld}J0zx-|ke<+RQVn!x99zUu=D$5iY(7_d1KPRq9u)bavv7h(EpA!5V$Jmwr zNR{vR^p@fDbL#Ho;>7oOZ^t^NAa`D&W4SZph z@^{eMbpZTrEJFO56E$7m~X%r40yPM z+<(p42on>f7ZVEpaM{giGzA1f6p+UrsT5i zj5I9VZ{?g1_P&F%+L-re`MUFW)6~cx0$yN#Z+gep5~(;%IEWmb&cX~7b&s?+XgX%J zW$H_M-_gEiV$3WO5OB@&q}8w`_o=Glfi%V6>!e2h!qv}*uyBsRX^C7f9pP$0_T#)q zmchZu*NepiAH&i*M(chkhY!(bbB6@vHtuAE2p4Y~{1cz}AZGPBzWOsKov4CDe$Y=^ zRv073c=#9VR@oh=!^+af^$TrNkd0m= zP@?TQ^lCH8?xN0?e8nLmV>HL**1iMw4G^#Agzxq>{tX!caRP2&_MZemt8lG%w$6it z{T37ABTMvaghIl(rU6X`hIP|&tOYkmE-75jY2Gurs4YCQ!Id`Ph1I9Ovp7x$(7(~v z@={2gB0}tOug!f9w=kw$_(&T{G@MP9zpU{{)$`ObpSvJ+~)++iLy7h&PB zLNAWIo;aQDob+!UeqaN7!rgsx-#9Z8q(mL=CT^Xu;^!O9XlWW2*VXnXhC8wA&?;5* zyVIUNO#a%GD92*t=l$doucR(CH_1Fhn$^A+pV{O;bKm>}#KOi-Y6&)?ln|uel7+0v zl$PF_mKh4&U39asi zS2s?ew6#q12h-%ApV;Xe!(zmA{_8AQT6((Yp@Lr;Zm81iT-%tpw~cHg+EBlf<(oF7 zsvvbEW&!>MK4a|U<}W_aQXU$%-#d{hc*@hlXo8?}^G+^td`rOml}g6kN^k7?+kY?H zH|a`ws*8~MEtRT)Ik_eIwedu<&o>Q-$RcvOjgzytg_#r9?0-JXDKsXF;!qLy3o~TG zHbjuq%t=KN6e;*N-F&1JRj+E_`P`O>4be2CF#hX)SZIl^x&J>0to>+EG0E|75aP-u r;>XI#|Be*+_ Optional[Result]: :returns: Optional[Result] """ return db.query(Account).filter(Account.email == account_email).first() - - -def create_account(db: Session, account: NetlifyAccount) -> NetlifyAccount: - """ - Create new account record sourced from Netlify. - - :param Session db: ORM database session. - :param account: User comment schema object. - :param NetlifyAccount account: User account registered via Netlify. - - :returns: NetlifyAccount - """ - try: - new_account = Account( - id=account.id, - full_name=account.user_metadata.full_name, - avatar_url=account.user_metadata.avatar_url, - email=account.email, - role=account.role, - provider=account.app_metadata.provider, - created_at=datetime.now(), - updated_at=datetime.now(), - ) - db.add(new_account) - db.commit() - LOGGER.success(f"New Netlify account created: `{account.user_metadata.full_name}`") - return account - except IntegrityError as e: - LOGGER.error(f"DB IntegrityError while creating Netlify user account: {e}") - except SQLAlchemyError as e: - LOGGER.error(f"SQLAlchemyError while creating Netlify user account: {e}") - except Exception as e: - LOGGER.error(f"Unexpected error while creating Netlify user account: {e}") diff --git a/database/queries/comments/get_comments.sql b/database/queries/comments/get_comments.sql new file mode 100644 index 00000000..732dc4e7 --- /dev/null +++ b/database/queries/comments/get_comments.sql @@ -0,0 +1,14 @@ +SELECT + id, + post_id, + member_id, + parent_id, + html, + edited_at, + created_at +FROM + comments +WHERE + status = 'published' +ORDER BY + edited_at DESC; \ No newline at end of file diff --git a/database/schemas.py b/database/schemas.py index 0aa83065..b0e453bb 100644 --- a/database/schemas.py +++ b/database/schemas.py @@ -326,49 +326,6 @@ class Config: # fmt: on -class NetlifyUserMetadata(BaseModel): - avatar_url: Optional[str] = Field(None, example="https://example.com/dsfdsf.jpg") - full_name: str = Field(None, example="Fake Name") - roles: Optional[List[str]] = Field(None, example=["admin"]) - - -class NetlifyUserAppMetadata(BaseModel): - provider: str = Field(None, example="google") - - -class NetlifyAccount(BaseModel): - id: str = Field(None, example="4e7c4f1b-e51a-4abb-8a58-105483724713") - aud: str = Field(None, example="") - email: str = Field(None, example="fake@example.com") - role: Optional[str] = Field(None, example="Moderator") - app_metadata: NetlifyUserAppMetadata - user_metadata: NetlifyUserMetadata - created_at: str = Field(None, example="2021-03-06T13:26:56.991731Z") - updated_at: str = Field(None, example="2021-03-06T14:26:56.991731Z") - - class Config: - json_schema_extra = { - "id": "4e7c4f1b-e51a-4abb-8a58-105483724713", - "aud": "", - "email": "fake@example.com", - "role": "Moderator", - "app_metadata": {"provider": "google"}, - "user_metadata": { - "avatar_url": "https://example.com/dsfdsf.jpg", - "full_name": "Fake Name", - "roles": ["admin"], - }, - "created_at": "2021-03-06T14:26:56.991731Z", - "updated_at": "2021-03-06T14:26:56.994492Z", - } - - -class NetlifyUserEvent(BaseModel): - event: str = Field(None, example="signup") - instance_id: str = Field(None, example="725df7e1-94b8-4b0f-8d45-dc710d8d1a47") - user: NetlifyAccount - - class GhostMember(BaseModel): """Ghost Member account.""" @@ -387,11 +344,6 @@ class GhostMember(BaseModel): # fmt: on -class NetlifyAccountCreationResponse(BaseModel): - succeeded: Union[NetlifyUserEvent, None] - failed: Union[NetlifyUserEvent, None] - - class NewsletterSubscriber(BaseModel): """Ghost email subscriber (may not have account).""" diff --git a/database/sql_db.py b/database/sql_db.py index 5c45a4aa..98631d47 100644 --- a/database/sql_db.py +++ b/database/sql_db.py @@ -62,18 +62,18 @@ def execute_query(self, query: str) -> Optional[CursorResult]: except SQLAlchemyError as e: LOGGER.error(f"Failed to execute SQL query {query}: {e}") - def execute_query_from_file(self, sql_file: str) -> Union[Result, str]: + def execute_query_from_file(self, sql_file: str) -> Optional[CursorResult]: """ Execute single SQL query. :param str sql_file: Filepath of SQL query to run. - :returns: Union[Result, str] + :returns: Optional[CursorResult] """ try: with self.db.begin() as conn: with open(sql_file, "r", encoding="utf-8") as query: - return conn.execute(query) + return conn.execute(text(query)) except SQLAlchemyError as e: LOGGER.error(f"SQLAlchemyError while executing SQL `{sql_file}`: {e}") return f"Failed to execute SQL `{sql_file}`: {e}"