From 765422af9a0484b9e6b98b59e918dcba9d9e1ffd Mon Sep 17 00:00:00 2001 From: Hayden Date: Wed, 13 Jan 2021 19:33:17 -0900 Subject: [PATCH] recipe models almost done --- .vscode/settings.json | 2 +- mealie/data/mealie.sqlite | Bin 20480 -> 155648 bytes mealie/db/db_base.py | 22 +- mealie/db/db_mealplan.py | 12 +- mealie/db/db_recipes.py | 95 ++- mealie/db/db_settings.py | 15 +- mealie/db/db_setup.py | 9 +- mealie/db/db_themes.py | 12 +- mealie/db/sql/db_session.py | 16 +- mealie/db/sql/recipe_models.py | 126 +++- mealie/settings.py | 8 +- poetry.lock | 1041 ++++++++++++++++++++++++++++++++ pyproject.toml | 37 ++ scratch.json | 0 14 files changed, 1313 insertions(+), 82 deletions(-) create mode 100644 poetry.lock create mode 100644 pyproject.toml create mode 100644 scratch.json diff --git a/.vscode/settings.json b/.vscode/settings.json index 3a918bca1..c98f474de 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,6 @@ { "python.formatting.provider": "black", - "python.pythonPath": "venv/bin/python3.8", + "python.pythonPath": ".venv/bin/python", "python.linting.pylintEnabled": true, "python.linting.enabled": true, "python.autoComplete.extraPaths": ["mealie", "mealie/mealie"], diff --git a/mealie/data/mealie.sqlite b/mealie/data/mealie.sqlite index e18abced839e7ffd70715a23bcdbbc1ca6bd1709..f56f7f91696918aaafc73b2b5259ab5d3a1d3a19 100644 GIT binary patch literal 155648 zcmeFa3v`@kdLA|)Zp3w@l^}|uNd5#x5hHR2#Dy1#;&MUoDvA_IkfJEAmiuGo2Qb25 zW;Fi{K}f5We~{X>WBbI{bLuu;ueT>@T-T}B-6XCrYaiK7ZJ*P`j+4|*>)2i=PTe}S z9oxw!K6Uy$@B4lK{4ViL7)YJ76e)l_)iakAluiyZDOKrZME#q<-C%Y z&KA8p*}PvaRnp~bA@4W%sDI|#nd$3ioa@u4UOD45XyAjyyjUSd*i(bv&-o0}4?wmNSyg zB-rQdtJlt4ICq(!jf8_HoNH&!p1F4B^30i8voPNo@pF}hL~kOv)2n;+B760**@cpq z$zoMzuQea_HP~xSgU#->I^8#5hacZ8!Wm)PL~yXX zd)v@Z+uCsf1i#_`w$^|_+iwn2Ir`WC+&mugsD5OD@zKuiZF}~#t(_BKRKKtO)>Q+T>gSt9l5Y%nf>eiYV83j@EoSe4K$Kj+ z`deqs2CAQLb^~7@N^`TlYukYxZ7cRXl|=e?NQlhu9cIBdE?>BM;|xfp!RTmHo~HTR z5V5r_ZQa{;>}b1xTOeV+H2>LB1B0+*Z%_THWIR7z$`(o9qqv-1b{A@pdsxS~mGyF& z;b_a@a-r6{bl_hM-0A=M!EYb@<^JCu_~XG7{Xg&* z8Ah$Ow;<4hKnnsb2(%#3f&H|=KJ<*b`@^O@vasj!ky&Q;1~ zuaun274nFk@LzbL{Z?DLP|8b_bjh7d&Ux8|yjS*{IfROZ)MXxmPrOU};_MLa!{Ri9M zY+I~&cME>9<5BFno z&RxPP(uK^vUG39t^Vz#z(l2JyUb0vy%68I=+4Pc^f9{F)1GaO~U0C$W7}xp%{kAupJ*!;T%YsR&$63e`irIPa#8!bb8~R$CexKt zX?54r?T6du-JCn`<&uk)uV%wgR-*(+U`pZC1vqWg}Q%U82;2O?F0oApq{ajndE0+qq!sS(* zchSR*F5wR9MegL{^4>~vRWS(B2_1>{n?NrdjV{aXUvE>Ihq{tX?!eKnnsb2(%#3 zg1}!62(WjEeNzA(1Jh<0xbx%Akcz93j!?&v>?!eKnns7g8<|ITmJut zL8$dz3j!?&v>?!eKnnsb2(%#3fvTT_h(}9--`cF@&7LV z-SKzgH{%oW_~2Iu|JmS&gMVZ2GlL6*uMCb4_6_{*z&{xHv4QUzSRQy~;NZYV`u}zR zKkom#{omLB>HfL?kM?ixZ}0n8eZSuKvweT9@4dcTeMkBRdjGih*D!SJUkd^)2(%#3 zfU_V?u8j@aI9k$QB_vgekc z9IpFR+V0)c5j(lPX{|bk1?&7_2aUEhZ6ttrW_L#{X-)z=H)ZX#|Mp$@&KyPcJL&f9 z&W_mF_VvZ=99AM+efHTV-%6>o9Xs&tw)K5w;9bw)`1jToz>A#i)7yz2b>C~xr#oU( zLyc?Uae&?1@cp*N-z!X?>WCfP)3Ekk_2705q0zR6jbxA=PjeV^%T_#Iw9Ew4V^+Yw7_udVOr$Tveh z_~wb)Z?KTzt$+bKG%nevU5C3L+Ge4If`xm!&}Lh+aRemWIB2YCJKMe1AQv>?!eKnnsb2(%#3fCVGfUg)tj0`XE8_~-XgYA3T zs`jiAe&Ntau%BOGJlM-c{Q)kA=g;?MH)Q{{j9cI)6WZ6T?KGY(#$T?QVa9Ku`HoL$n~!f@=G zIRrYfzV7({%2n=*|5^M`<9`tUz4-6Me?vd|&wTN%<+UKtf@>Rdk8#t{{_Hc*V+nxKD%}jKc8Nswm%e{#?QxscKnP_^OJ%2kKwh3@t==>S-)nJ*1r}6S`cVKpap>z1X>ViL7)YJ z76e)lXhEO_fffW>5crP_fxW>eFynA=4L|n;=kU`BPT=Rx;1GW92zKJ`Zq2?Y8eg!@nf|f}tn7V&{eelxiuL3fXefFR!9BNzp47y;32cO%}87 zyyMQ6z2YU$&9AU-$w4PwDLcoU!aFG^S6E3d7qWi2Qu3VT0-Bb*T+Ve0C10cz=r$Z#Jkogb2c5BrdsD+EM@2uu8p|sM=h(et!~DQ^RG@d*jH*>(tD z*KA34SF8ZCUS`4box;46k%0x~qBi^M%r~0idkGT?T4; z<;8*w>&{{GDd(KdkF(DE^8kkK7D!qwc}P0)GDL}#bFDHL1q3ibrbr6_1vaj;l*I`X zvV|3oh~kx2UjVj?tVn>?tw?%k?RF#*rX~b+Ui~CT>%VuzfT)$r|0X=f&n)sgU zu)fX3$2df#!4RHX0xn<#KV2v(DlGzJ0FpB@S1I%Q9008-%>i%A*+SmUCC1_$YCv!jau)Nx2E4!K0c*W{+DjEP^NB>zJv?2-^GTQgU++Qt*hpz!hZ~skM{+T*-svhF5aU6IzKolFiG#!=`bW zSiDQ;vKw)hv-gD25Utz{ND5d>=`Q-{=1@Bdn@c%Ya-_;~MVGxywz5ptqE{7%f$S(q20*8RJ$-VPZ*Lfar*a;q zR3P{V9W1hx)vMvGqP!Zm#wF>-2mx+AmwmgE1+9_0%Ko@lN|tc2s|w21lrsxz7KJV- zGq5kUw!fEay#L;Y*BBKaumrOjnLg*17C_=~+(4r_&{(dIL;@$f0*HWhg(p@>V>NQ? zbF22mWWjZ(_2K7nAI*6=IS-&N;~HYt^pcCoGFebTf(X}@OhRF^f{Innd^VqjAYtKz z6>5WgBITSWj%wqB2K%_y55G*I#SCIQDu7dKQ$2DYP@4{Ty^))F&C67PFoLtdO-11( zZzNB#q_>5Vlp)aedSHu?vB>QJO2x>W=Pdyt^hTHQ8%J1hOCZzoYu$Ay%$LE(*ao+Y z8*}sELO_f$=lYyqOi>bYvbgGiWDbYulaks~kh!F@olfNea@ZU;l-C>R%OqaL-l|D^ zN)2w+gQ2a2-DhuY75JE$6PHBe4R55OfMt2r(iR&vB=EuT(svjD$jgD+*`f!Gtu4 z5Tu5p1xtk3oTCg{o!o^~1W~38@?k_eFq<+c6J;+mJHO(wdMiFvmxndD$}x^RVD>)foiYsEXC5)?JsPrJ@|bVVWkwE+ z*UEkz4yt%7f)L3Jc$Y`?kXq(#MFgFd$J3VqJdR%tOuQ=U-_o*p0e;$c@Q{}OP%lPjO`opqvh$y zh)+>4Qw)&-M$;t_DWXl8G9Z%rp+yyzDcM8vOXr}5O>}ak3-u$B2Vrlh=;`{{0+CVl z5&VuDd%dFzor0eFUYD}>h`#!!E8r0zCO82-5bzoQe0$?f@svq7 zy@drkrf_FP27Y5?Ij+*LfF`}Pr871cKEmiy7VNRGLOqd^7TOs2^33G6ezc9f zZ#3zB56m2tD-Y0QvY^w0;sshE#WvDjKilU{|yCz_FubrXv7*%B~#1(bvA0BXY$-iIRr31%jSO3EuN^z$9ZH0e@94D>AgUm;q{mNI@F%bvS-(bQG8$pv?H9 zi<*x`Yv$C@fYVDUF~BT^1Gp?RqR1IBbqGq04TGAGv8SR{DmcBHAXq!FNf6wG>b>MB zU4Z#RWUzw}L`1|872#mDvgwIci{|-nO3i z8d`wSM1T)=?dn1i-?bhk!>h@q>@t+?B>o5Hlb@|>h)PIAGgOU`GlP&p_A!k?i&Za^ zn+B$8b;LBNuE^Me$g~|&p@7DwuqJDRXpXxMwUevj^+3sJ$mW^UgTb9#;AgYV7uZ-( zR^e@?usjEK68r%RI0zdJcSn}G>;kJPH;_(ZC!r3xj0!z@my5`UQna+F6Osk+AX{Rq zgw!ug8#fEq8))_<39gv7I8BMv6E+r*A&@vLF36h1%41|cP7pz*y00>=18WD2S%+4?RnS_+X_uLI|-AZ^L@2f1QZmh(?P93QP{MTd0o34&K5t zq;2X(t1zk=oPlx)0)m5=<4LOqTZW`aW{s^fDgG>0`73K`%h<6yg@c8G0(I*Hhy6yISWG&7HhPG6l^&#`WD$6bI9 zQ@aE}is&O~BVrsELGgfEKzO4gY&L`j8_J^0?u=Q6AH(>IpQr?}Cda;sU0(XP~8e9U6R?!QHpn5q$&W>|1bogE>A@(0* z^4b0j&-woQ4>@P3603!UN(rRMa=4J=6)-bCtQ>^Q3j2zjc2t{C`ym(L8a-SrkST|( zK166zchIX66kG_s#<2u&lxRT*gedyrB+02#^tSl4_UM{IHYJSRj;J6NI~=Wm;5^QZ z$Z;GEjQ|>4ZCn|UC^fswJRtm-WMX7ap*%#IMz#}04$x=t09u=< zX&p%((=D#udWyb=2X8;p*C6_=I^GnvATNL&$b820iZEV8b>#_?xXB2=8o33xPntv^ z2Uime;lOjK5MG`NiKq|w4i}nCHVN^c48toeLqCR{5cjZbor)!BBVh8dT}{zmFMuK; zD3QyVeVc1U;SU^?V3D-~?XN}dFt9;sQfT~!TaWg>5zCxuRrE3mP-hW9QIvJ!(FP#|syZpw2nnLAj1%Erz$xNfhFg{{ zKOdHD&>zp46!&xJrUoIQxDTUAbagT`7XcO!dZ2K4W!f?`B`TX((E_ZTqW@3Fej^tD zmH6jSyZ`n0#NeL|{?_2n4*uZaw+t=~o*mpX*g5b|20l0NvHsucf4l#9-+y+ua}Qeyr=CcKvWyu4}CG_dCD8 zv(UM-<2O70TE|kyiyfWq|3iDF{aAbFmS5WPJzFkq`AFOU*ygqE#S*^$|4vVL#L`DM zp|FfQWwG~aOj;kC5Gmt4-~mYj3ohf79|P4aav(BZ~! z^MGWEaR6jjXPD$0T_>71rwIWB{wyp}OZ$CDJ`hUbKO8}?vF5!*6n(4NL0{1AEPGTs_HxA4$GHWgrZ8n2X{n|=7l(ZMJuA3BOgu4$N? z@(zt!OHAW=vvZdo+V@Pu&^kwkfuNb#jaSeT`)i|kNGvFkmT9rui?`4cqqPk#-*RRl z6c+JQ!*x#MNwk|Y8}ba2?KUBKV|Y64=FSa`0>Fx8_8cBmyLn+lT`XUyr3=s!B!J`; zUS7L-a#I7X3;DQ&H`;FA*w7eb<04D@;j@ACuu-dm76_F<#yGca6MKtFYao6#GR@0) z`t9bc8(J6QH#B<3#uL=j(V%0fGj=nW-q2`cb~MH*95f;jb^M|W>ZcA9x&dH7f%o7b zz5a|Wg4t!Eyhu|+-A1Z5h)Fy|cXRKC7ICr40hgcP+Mn1^wGmKh?B!W^y(*?MBP&3V~kzq$YU6N|At04W;=;?^OJEr2zM^(@g5tU6y2S^YiDEy z@f-AK7Co38{KPYOop0ZsXmc3(!QV)P_Tp*2eG}2|L~a62m2fH*E%xGlzPd)E(52v< zHO(LeyU+Ha(Z1+N#>gpD^(j2nw{Lsxw{)WK#6x}i_D4S-!_X8K#CyJLE51%N`dX!c z?cMmk=4rf1tSOKG^N)1lX}nk0dCq0nkn~Da<02a2Y5?i(X5GYIJlr>$Sl16=0fQI4 zA4=mh9ekCrK_l#G1n>BbPBi!~902B#JjKc}JnT1mW_`=A1P=gSJ6+9DB>CXqiH2Pi z1Lkw?J?L(@<9K!ZoZoR#AY-@k_?{xoI z_jhzpcei)_Uf2K9^+R3vx-NC?>in0Tf3Neu?96qZ?Ck6KO2?NvPPG47`xn~JwYP2g zTU*>MPqqC*+o#&Pu!!dWJ{|yOh1+Gsi^8UXs7`g)B~{ATn@4AkTgoJbruiCmV5Q{7 z(e2?q^8*B76oT$ek8eaZQP%8SqEOU$IKk=}i>oor;5y>`^b;2XoK@lQrYALu%YwSJ zaif>Lg^NK9V@+*(EV-pA@BvYNEZ$vs|7%*9W$$nfz!8v#XU#2L{PfqfE(^?BU+~rU zFxZ(*Z}KZ2e78^x+Y#no#FOL^#Z~rBe+ok$u-|L~v1+*et#>iXjZKfzTL(_V7NTu6WRIy6%bOB(@0$&te7E2YFcf zg%UW|w0&b*p7NClG~FBwzU6etrFOrKwg;kZ$Djq1h0{ciSAY)}p{AZ}_O`Du2H&|1 zr;qF0bP-|iJC_K%WC7hqn{^8_959J+%|sr}_cv><0>NEZz8_tt-rTIIl~!QX2b?8< zZa9Yy+naTmlz_WumiW}P6%*~##0s#d-)i)1F(sUrviRoB`d-`|`~nR6)#!GnH>eN6 zy<0$>IU|)zbBRlf=>2|uZRaf9a~`yp5m?dkOXAjno>xxn_t0TtU5C_RHBzckbOpBMy%{t-P~Y%~ znxBF661y{!Mx(>^jjX}i*a|cBNxU$JmQ(dDC&k2WY&6b@svC(Bx6!E939if@@)t}$ z&wmmv$LdGb?YpHpoJ>J1yf^N2#*)Fnx`u}e@4!`7C*zAmT=6TgEF&DCfa+~Ivh8|2F6;X^4U5iWq(8qd!__9nvc%NO26v(bjle1rmMLp#97 z(f05o+CropRWh~zHkv0IHWi2Xp+)qPq-j znBhYu=N3{l3M+H)Fei51!brQ#fZB%Z&CnMa!r3`?A|L%hJ`H z!F6Dq;qDu>w;0z+8u5XJvR`AV-gg}hVAKv<-_1B3j~FinnWtJjYA#x+fSo^!fh~G(1oJ|(7DNPi zv#XJ`FP{0@w|C(*`c7{G)*t?qb$dnN4ptzdW zQDTkE_0`Q0^&w6q?1;j8Daq8vWreGj(3A5>a)nb0(K{ss4Z}{0m>MWR%;8|17J`+k zTPN3ZM)J%bhH`{x9F4L8fEn3hQ`uxO4EkdtQYz>?#yte-W_yt3gc(Uy8Bv13BAK00 z$&|3ocndif)>na@3k453B4Nm|jhB%`E=FCZK5lK;(0HJT-hmh?(-|jjh`1vf?j994VYbKd zm#HezdrhrH9M}@e#%qODAvY?49NWW!yF2W(R!OqBOAuRKTy7RBNQe+sMF9;6jVK&g z8Cf1ty2u}dQ6yf}gh7uOEwc=9IS0_d;TooU;@o`3+iHmZw#ly8(V^hIhB7V}dYxwv zqXA~E7p4&oYE0Y4l?+7xJf5&##D76uUDE*fIlppYWv0ry!90jof|0Fz3vSX>}zU>+Lta;8v_B)^}L zdH9g+4w}GxDXb!`bk1<&`aR@7y3I&~cSU6oD6D80nN+U?lAKDy zjsPtodr{>FM!|S5NOU;-kU*Rfo@EY%Ea*5O0Qc4}{2HOi z04&kEG>R7oFZt8H=HUyi7DaGHH9^v9DdP~i)v{a5y9I+$ti>Xe{+jyq3$lt^>sN6j zFQ>^Pu7Nslg2aNEa4=+`cnCgy8&(idW33W^OGcytec@$5-WCWN2a4i~t}gggf(y7` zr*;b7@%-4!poLslm{EO%M>B>ST7c9SU=x#@K)%U8)#M>(;JgE4mhv8c6U`t4v(!`@ zOJbQN!0lx`q@j|4J5M7q!2XMc*o{~C2jtt2jF4O%WG7AO4 z5(L_lOky3&aC6)%CsN}h#Q&M~(0>D~mbIwRR9(8Cy0c%7Y{&XeAr*wt&=NwqHg>5X z07lQljn&kN5s(*f4*K$8!@@xUH7A~zoV^}1!$uS<9#|OoY!qGQ?`ov-yaW$(9OO{g zd^i1&%BoV=8Y;2QG=RgBR5)?Tg*F*Y&{F=tZy#43EN^nv!hKXXhqJ@z{faPRNZ|cr z8m+2Fumx!i6>AlewMSS#S(Fl56OKXZD%4(6>{4sqb6n?x&93t%st^e)GU>C&HR(A_ zH2U!K){n;9CgJ9~f}~0D6B$pyEmCnf%=)qeuVMgGY;3MF$9QIw2P?fbXBLSVsCPo0 z0vTWwOo-uT%!Y*&L=sdHC7RSA@RK8>$U{6gg&%O;M7XPF;I0-B+Bbr6Ku7KJptB)8 zX%&th>n06l_&4?noRMa-VFMDem^1{!mFCyZQ7#7au`>Jui%VFRiVd^!j#VfmgVKV8 z9}^8vW|S&)e`#9$K?nA>ndD)l`PE+A51?f!3H*K>3PHUnM~cn2>=-GO27L zDmJJ^D3|~uVx5#~()vc=E4G|bRoJHf-`DoNv3S?umj)L5zqjYBTYtCv?{tlJ{GIj= zeBAo?p8^7FxxT*R4-zK_hK}yp8k;2{dfs_WRTSrnQ68>WYnnN?ixQjbREkww`pU{m zDxY0oSwbnUrRC31S_{KTWi0D{umW`gT9E6UD->AX#jOCBVBANlJj(?^Dk&9UE2et{ zF+)_Ppl5+LQCTd)2uh|Z8Ub{&3Nto~u(;w~Al2k)-5G+74_qhMv=tP&xaYN$}8-YPC!hJ@en%ke|wW648f$+7YKqrH8j zA6z^-FfEkZ+Vn!bwyL4@8Svi~Jr zZr*(h4k!5#wXT+g15zwuyd6lzh5gI09B6qejEK@=NFN92s4s}b{?Ce$O_hAcAYl~+)C0UHzbO(b1eAu_|Dep4a!k@YU-IeJZ* z`(YE_*C{;q)Yg4bJ+ZaBJ$;D>OJf5=37puB@C9c^JvsKctl>-Xo<=m^U7>mYWhj%L z^D0YRmH?*fuaO6>C<>z$BI2M7!kkgWK}(Dq3wMb87=e$Gm4J5DDcg~1tsz$Bb01ZJ1~V|^;X%!%uEM1mT7 z6Kobo$O>OZGKA!VzZRqka&dF?Rb!FMOz=klF-wgU{jYq}_W+eKWiGSFFjdpt!oK#? zD&X&TZ0%34C6@LKrT1(N_8Z7wRgm!5Afnb{qgd04|wZLVLn_?P?NB*0_>w@kRRS< ziLanP3ubVkVHw=+T!B=4mNFSKI$?kXej}YlEF@xDA%zlMiiUgWQb>w`?uZ%|Kug># zIceM?6dhG1uD;X;;mZ7oC}bPA+zb#KkFXZ+>N~OKo*5WAA@l-PN^m{rRAqi1g&{1& z-rXP44x>iRn@|t1KjQ~bb~Y<4?i3XQkWf%&dKSQJ7ll%Qj?x7Rn*-y>)vtkdDUFr# zJ}4))A|xMhGJF}Fz=!R{$7%V%*Bs0gr%(mO-~Xbsf1!dK<14=f&g_4$S-wg2`sxmo zbGkzt))qo?{DWsY`_FxL|Enj4&h2Rn`c9kj!LzJ_j50K)3bJ!WsvryNl`;>!a8glK zQdVJiVJ?~G-wSuvvP|4Eq*JmeJFt{jHg$;w$4-@2ajVb5EF?kcpp_6R2sC;Ws+Cwd zhN;AQT1$`NgXm#MagaROk`+vN;cfLLDX}cP*oD$X!lIeGI5n_1F~nd-pn|600$*tl zyf9C?Q#(jllh`z+A~C|k5t7|a#Z?)j=8u8-WFVk0@4P}ihNU=jMTh1|+%4=!koCssUo5hdz4UVWKoVePicvoV@s$$sjg znJUDeOM<)z7Z4XT0EI|G#+8urJ+yNbx!NC1>>fH&aHXR!v9{Z=_sbwlw`kCnd>1OJ zBt7C}M-?nFg{lQaD$)Wyc+4n5n?=bR2p`DvLhUU87U}XJP4k8+3gv^V3Q{$EdJfX~ zptjNGhFtPAD=Z+x0CTLA@gLJk{aMTAm6FlbR2v0YCo-lWbHzG|IHwMXV1`0 zFwPxU;4em~9c^ouU|1^^3Z{tD42;m&?+omk%a^346)_P3hB9-R*8v`M@_V*W={jAe z$qv^BwicFCgZyw3mj-odSPBCFaZt{ZB8;F~#$)m0GyhhL^Zdp^dF*BX8kTKq*RMr3PjR78tc#QG%iatJ0z}4Ojz$4A z+5o|zv|<(bMPzr%9dMw4(WTIk@|`9)nA8WYw}@qu(<6Bn!{}{|N>>}~7$V08?&}7J z49*VqjRpSHz|a`(?913$(F2yx0CAZXn~@6!7ZF3)>}O&@2zfnj&I+j|w+ARu=n{J@ z4uEp2dfM4nE)10nt=++sWjoeX@V|+R*;Q z&~9K%H^n2A#qvN5q0wMusE>s_NqoR^n$HN3)7e)HQZg_X!;L5xH>T7>LaXgstGjtLn?|Yt z(rUm*lc$eOVZFoiq7)?4s;u3O@ALC7OG%0Ph`PlEQ6`GzQxms)UxDOWwUKEA$kz z3rVDAQfW6QwSeefkV|9IcjXLkxLS@WDVK>IMY587> zBJAyH$XsI8;z59$QZU2%fbH}68~|j5jG9Gw23QvKPsnAJZWqK>72Z@-fag|Ry}ZR4Sda{fW3UP-25Z&BD7RQyMzBsI)hi~b zFnm(40|qyGrTWK_QzJG$NbjfsmUki8Ld!|PVrx$q7ssBiMX|=;R#9y2-N*V1!NSU( zp#q5B#B~=4g(N(yHdE1KaWZ9?uumZgPYO2x(be>0J4Dj1a6b^$tH@-Sh#V}i1k4bD zSULDzRv~2}benbx(g_^SGPo|x(b|+24Y6e7Q3{-d*t$}iPDUaWYVA9l9wG$Q1~}%X z2fzPXyzl5|+Ke;cQWowg{C}~Sr6<6-#!B8e0AUM6BxCNB!i+4HfvW+vAd`jd2Z&Cr zBCuGoiq`(y*O8c8e|PzjT-q{!8%0jQXgQO2$EKzx$EFf^jU>DfWW+cbxfjOjVT51_ zzcaK@OB#dUL$!iAl+FWaZxIs+Nd*p22GdI4m7U)D7lWb6hN**bEMN` zR$ylZCb2WrYY=w)M)zi@#>*`-wF5DYA=!Yfc{jOU>@?Ld^UL0=hF^xbG9G+4Clz_b(co+vRF*8LK`q zHBE}pi_V7Uf;_l{Xl(?-F;HCVR8r}_0Q3b7pe+T)`AjxL>%5qCL~?}70by;3KSOvA z3*pVGQ(q49_I23V7eQyLyeUjDxq7O2Zst7dJg$~1czgi99cb=VYR<8j=5e*0!W_&} ze0hV`9_p3Zdt3@-Q4<H`+i)OZSPQyl-&eu- z;N$&$$!|Vzcwi_AG0PeYoNHO1C2-Aus3sVug!i6szl>2)4h~2JxB^LtDzqsPpg@7F zPf!Y>Kp_#TAbe+tLrI7x*&|lEipwpyWC#nsMx9Ech;jPh&)ZR#N)^~Nb-zVtiv%7* zaS3hR{-_ww%_>L5;{~Lu4@!lMU>~p&%)EV_3qqaWF?oWhP@PIviV3VOy?!KYLf7c} zq==$TNhphLh>R5|a;$tIG666Q_=sPjMeDu5b5$rz%%}mzWNWOXE+>kU=0e(0jVd?- z{T|2*HyFm(NCZ-9B7#gvYpa0S_(pK~#A*eDdoE*KOjbalujc|S1)v3Y)rsi9(gktT z%j~i9+NfTOX7!&}(Tn>3Q0%Y9;)%iGfnOdd_y1o1_w_IJzts1geNXmI_xASuLeIhO z@9&!L_?h<4w70kYGc^51{#$$HRTf))Kp%4hiG^VuS`v}u8JJ8ElH!prN4nrHYP5;G zcL7DqIFF6b5gY{$4$?SVVl(AjWX2AJNLa9usgFaq;vdV+@e9`(j?5rIsY}D;BM1h^ z*W!*6tYK%63iP6I#;g|=TWlcId zIOz;(e~E$<{g{!pB*l1s4oh;Gc};Lo$rkcx3?1quqMusyZ-SK^8LlXLgt1q(fFOh& z;*1zCaTOri13qFf0zV06vmz{~^eLBCW4r|xrZxqH4|svCZ6~b%o?1Kd z3YYMp{cBpnO|eYL6)>5yAky%|@n#VB;ViA4Kl<2=jfacIQ!41ffHY(PXv`eYPLEoB z19bs$wYB%_Bk2ek&COW%bei)D4c*{3U@KC$*g#1jCm08!r&*V#TC??HrtUv?k%0T) z&esGuR;sm;Zn(#}YH&1dGY~#RGlwO%?nsI5(Cbj9HR4bu;=`^ba%A;!BwWG|KR+vy zl->$nTNSi$#Wm0m(zwVjS40~$sDzP$_K?!x2qH2=070Yxcrk1R@^T{`P@rp=maBo3 zPg-bv-WDB!2Sz=P#*|4UDlnu1ii5lmTvzTD#wjp$^g!XH64JMIxx}h6f*5dRATmmR z@lqa&IMPC-PCbfMnN%Bn0Fu`W%jV)D<@nboU*<90fB$PbrpC|4FnNscr`ZDp4Dir^ z#Oi^D^7S2idJP~-Y7He{7FsO~@7)7ILL!-DFwH@91X$6Acn%sUb^%CI)%UH0)|u!~ z)*rSH9mvT6l48{ZBzZjI$ZG(#@I39A;Y>A#&r99!zaZE>`Za;=l$1`#uwrWr>yeum zIP8!>kgygC$v6H4RcF2hpWcv4F8DZYc(9mIL6?@%rFY8=53!NsJMNs7F&7e z@#qTKuZ|-JY7c@-65@&VN|sr${XCB&Kt8!zK&)H+k!6U;D6Z5$#dY*BpW>>y^a{QR zb>$jNSTDs8S)Y(ak`WSI9F+u3f9zZ*5^JtDR5`0`D(s4QLd%|Q_}}5P9N~D=5s3f7 zgiU31QY7f`!Id+Tp9I@NXqjM1grv|TPJO{d@kBI!;18&u@L-`@3TpFwiio~Un8W6% zZ4nLicu9qzqA<91#FV3z2x#RiQsLkF+C&^-dzE2;;|QfPe?Zpf)FPSj7br3q(qti^ zp830{<;Ad@vIC>*awFFag=O-X^uxo^$OIRlj2%kqn;nprM3f|hSfvOjJh%^%0`%`7@_vuhR9o@kH_z z-#|N2ztCA$Bqt_|Xb4hZ3kgoM`SJSZH>pb!9$B$F`5GR1R6h70C96ACjt5)ndS~sgJ|HRoQdAJcnyyZhe>q z%;|)7qN0fOMhGbFA#yju#1sx|(5<=>h*J2NQK&HcP&u;`>!ul+!(0K98pva|6m%-M zeq6xNX18Q@Y=YquQf~w)B!L}PBAHbt(m()`GY+ZQ{dNf8)Hxumz%R_TmRo~MjT^~F z7)6vKNN@>3Yg~QcfT9Iy&pKj*v6eM(h~%2DZELim07m2yktBKgd>;4J;%5H z=GMDg$GiVs_ZPcYy03SSb$53Cde?v7^g#{D_a(~Jl*y)ZGPL)*l)$Y)0h=r2~dRL_N#^oKg!7s z5kzVnGn}enA(HC>3NhTiv%%p^Wj(lr;m45@AuRVov51wmbE_YI-b^$Vpen=d#0G~Q z*F_dxWJWEy7lLW@y|BT)6GlHaRhYzSOard+zt@6~VXX89$Fg}vQhCZ2#cNy|@lt>{ z3vOTC;J}d*At+W0)iY9ESQ+qq0HSw0Xxrd`6QcbztPn?w2%;gYCE{2lpT*!cv3xAR z`vqe&>z(*w-+(Z#-~8Mc;VA&UpyAMaKET5TW6AY>G|64uOA>FD2=Fw)*hIsIVEDM; zswpz2U?O-CZO=7oi+opSSiR4~z%2wVsF?>`XHPKI5!-z@^yOc%ndnQ^61p!0czj^@ zxvmZ?E-EnBjRkm_YM)!{(Dx1GwQz zH1`DdC3)o#j}&=YX#ypu5<3Gt9Acf{ftK%CQ zR#VS&I7mLMkrvp0Eab>k4W2r%1#m8{d+A_LfcpCpL^fz*Ls12AqrnK;Tn#4*AI=yVJ9dnqgU*x0!+J%! zG{h~pKiH2R(_s%&alVAi4l3PrfAa-ZSc?+D^Bu7RQ+076A{#$%Wn+8)6T!X)ZE;gr zf6Iyoz&3dXD0mKS_t%Y!-Lb6^Q-Zw>o6vh{!d8w3!*~nfT;s@$X=jozwbVzMz*C3Y zcqZ6`p6SLtXTh~7w9Cz>>oSZo(SlsahsMpMT`+MZa4^o9#^WGfNc3qF)xe-O+Ws(_ zyE+}9;{DX^#vLtFL9!SEI+E&>2V#xzVMlm#5K9Cbwm%>2>WobVdm9fD;%9h&h@03= zR%+{Td^!YKPKU*7;e<9$ zK1`ymgj`FbsQ?xCr!F=g+K^czPivj;G?Xw?*!x(3I{Q->8uy(rmMxXf85H6$V|u@Ei2nUUC|g=Byl{ZkW- zN5wit(6p*HA|q145ZWJZ+`cindlDUvHtt~0&C+frSNey7C(vW6aStSqG4wcaW z74Mr(Vh#DGkJ<#sg2&P0c(Y0Lr0lYcA@HT(G4#3Gq>myBPGB51V32Wn(1nH%D4s&b zM}j!ICmMUDR7bK2{FA{Tnoc)vY8_@$zmt*Gs&cL56C=Su^BGjEqlm=fKbHekub-+k zo`L0rslkUqQ|h9U3B?XVvzR3QJr4^ps%IjFeI)2>J~yk1Rt3tlK`)v%@piH)Ucq6t z3INWqpRjiS41yrw!UnYi(NBy9sFOc+wDBg!oK-}eBIPJrp7l_$6+Nb!^gyvln1Epi zQfHPV1o@*u_roT^`GQOnSfTIsO3>92E6i-#V0yMzhlpz8!P7x!XRHuxz9jZ}x+-BV zk?`zVkC+uA<;4k5eJBOd_a*dcLy46EBM9GvpnzQS+C+eAFkIVvo8EBv=*P=0aEQ+h z*7=+;ubL9-K3C}%+7JtTvQ9P%uA$TepLL6xNXJHx$&22jlf$%D!x|wDa-aVH{#YRv z-#@r};CS!#t(QA@w*SK|x7+?h+fTNAfG@tj|JI(k-4)wC^k5*A;AlQk8#v7_VkfFF z9zqNjz*(`i$}^|HESlVEUV9Y(K3ofGMOMj=1`a$G$%-(Hwh-sBm{QaiO8JN`59>hy zl+^pEZ%?BSjB3CR0Gwu*`I1ZK2G)I)?=nZ8?4&u69t7hnGzt)lt1}GA8s?n~d8&>$ zP_Y+AvWmoHC{BRMH#%bnhR)QQ` zE@wfMS5W^yu~xpx;DZmEa7b=1@(#7U(ZqppVvM4f81qO)lITHFbC<+=zTpKKLC*=r zB?(gT_S1+auX5T~wbe{qL|P0EnC(@XgKvmFB3J>nlt}{zojGQPyvuP%{F=nHnspge zK;n-2XlalHkHPR#AxtdDL>Uakz&yU(oa#M|MkJjtii=UE0UVJ^Ac-I2kZD)3M7984 zF)G_ZtZ-R!!@w5mg{0Kl`PU@o$Me7}5nlBh31_$nmB=le$4rep{kBDE~i` zu2&#|I1{yKq^@^d*z_U;o}q$<1kunc`XjYf-l}S%oM992-iilJwnuu(9g2nI!!Mf$ zKw)^1DM<6fgK@G4X5m<1jQ@J`WSyNHW=IJq%CRN>}nTX(KNHF)U-jOUrsjq3hIq@IY z15S>bRbKtngZAsZFrS@meqm-HOM$vEb)FsPK#E{uG;@AvgY7(VB-em8lCO;_tJ_IwdHw1Lpz186)Jn~vlLBjUo*F;Dy#c#;O z+43Hf=pom;x|R)s0{KlMg9>|s$P^0mVpKw1yKf+x2kteZ`TclA->nO-y$;q3d*?C? zs5Cl()P?7rL826dSSmGeM{72}QSrgaA?!&9IMoHHtk)DO)pT?~(UyQf`XFf45BaUW>U1D4iYF4FAW*pd4 z3wbzW5Mhicb;lObzx>!WRS8tn~a!7%@WB^Vewj7HFXit7i=Pu zmC8L4hmNJO`f^jOSffSi zF`(7cl3ST6_Ek`NIhG7=tLdlD!=m%g%l=yi9l>Jx($4Jha&1}^pPOa z(-~jP9&(b z%4NfleMloZykPgW{T{kwhS9WE}S$HdaPGgct*7R ztChdZ6o|02MnYjS`mk~#mtlH<%FvTlz2O4QlE|)Sutbq8w~9zul9H&!75r z;X`tZYQvKZjk9iTcwJFrCOq5lR8#lc7YNr6#x?=h^JLIgNTmrA5fI=Y4M1kf6I;#I z%mEmNc?{90d)XRKiqMS2)EiNgeE?V~t`)5^Y#|!a#I9EmKog={C=5vwfXouA;C9h~ zGIv7lmwJrtYqd0?m9%k@U)NX>#}3m5e6)I+Vf4Nn9MyiJ*&M>fjFr*Yh@)1e;OM-N zgzcL+h5F#}$-{V20_F&uja|Koi{cwFdXd#?gi@wnu8It_l3-`5|Av^Mcq>jGb4O{# zldr9-mV_?tb;ZVpf*tE)nn<=z(QvDw*wB($u8syl01-+RA<3vGpSDa>5EIfIZLw%4 zGD$9rl1iCG>h+9F(%ERKNUfFca0MS!1GNZ%OCHjz!m2fb3MMEgLhq?` zC>ay;4}->q^g}BU(i>)_U>kF=gfQGv)CFE{Q*9q9hpb7#?Z_Zna#X$)|DjD*NvDyZ z!B^l|3kSel<^m&Y3H>DyXHefn#*(kYFW7qgP!dlvAg&26m=dBNBb>>mVe1#F!`FrY zqH$;-v)9?aDxkaJ!NC3rlZ?{9D%{~Fg5bmNwIW9>YsRyHPa_QfEre^7CimEr($d;o)etKqA zDGJ1w+#7Qnfy+wdq5X|%O|a6^qHN1iiXRz61D_=M71lu}nW<=}2XHsLP{3YM8=Cq` zjb+CAY4~5pFdjE&)}+fNtwdL6j4|}xM9D#zuyLJaB&_6J4aL-DMM62@XeFg**kz?Ok2gzTj8SnLK%q2hSqUs1NQFkl2N6*%@h-r&uYsGC16Ppeh-cbhB4I7x zTwy_?bI0`yISi2+Y4t#b3iGfcppR9I4WkGevLp@qg{!a^W4vnoM|~~UqN?-RS@U~n z*c`KF_~6dRi81&0)nH6S)YLOG`kfip+9i2us#ZQDR`PzMDkF(NlrEWXtAuA=5}epD z09cz#f|E1mP|l-ic@SvuLNGLYsW~U66@F<*ZZ*4=n3a_>WhVari?R3@<7WqdYVebT zT?0Qp@K*|Lgtx`o7xtbA8{{cdKu2@1GzC;QiibN$nFe2jRxBqjUZunyMy=eeM8__H-3Qk?ho&5 zGy=#9z?d)Z3hhVfY z!GM)!0~(utqi|0Xvba7r`%qBEkcXQMX~0%P&Rz<9bh*^L3yiJ|_&Y2Ce~@-+B{ zc+LLAd(FFRlp)lHGBD8bXae`aJe8L6$m~}-g!y75cpJm+Yc^~&koHJWMAPYJO>GVZ zBF#{w2Ry>!tUnVJ(D6156Oz_yl{OGoWPqhTMGk982dzcui?Pn=19UW!E&GcBENLf# zz0HR?gK|vNUQh-DZZ-Hu(v`H7vqQLzD^=?vsgw|Sq=20;Mezkxx#A1KG8UX@I+G1$ zmB{8ZK@N@YG;Iv-YMkiS9|vzNjQB|N0V{=&Vs7GrUw?Wf2Io=pGN= zLhFmoT3aC%cY|rDWZ9BmXb5~V$fEb?qk4yL+#U@U(SD{`dvhhl0u7rC1RBUU%AAwI z!oy~=;k4mQsbC)M$C}MFZakh$`h`q`@QTxchYoKx?;zKTo|2>~g$LmUN=i8^5COHo zz3?(;f((Xv$SFdQ(ol$ppW^W#jd7Zu3vx1~dO#?8)Z)NP!5n&DYQ7njp4IG19j3PX zi-C*o7n*fPShqxAM-rhTRQPJ}Np!|5eT{GF5v$p0k_asMY)Ns-R7}BrVhux+O9aA! zSjyqx4w6ldA~=JCmX^j?;)bg26+X~+g~dS2-gChx(CB#Bhz(&`E>vLugC_@+D~CMl zL~ti~vop5${sDfU1WCXnF{)Amzai9>(o7LT>oC5TD$VWbeBrLEWv*Tv9c4i+lpc7e zke6Co3&l}rv2bmaM^7C(bmQWcQ?Fl|LYCZd^Zm?D;f`_?;L# zdTi=>qInsXR(Nb(rVD%a&#e84qKPKVNniPOw^Ka{Q2daUpZ! z^-I@Yzj<}y@T)Iho_XW7b7vBXvEbt!vAtI#8(a?y4Pga=MeqTvWr>O4c1P^wR8z0V z*eIA0Xh5+5D1`-rUJBkoujURQ@I>3E){z8x9FCxa!7X$@(0o$yAc`56?y8C4^@p!f znnM$S$Y_3oG#&|VqSwjhlN^E`g)mf9l&hd55L{irMY_e{YedJ<<{f1^K+tAwj|Vr< z;pjs;Fq|W5D8wne5L`#6{mna#PRcx@+8hdI(RiYHW28~S#jU5LBw{SMhAxMjcfrBZ zPYdS;ZEEsR%w%vCeU3k}59;Nkq9wbD(<_DN0v-)8ok)C3W5KHrUE5@2J2v%vS8%x_ zmfTbCwF38t{!3flp5PK1>|ftNK2hiR?%)-)*}J|CUDdL*=YxxAF}AJ+!treeh7zoc z!OLj)?z)DSMBUbDLEhlJ0(Oa;E+izj4C2_uTd&W)RY=?nE+E_2v$BnNgPKID6x`J~|DxTip=##kq#(Rd* z<`B&Ys6*F79y}#XxD+Jn%zg&$VniJyWr?*x!{%X96Pqj|9iVS#7K5`~NaqF@Vv|jA ziLnAiDpY-ZDnG(G<}*|fS|}tf%{Q3WK%rNHGXUsD^W(#`0_#pR@@Y7_#{VzH27hnh zzwQ4&`hK`)cI)HaeVu>Maix8G+aJc3HmH?vq}lx~!~NN{fw%VzWl=^rc}bpEV`ks= z!hA)m2cJS3Kl1ERHyDhq!YB-wFV6CoUk5jYu^lCF=uU)1*p#D$fefc7_6{;k6>p@Q zreGk58X^*3zmh_iT6Gw9UePQ$y3Z$m=rI8=r^z2iAXrB@mMNT2#_CdL7_1icJLfBU zH~1zlSBoOwvRbJ{jE93u1=d{zwng5I(q(M4e^{S!0|kXQH}cx^d-{&94V_HjX~DL4 z&p~00JlCZb`%|I<(bO$a(5Jk36~x%dB7S&n#MWe|g&eM-s$pDj1jwf3j`ML9GDRUm zG}sdV*tq(B0%9rwMcPhXBJ#?R%@IQp&zNNeTNsYzGetVq zF!#j{j92(v*{wk_1iis5D&an;#;Q-3p->_qhG1&xu|jnit>M6d*%;2qlcR29~CDbfgZ z#)~;D`%0Qh`;l>!GAkPO&V+0jXER^=hH8~^ZZRhX*oq9ERPRmlQpi&1SuU;06)8C0 zvSjxo(n{ATVOTzw=kj?N@EoE)J(H0v8M*-xi-mliuqq~x8Zowr=Z7`B1k?eQqj!|a z?+b8^dSUTp3mQv!Y?)V6>n2(Mef5CXw(sgc5iFhA!-vp5tZU^%l8i_nt;fgmrHI9^EEnn4$1P`oF-#q_>3{{M zw1bdOGf7e=Sx-irwG4N-0fO0VjJ5WieTUcF69YqsQEBTVbLYsbq-ndXX={X-I#D3GWlXIx0@1kUMw|3c|9kG;kU? z1~doCtRn8gKGGzXZKWf`d(Z(vX30`prYEVIdT|%54#)-sN;R_YS}bYwT?oJNwUf{G zpIA$tNdQCIg0>m8;GQ=YT<4Ur;GRK9AGKg>(dDakJbM5jn?(ICZ3aesE()|A`OA^p34fyb43Z6?lqgjHQ8_x(2NWv;?u5 zOXh;(DimQGlgAB2nmLb6%Nh*bLOdk*{XG zoXPisK^U&{Rmcg*;lnjy^;Mc50Ya>n=D`#WwxNlZH~<4sL>g<>vU>iH=7i10*b7M# z?>?Ql10+qFXFiiEttK^JQT{5W?|9zWA@ArRFL`W!>Tq&${P1}4*r6kblM`-wF5?}^ zOlBs=?!Za}xuZ0moLGDDnZDf*9^XH}w})bCgMu;XdShuAwi`eR9$E-rnMJBPc@Jkd z2kNT`Ky=Y-2~q@|8>g#ZT@Y0h_8Cedkgla9uihR$-vSK}REzNp=J_$Ed^qQkio_}R z^wu*lVVENFfx+8{3BXxwk$J#TagTfs?-Y~0GE4%h8p8vz271ubg$lxR5Tb(%K;Jc~ zun<4gybEn_mcoS}RL?UwxxH`iTKvGk&|U(MM!H!s!pW~#4$FK4k%o!n3JX<2xe%23 zrtl#oA4&+G;G@5}41GC|pe3n$2VX^1bm4=}3k5s`z=|cA3fTqlUE^nlub)3-%tSJD zDq=4S*I%^}R(G)W($jq>?;k!lFmw_-IAtHUr#uSUBBg0&5l|gP2W(5}3N{8NZ6J-~ zwy)NJ#-0N?1s}8TAcEQrTJUqwx@It3Zy`{$F11?P5k zl2A?~l_@W-+7~=1t|i!3U+lyoz)qPX$nktlQ;U!VSknd(@IAS$FL{55c}L+KBb7;# zA(;UWRs?DQm*fTT$qc}X?ncOB@Y6wG0cnz_A(N7n3nakn(1@?#Rf_K2KH&#W#iE%+ zrlo8doDk1P;O5Z`i{K{@a%l|+{mR^^zv340gRP0$vUAcvj)4`x_`w7(+&&-gIDSvq z1m`x7d|+7Sm%Vl7DGQ%^Gf@>R)c-#c`;%Dw7vtX%e|hjf41Q@aH@JV`cLzS#_p3cW zvNhfP`R?hi>CSyy4xrIrl7DLxK^JR*J{YaC@LK;gP(s5Qa|OEdz9A7!=4jJ6R6}?} zN{MSA#s`X)JbsCKI_ONW;`W5(3uq4F$aQ9b3LmAz6viYdsUS8|@zh9UpzY8#kj@&0 zs@6om@XCb=>If5MtcY%!tQ9$<)#*OC8*~zE-`do1Ot9UQFtSZY#AqTph2SRXcQt9C zCUl0kuYq&k1hF+s;)G4iCUMR(ZI!9VOj8F<7b%D#I);3a;n-*^-giC*D|cQI$A%P` zyi9reh-asHo{*fH4KHIz#+wOumM}Yw-K&e&lBOgzaDcFcOPCKD&ceXe&|9sm3uC$n zA$GP)Gg1@dtxH)zu^O|bNzmr|4Ter3-Uv11B_m5K^lOb$k;)~o(11~L!Zid;r&$*2 zDE3s>IXo=-AR(*qU}3iPDezwK0i*EnAgp1SF^Q~2Yy%eO3&_${sIn5MhI1M`9-;gI z&!CuB7)mP<&>-mYpc^cWjNI^4@4^f79!NK%??gS3V2{+=(?JI@|NiR32*#|j*a9Fq zRLbVFpPC>HP6x@#cpy!%C|CgreYhtnW(%QL`hqmz0cqTPXv$$O00nVGMub3+y5CZd znd(0Iq^8irgur4GfSb*F7}wBY0k=#qTjNZMarMy_L>fU(X=mVE#cKgGFv#ayda2-3 zLA$`FX=nwh0@P=0j_Z;;;$xb|{ul8e9y8I5CNHwYL`_Kcj3Nt8fP#At`9nb) z$6q`5u<@^H*dHIl61+pj4LK#Pfi1BUk+USORalQ0GA+*w65d98sQA~)0`cmP=vtcT16$ZjY9yd7~#JGhAHy*YH@C{r-a=UetG8bLU2z<^&6h=0a z>6s$Ru;rSl4LE1;RGV3zi5WTQ*w_<9p5w02h-*swaoMKE=L%|2n*eX#!N~11JVjHW z1!_#*q1RI$^pVLJ(nS+DR8q0r!2&K@LY$Y#k`N>-yr$qP{EvoSD+7Rf0R9a*ksVFW zS(2k$85B>4t)?FAeV>5*=J>+^Nh-nf7erEzR+5Z^XnR~#sA>R)`fAnCqEL~o5!e8t zeQ<$dFvGHFgw^HB6$xz!YM7;R4?Ze+x@w+}@L6WR0-}OLgm)Fy9yQ^Z83ib528kT5 zjR~RAS9dW%uQFT?(79k)y9`qWVQ5S*QW{9epe)2PbSw-2Lw_l{&ZDWOELBj}ZpIYfy=4h05C(pBKFAdhlDfEH{*>(K)#)+ckp#sD)MpHILG zKI%c0TDcsAjEo-Q8g!J+)6)Hjm34|_*62E{yzLWITpPVI;;9>BED$5($m6+AETY(@WUh*>?~DHS~7G;KBV|FQ`QuN|qYd5Moe<+qB``Vsqjx#VZ2c%zqf-cM-1$i)0m=@?Cl?P_n2X*# zMu(tQrmk2*k2UBz_5W?L&%_3g4*br*y92xXf4G05@9*}V?)~%LgFP$VpX)x~wb1$J zo$qyS>G(p&nf71X@@CtY(fsTDZ*4Nz$ya0^9Bt@}<=SUVIXaQZ<#Z%~$dG!$6Iei$ z>jOuil0mLFwI1l9j_@-af)!u2O0bH->O_^A%OF#()Q(t5`af#QI|XW;auN^O=L>5AfyrbS59&yr!_ zZDI0EB+UT;fEdX|SZ#%li7-`+;e??s&NWI~?a1UP`1hrv4Fo^Lh!ViGAX{iuNQ46^MajQ3uTSopSiuNJDf;T= z-wd9XowPr6^bI}DbkJD>t0q}s<{JGCc%tcEuuaCFdf4~^DK6By)}4_9P6#wS%Dw;> z8uC8Flpq!AD3?0nQ%nG2_*jn=B>i;oluUi*VN=WdNW@=Sgn{px2UoKe6MrNo=DCWz zQoYQViIOI84H5(2ZUS$g0qJ4*&Lz}I_sWU+U`Q4))XXPNEHO!a>h{+f8nhySq;XL; z&l<*xIozBGi>YFxp917?C2whh^H6NzS>llbHefsVy+Tv`w4oV;<;W&;g3U4BAeT zqL1km9c22UANnOTMbT%b(_(FsG&r)Bs3JOwWA~%4RcRORLYi^UXn{45Dujz zFVmaF)5)6<6pesI;N_5WNPczSRa=;9RoKLgFO?^g$8-h0(r$S<71tmX@;Wg?&ZE@B zTx1jW0Rv-{t8XM97uh~sZPzcUf3yPEJCVYfCB%vrq!^^Y8yMa>8+@6}2PVj>=^>U3 zGs>%sS$3u<`qrt0bv5|BD^|mCYnMuQT39X1!@))}A|?o3bI;+5J&u{gJ<2_c7G|qR zT!m%G*KbsBc>L){>(D`IP_X==Ymy8j=pR|QE*>3u6#ba{l2+GbCJBA}!{IPBZ5&Th zhUn0^-Y`!EE-XL?(})|3WhNwD*T$xY+imP6S(?~4f8!Rc+@+S;xKDl`;;9K@N4-{J zDg!1(rm6UQOx=OhKut4!12YQZKflarE37`2qfA~+K4z1qz7M9i<;{Q{v5Rvm{-|9L zlwg4_mCacI59~V(YT?B^YODM`njc(v0cN!+!wK!yQHHS0;ia5I+w~i$2Y=n%bifbi zK@+MuBbuv1DPxYsvisJe@GP#DCz5^L9mn=hHG{-xEumfpxeqLDtky6u zq@rOES*1s1E+>0;(MvMisv9$4gJZRjRdzy5lk@IDpI*SxUk+#zLR1lC$;gB97J@QK zx~6o_LqP`ENCs@kiB>~uec6c9urIoH%$zA9dCa!mn%gMve!}atZeO=mqRyVS^`zg% zKHX~U2~~@Z>#(a4WOoxaHbvOl_%=ka)#=6skc*^l)ORDsSCT#(ceK^Gkf?&uWq~vu zD2-AERBp#F4>GQ^#Yj*a)rsm)svfV(`r3DYDbT_4qfRAzY|Ndl#zcUIjkfHx#v(Y9 zPDWEjG_kp4xAomLTvw-0S2gR|wrzNZcipn?@+euE#jpZ;x8Qm%1}{9~vV4m6#cKJr zq*sT0z10#B6xgh}Qb4+C!!CrQ>fV~VO=j(xwo@BZFD*_-Trd2i>yKOOiB1G59q4s`c_r~g*}{=R?T z_c!|1`cCw9?D_M1ZteNh?jP>{+q-9XKhgU~z2EAc?mg7=Z+m{V=Wfs7uHV}A&0TNq zdb;~hx__tp=eobx-QV?lUEk<>qw6Pj{_)OV+j((k&yL^NG1>X2oxj$3r*l7p7W{KR zJ=@(epX}To(w!nRR>Lg9h=Y&}8+5nP5njF!SQ|6hBM~iP{+qp)zR=Y%uj))7;EH1Q zL73IV#5!>fpz%v7Rq5tOx7T9`?T&#zdI-;_RH~aF-fll0RdZX4qG|k}PpM-!uMF|q zSYV9G4S^MC6Bw^a;;2l`@HUDgdgpJY6uz6s`?#IXhf9gBnT4b1=omaAZ}E| zV8cPYg9yNtqyK1WGv)r!vT}Z|c!b~J^Xb8^j;m+3GGx9YQ>B^UyyBijf0@X}Q_2xu zy|`6#xYUSoDXAJ_2v_IcRh&7x)ZEH*>C^OaYRf*@MKQW)z_gSWOV6jDDKh`a6B83S5I%*^6%QD?Rw@6zT@cuT5m}=c%PQ+t#cb` z#+l=3iQE9=t&D8a7}2|eo{G0j`iIqpJ)ctQ@XW1N4G%>FASM#fFcuaROo2f>m+fi( z{wwLH=w`7%H`2Wj04?-LN7BL+WkJw;aDN&J7&GIk^a;AVSfo1_nC~hZCHgTysv{{i z3(pL-YD;AAG#=JW)q6grOyQZUtv(-?7ZMZ`x@@$I)-C*4`U#q!ZDlQ}-4*<=@<7JR zayOMdIeDs8!$|{0337%SVc>BBusQFh?wcVJiAtHuP5<^)MkbTpps zr^(G$O|14;c)k4__Tet(7kM{k@nkFQ*}?SB&__$6=A@aI(#QDn?bf3WkCu-)n}Rj* zEGwE;#}umOEp^lB$F+}-x9SLP5&TdXUM>8?fXdO3CF766skn|~&Qlf3g5&beT?Qgg z66*2&*%#9vW3q3w8e=q;n&f=RH8lu$e}yL_n<)0RgXzZ#Qf4IG$CsyC4OaiMMVr;L z>0TO*7HeeouF-UW7N=Xa2m$!osnl-PoQQo6l`b#WKu90!&_l& zDlBETEvgCN)0Q!zvO(Boe7PIb%xt8XL(U{GwHk25Y?n9gR_24vQjB;wK*4wxzw@mN zh>%2!nnja)mQMsgVI2s9b(O63T)jp$@bhVp#_nk~_V8xADKK64wAeU0_b!lZ?tCPr z*5a}8W@euHCoXTsl>Yyi>i<35`#1OQ?_ceEdH2QM7kb{`HQ1eWb?#i7 zdDaT$J>iiQWQ-&X4l|YJiiaH&AkPYNLnyIf&jt1^l3=LzM|^$lBlC|(_0D{pLH2k% zDccx7*<=j!Kgx1lkvY?Jcr$0px`vGu6p=vBw*#gShG{TK82?HLB%vzT^2WtvNF@XB zH5uT%Ih$<+0dc}hOy5e}?z1Bx9JT4wmup7*E_YjYByelkYMCUz@)Ad3(Vnq0*^>X^r05KmgMq!K!7!58ah0zY!(&IqXeoNpFeHUM)m!zh?BK|y{~%h;W9+>&{*J%g`N8FhppVD6dRKUPeKcts`i zHpR#siOv@D?iyo>R@0bc9>Yx1SCh|bo)1-xdYk9OxK}3B8XYzrOY;roPmngVcD8&_ z_Jv)F)d-rv|3!9ja>T`jg=S7)!aYpXM6j&UMy+b7&&V=$D9F0*amF?qflMT7coE3} z*oh)(1R*r|UB#~P*+Tyjg>U5$zCin*7DdxfZl9u#dUwkQGg4^$yab(S;C1F>vZVXJ zkhXBfX2B;hLdl%#<~f49*J!MJVW(KjCMHH;Hl$f`3@5KsrJQyrpV1Pk2S3shfMz=< zt3yJtH8wVn!=1Ie4+uxFVc9pHSyCu+J6S4^E)K2=m=k28>-@U^=VQdjG@%i342O3jnR-pK(;V$L}iDxH?@h<6mdSC1)Izm_~D zLVV*R?B(@;SLqupw%|P0*c=#tpE|l!%t>+Y*XYEue0Dln}ZQDWJzEIns39aDp+9+Ca**2 z=t`vRdt^;i3q^d@ZDF=rpPf9K!6Kme1P8cSaIv{zRk@ohsd^rxxth){2GyQdQYeID zZzQLdjYEVS(9hu#pp4nCESA%!lP3+s`jbr!lJS%54x#DX z8oD(3{^dXS>aXo{mXp}C!l#h>91cLX%Zo1f>&5#HG~Qyh=M~tZ2OvUp3=Cl4N3kWG zWl&WTkjudIgJETp$F%-E4Npqu#DyIB5)RrnxiGD-8qB#|{Zw*5g!-_rC84&A2Hjj4 zG#3(TV8D78Fagp27=R20$xjAf^o0 zU}mA_x)tPf)l)>tyINS5ot9w!v8_SG4^;&W9O>%JyRuUdK9RhceA)!c%F<^tBlR3hAwEBCR@~t#Mg-nvoJ3U8t{m!mS-GAEs>)o$)Ki2j8UGI0j z*wwT1H+KA|9lyHc+KwOZ{JqW(JBK@dp8@lKE~gK=IwrV+wS+0FxI|ZOQ;C(Tk?*}% ziGtw;%;2OGB9s@&>|Hp|P_X7@ChJ=%5fl?iPn*t05!oQ8!((*Jf_g@gN)@%OQ`W@e zYOq^sSH7OEGuPEN-H((;PDbM>Ni`_dHM2xzj8`kmOfo2hZbRb&k;-{#ZuNY+MyEI1 zbb74BlPA|D#!>kE21r>%(Rc!anc+gZN;h9<*A3~}OIs81cuKnViPLR58djortODyR z{+=0Xdv4|P=~qPk&NeNND~*2Xig@Vw%GzDTj7>gGwEhLMteB-lD*Eg?&-eX1XVYb7 zb+t|3Jmq&FwG?48nyqZeURcT{j84v_OUy5QtxX@kvS`7*?YR{VmqZI+@<1=@*JNJr)f4&96Of4y!#gdp7+ty^a>`^|<*B{b^#& zvnc$hQ_{=dI$X4ek$Q%4E4@qWrQ)r_6S%x2KW(roTO6LDk(U-Y4mlw0>bdj|{hun@ z|4Cb)gd<*sMe+owyu|9YlsxsfCX03gG{ML`lnnW| zp4i4{me={Ul+^gQZWe7e?8j1<5D_rG61D8~ig6x1osuuV_&LReAp~VSVpr2Ikpz1& z7)dSg0%kU3FhZ{V>;#$wVxa}KdYCbL1HKkP=RWcd8cV&;b|@uT{#op|Dgon7gN1wpv zeZut% z!*^l6qK7ybgyr8xIUxk-Qc7O?@k$%-RVZ(}>cb8tLlfl-VTp(J3ps_jB8Z0v7=`}u|Z2kEJ3}V5So|#7#f#PElB*2|M zp1w*SXIl3WfQXyKy5aOH4M$ryjCs+K4qU&T1A0cv{PE$|ZDL7Zc@QOp&fHx{uXJ~e zCkI=%0cAz`0Zd#3d)5v~JU5wp5XqmU0ceVdbf&Kw^Z?y_cu4Ukd`E85)zj(A%M-{-$lL=zq^B8rZPVPzhsUc8<%$t zSG$UP64Ci&dXBd7(TQzI(8Al4dHmi=$F~o7uASRl;Ga@bM^6kaBfd&+rY|zU)b?!b zV?kbSxW_?Eh83HeNcw;8&b=LbKhgKiJtup=y6fL{|GBO)e(>neBMSU~M}hRIXZk0T z!(Vt}|Kx#=>|dapo@eeGEDtS6W_-BU)^w3ExBh@lfngIX#u1eHEzi zs|Yv+nq=udN4HLET%f!3)?ois@}P2f{}d_0pP1m~H3DJwn8v0(e}|F-t6tD!s`BOe z()c`vuN%s*gPjy@Mg+NCI`?wv{2bxH4hy+RJXqy!>Eawob>Y4<>%zcN)0e16C8x%o zP97Ecb%n{+TaV{u1?dj|28F z#uuRC+`An^WHfu3**bn-~FXEE7x${jm=gyy>e4$OzXssh@2%0u|x{Qa5OD<7YHFG zS(DFnDDjZHgb3_PCPAeH=I{ykvL>gR_4b3W|3a{7|KRI?kuXlo+Ex$(V>a%F**T24 zI3*D;W6cjd%qw`KZ_X`*XmjgkTItt??7{#(quk3}sQLTvDDUg?+>!-F>z95lY!ts0 z-h8c&h8YxwAsL$erBEr^tGQ*oI#jkB#PQfsBos$V_%+5WeyPt85O{}u=Rz$LRj zmR^t6M^TV}VSOx-T->aW-~DywvU-7oDt4m6D)LeysKX)_0O4bXjS&;1_#tcx%bo!0 zp3Gh-Y&w%qUrCoNsW&ECv5a8yTs`PF;I^69UssBPtNfm8^qxF&YHR3Hoe7gdEzcl9 z!xG%wg6I4!Gqq`Zbe4j_bO_ysO79D+1jDY(FO`d0gzO#-)n~CU+BVyu0(YrspXt@7 z`_HCVE*?-e@?_^lnSJ1%%HN?2AZIid_@&uPqy?$W%#pu}i-YwX=P5D#W<9i<1RFw8 zrmBUdbZ1*I`dO+$e&M@h+V3jq)3_e!T`H46*P;BA8RP-x-68X(5~VPvfrnxgK7-29ik z^i0Sary~j(Da1siJhg4~hH^#NHUAzf6L-xnTI;!mSY+c?dWkg$%MN^JiLzPj|LUA_ z4DnOnK4xKJL3q3)ELWEq3>Uj>?pUP)SQNyYNG-c=g7sSJRE22;(9aF#pI42u<<@4) zd2__6CLj@k=gq7$t}y03!v1zStIwOb%B{6v9T-UuF#EC6bz{Who2?sU$EFC|Y~4-q zaucHnv&UxUP7R$H9jgqD9lw2YX!_XE(V-J3XGTY7N9In9oH&&$H&LB=s_*cJXGaJ2 zAEw?wxZqI(zKIY}dEn=P)Auq$@?7cK0;hI`g!DH)NAwBlq9i`pM&WX{htf)ws8|Fi zg_IO_Sf6=j2JvKJ2~@<&(lgJ9LF+KuO_2?cGmWsb1m=0Abgu%}hWWz;?pKVjGX^D3 z$Yvx%{%v6)#fU7A5 z6ret~42~senc4E5NeP(UR%K)rEDXy3i1Uz!OgIYveO%pp~ZdDsnjtHd?)_6cJ`$I z4|HDX*mn-!f6u_1{gu8y+Wniozua?g*B^H;?feeEdi19l1s<*@XLfbm+W#~Aiaw%( zc1V@81Ls0PkV7iZfq*mU{Hk&i*fZDQz#-e0(t$|=#FztIT1RF!q&YVc(pax|%Y~WQ z@JvpY^MKnD!Iip>NUOD!fcNC`RzxIOIwZD(9#TRuoQPJCn9*GV=aPq@NlmnTpTGK$IWvxURD+85|g-N1?pfG zx|hg-p59r@WjFh5~HiG{Hs@X8&a*i-)4WY+h*<>I^ zmSIM!4$oSMUxf7;Tv&^vidzGg95iT5r*Dcn(Ay9j(9ZSq+wKeA?D{dnglyQ*(4((R^wlVn9P?}vUQp)v%L*cWz+1R_-)AW!1uXwh71GJEgo z3~Za5CAM;zmea2$r?puhj0cV!CFYvr)i%p0zbP6_@{m!#c6)6(keMAre#?i7k)hM` zx>IWg{YAG}d6{k_)TzLXN3F2$!rsNbZgkTACEx8get4$s*w>|W22=t??Mj_FoGAjhbC*Q7 zM1T?M1+dY$3F$p#J8rA(UI5`~Iu6||r+vvuk*|8IE%}HI zm)%yK+VQ3;lF1elO~}F7w0s?m*Nnh<1Nrv-XG-+-xTj-#;9 zs&H%qO0zLc%aI#l(Tbx`aW9w!a*AbOlspkvX&fvDsOrHHiWl1!l8&w)q8j?PYNkb| znq!CM_mbm^xlP*maP862Gw+MfVzp4TmCku$Q($fMGV6jyKtpMDGxnjJtR}}adi8K? z9af`fY2Fra48x@C-UVHca=4H(%1#on!UN9JA)AQHOa>I^uf+X8NEyRTU*c`EM>ec1 z28|+68eSiJM3dF|Nq~rww@A(;{Z&pHj{>*k z-z8H$6{5!UdAwdt<6 zpRRMKj26z79MbvT{4$xf0RKa?&GDSM{qs29xHwN|=#0=7Po8|c#kE1S2z%$lEeO}j zr5Et0t+Ow`@^C_Z}SgViBYrM6@p_HfEGvdE1j1D5;`65PcY zuE}cPSry%Q#_Na9WF%$oToNqLc5w5gH2nXbju$!xCj0L6{^qW4cYk5$|J?b)j-TrM z$NX^1Kh>V(;;xQ~{U5XgRO@z|mWv*wpc%HNKCs0t8ZqKb3zLU6s4C^s)rR6{N9aK| zK}*S+l|u_KTC7K#I){Pff?`nbTraT6p!G;D#KO|PSlexR!I-)BFNC>d5z68bCV*QQ zi|Oi2o+W4(Ex)joTe6n8Fhw!edy>ASNLvfrSFXQ=gwg{dhdfZjn;=Y~N>UyO+%A&Y zA`X;_`H>|s=R((#XOj!siu6DmSBZphJ`a5n|Mm6I2emu$*sx0td{Kog{V@FVa@=TZ8Y z6yWhL`+2OvCLo$N(k=$7k8U1Tcpi9d3|krZ7<@#G^JaJy?z`+$BH{atuZRKe z0WPY_AB&78GUMyMfMDK{3CznpioZq6j2$;#9q}KLnG>VPWA|%nt^Tk^;svI~?nS0` z2>VnB@dK-Y97>vB%ww=*>}2(JNY_FU$Mh2MYctI2d$&a@JXDfwW>YZ*F-(x9k<59m z{P5$+xajzetJ|WZSFDO&SvL!MJZRm5p@6CA;i%YVOJdS1k(m(VlMzZh=~qIZP{N0^ zv&qoO4(9Z?yi)N|G!s!>)6w>}lJ;UyZ=4?-FDM`ia6SP?vDjW<3|@;$hb$(>ayGAh z_hs`6g&6Xj$uttcKfcQ=JNFLpY?j!p2?=g+>-|&Pa5teDFF=;T0A*Arv&({kO!%Ms zW|h7r)X~CggK}qYsaQzJ_!OihPJH=;XOb6nDt_jx+c_05A)Y9md`_1-UR{&r%y_*K zEjTQtP}#XI9lFCVlX)Jl%RxoktYBwTX}5+ufYBUZSM-tcQf?fe%JZu#?}mnk-VE!I zTyI|6@F8CB5Rt=lmK89J=sds7-Nc4aW8QA)4U^=$BLeWf)Ew=aNv3f#TX0ibu}er6 zIbE~H#|eZ;>BeLS#cxHEJCQ52aZ+E{=e%x=f@e-ziFzA9V$tD^KAnDQ4Cv1`}G ztcN1dky7)^(o{2LkW3$y!M>JXqxRTH6q=qxb)GF(?XE0eX46&QofLTrlLDb~#UgXIMe&v*=w<6EJ|khIuh%VMnNrFXI&=sJePr(VgVoJSrG$tLEQBe`@5D`OD3Rb zKTp5KtG;fJkBR|feahTXgF#}-K;|wraj|5USP zXL)@EKvn43MOWN6LD~#eJOm4{L>?Z55d=#W&+U)#A)?$+BcLv!^Mi z7?vtlq?FI?VK9uArXx$6xV!4>_*vnZ5?~3AZm1aDew7vh0)ddD7s4i;bNA6_%|a@r zL;dQZ)rH9d9?j%Pmq_R);?aSPWFO~jST?eh9P36(SC~s|SWBKI;}@UVHF41}dxOjk zWBPwz=U?g|>;Id5U6#ISHX{gq^jm-kkUwgxVl#U;7szGmhiJ@wpfB#I*J8_jww2r&_yugAb?Q5K<@~kW->`(LUfJa z^ef#xEG>8yVrm{(2LK3uZm^+y_f<_m7Chrd)@O8l%%W>UG4ER3M~V+YRV%km38iOI z*!sgo07hv|Zyof6)S88XR826m34zoL^;8;n3}KKBvu!|fjN728%N?N90uo;V$apK@cVim8I$tN}be z`^glR*CCGhE?pXXw07CS)W2+bNXz4vPA5(XL17JW6vx5$!^L(!*T&ehTiXixDGdDq zKh3Rk*>WJ7e;_L;1iIN%FU4)Lo5D%a8T0aGwu@|?q=WKLC)ag;ldX(YZW_LGB5vzK~qg3_jdy2Ip6}|9FHlY>K)! zg1ESn7v{NED+^{iVEnjlwOYM;DOgeD!2;4Msx27hvkfpC>8RrhWv0R+=c7sZE*>f4+xl; zU5$Br9^qzo9{Cg-rf-tGk3%F=g{#hE=&@i7zGx}X(@R{Lp6>{g44(UWl zWA>buwh4?n=*uU89Ycus#FaRYui>pcqd2$5L|d7Xsef(Ku6R?>fKZySS%r5b{LCJb zL*jdzF&Cl!gp0DUHkq)wif$J=;vv;`ND$*Z<(lkZSjg~ZVerrGK;X$XqjGg`az!-y z;O#AFRNIF0#%b!eK}DjneYnY6Yws#=Phfy{$MPNtKU`pI-{aYM1(6a?{y+-?BM59< zJ_!z0po1Nx5zB<6hzHdc ztqEsBqi_;pxip?+s#3|qA3lx8&~}Rwf#M62i*kj`5H_fgXu_YUqB@phuf}$bP8geb zs`wFK){JW=U5N)%=U3{BNq3TUU_`nM_Iul%wKY97wWOK4UX}~d_t`EXAx-ch28l)7 z>V!K*s7nq~pOg;Gq%cdF$E@NboEPk{8pwjLc?T1BNPhTAIJg-+Bpf%vL281TGaF+& zb-gw}_pDBL`wlSj2{EYJ?Hn1y8NW`7dC?Zc6Kfwk8HFdmsL9jGWgUxjV2fjM!(gLu zFQ2gqBYME=C6ORBa`*DTaM{shQ3wO19#=*KjWxrOAc-`wTdtO??uHvRYHkF;b`<4^8up&D*2WP7&o-^zSctfgqV|Z6!CL7;Eh`M) z!DviIoLhiDsEPdWy^*Z+_DzP)Eh@ArE@(NpdIuU${<{Me3f@{31*{vV+LIFz?`bxh%lE*51x zi6>V^#|R7YFmuEob1JHj%n_}#Zq_OecJTN+K6ew;B7R5#D2|-R;3+(n?%Z1xRPzX@ zh;iNJq$|0l*(b+}&;BZr$A*EkFi$WBL8Dg>U=_G>fy*y1JunEFvjdfgC-KtTAKgHM>rLb*Dbd_lzckSec5V&Qe9 z9A2VBwXw7yA(Pp8LV6d^8!4_=AUjjmSg*UqPFox(i{X%>$;uoMv_umf?Ql7kY?i#r zj1)yC8xv#v>^h=_GU#S#AzQr^BKk64oL-&EBBECgqhgw$2Z5OaEej0m58h7eoM+B3 zII!M1yz;B_w@C;S$)3Xmc(*LslZA8mq5|Nw_QMz}v@0WljB*l+1d(Cen%aMLjPs>n zEx$sDy>vxuw5_65?MptdZT(=P__kiRG8`ZwaU=&{VZA3Ha|9qXioy^+;>{27c7~e2 zN~@zCzk|_miJ&{OEk?+Iu14@HxC9;tGvm9kj_dy<(MmthE31+9JuawgR$s5|B>QeCyx+E-CX8sKV zM?=+!hy-B)G2T5qQ*3H{r({nF7gxXr7>ygxqyL_H2NNv1zLFBfz0`Bv21pbrtFOIR z5u&+lQwP@2Tgo~Zz7DKWPToy!7?GYRPNYeTvI{erUSF7&^wtc%pag(+=^KA(57KC; zO~`Yd0}N zh5zR07ApJ=o(9hdW6aYGyKG=P8*-4>{W!pCLRG0%%rEjC2J}A1I^#3Z0v}P9T3%+B ziK5Q+P~Xc;hI9)+knnbMUmB@Qu~kc#h++6%bwNZhr=uHfBP`9_P`ajaHnAdW>A}3( z({N$}u8_}!D>Q+P5zHoLPC8bRbyRogj9PYom1zLpxj=pgdE7$BIiS<)js*9m7%SFN zz$FCVO#RC&QGjD#f!#U#h!{=#j8vRFEV+!xk!r|30o`adO=ZK=tFKiD(aU3vf*mR5 zPuKJ0XVU5$OW-p7f3)NMj(xwo@95rtzW0N@CkFn@z+WBs;=sQCf7bsq{m=LB>ibuH z$M^h;JwLza+MXS||IY5w-hbWu?cSR`zuohNo~L&G!LEn90J(PmHKnMPsjHdCjaL`^_i}Ysh5h$piNSPN{%!+ z`Nb-=qo+<4>nH{yM-9-q*O#h?=whQ-7a3qs2*g9g6i#vheX%uucxY?rGvx8 z<``lz^|4gp^HoYmPmLFAtMw_vwA}ndcrYl86k?w)R4F1|bju>bI}fcg=@%vQN|kcb zQ`ZX4=V&PIY>ouAiJ7q7%Q84#rNs2q>0-UbyqFEuOsio1S{MSYILWuPbg6KPIY_ zo1Q9YN{MenfI*q8VK#&3t5l($8ZI`6k$}z1ED+C}tWt$~YOq-I0Hq81;hE}B(sXoN zP4mj;3stI17rpag=sMl?t?J`+u)eJcG~-GkfB)4@DfQ1*sYN|?Vp{{$v(B^C{l$BT zJRwBYy83>#N@41$f;OhW*s|M;2{M*5M-nyj#4AxJXVhXtDG>(b!S)5$w4X!O7#*k9BuU zC3D4w7@?qTtu76EH%1!bWan|9E8eAaZ+@0+kyfq*v#eE{$0efdjyM)cyf!yWG3fG` zb%9q;_j}0ani&+#SAk+Td%3!gwO=VVvE%;QV7VMxU7DR=U(6yNO;0*o-Ai95iuDzO zvSpa|RY}jhQXQa&YXy4#W3hVq$lOuwij_&nL@Z?` z>!(50c>)MY-;^3KGa*ImQN31)@Lt&%yj1ODMVE`M=y=^@!EV;Q$S+s-(ACvqU1f;y znxed5bhubgLDwQox3WO0nzyPwv@Lw|@*1EC-pK91`^?}R zP1yb;sbh%Ev&mD{U8*DWSQ~|FycLFroEL`4$CBh~f`QN}K4oAcHV2ECKx$U$Q8Imo zdsn&)t|^c>+M2&tKdAHg>IWH)<+Igp3I%<#%_IZiMyp+Xc&yEb$ML1C0w>GPB~sYS z)t$7OY13-V1hcQH7B^H00$lU1j!MbqAeIw&@JcAKpew*muM|taZol zg=#0ATxruu43xQ^gUVXIcU&g#%niO=?bu>TZ3|a|Y!l(8%~4DasAa8_4R%3g&kJXT}`lhA|vjWuy7=7vTAE(t%H zrHhxV3w1~TJ`~f_4W6k!M}MaZ^cPIA?~ou~ku|1u%&d)8PtpGA0_}4~=+)0xPtpn_ z`{@3Xx zet4Jgu#h{zg8El{@bc@`Ar^kC*qlFCM>z8$c$!Geat6D1Q#WR&BXoMTSf`%c1MvPb zyv@sCu|6ff^i(#_RS(k{HG7Ldbe+f4u-?-DdwMG!1OH>-=lkdSKDGOMz5k1UKKk>B z0*@&0hysr&@Q4DBDDa2^ADsfpCz82c9h3W$A_Bai_*p<~EO-j~Ab={B@fhhY#&Ch1 zbwAQbhQRfB2E*z)gc3LD63|H0!J2MJr~tX*RYtCyj3=|2U3#p5e5~1>Q|NkbW?KML z1Mi-;Y!B+Z1sLMq!;g260pdo50+AqG+C2E5}@-3qF^VPmBY3Bs)0 zLM+ef_!`+!9)R<*3Aot^RIp@T%zwF@P9)Pt*&;>*9gom?9NnPYzO^wJ!oa>Z4oe}T z-@(dGBPPe53YVLYR#2Rv&EK)mZDI9+*0+}`i-z-n61FG&qoJlzUC2_*a^Zo>mVHUV z6xwQqDus$@+D(Y0%$zZzpJIy&0SOmWTO5(>kp!%;oE}XoM#jeq9?+Nv1yWe@9`dZK zYDElwSDqTK(5YOR(iz=L$m;PpwUoiqU5$9E2tZ)S8hJnb8w=ENexh(NXm0p?5=_L5 z4^jcM37al04=g&i0M|{^fa>=lODpNvBRbu0|E9PO%cG$S9FAxmu|u9}^kHZ6wn8SpQ4rm!F=E(_>;mvBF)8J*d(r}2 z!0?A`h#p{S@g|I?jGL&zDk*gVtA~DU%sFQpur0EKuAcKZz%uqRR5${j`$ZMCh!f(M%JM{VcrQyVpxOf#2rgQE^&VTDY@Fb4eb9P03Lz=4^VlCu(t2HxB@QH0!6j;Pt zAHc#Ut}V@&nVFZ8T9H{1UzD1hS&&*BpO=`M3T3l82e~?ixGH%1xwu9sps7*t_fvqX zQ_uiu(hOr}6W5n!EJQc4D6u3nFCD6u1!|@#hM^E;D8@pBG@IBM*~O)$8Jm+QpX0OO zRPgf;QSb}(@tMrVpCPWJz{RPQl30@Jn39s3qNLygba9BM@8m9i3l@;GCLiOsS`?tL IC_w;-00ISB{r~^~ diff --git a/mealie/db/db_base.py b/mealie/db/db_base.py index b12d3a427..c190897a7 100644 --- a/mealie/db/db_base.py +++ b/mealie/db/db_base.py @@ -1,15 +1,13 @@ import json import mongoengine -from settings import USE_MONGO, USE_TINYDB - -from db.tinydb.baseclass import StoreBase +from settings import USE_MONGO, USE_SQL class BaseDocument: def __init__(self) -> None: self.primary_key: str - self.store: StoreBase + self.store: str self.document: mongoengine.Document @staticmethod # TODO: Probably Put a version in each class to speed up reads? @@ -58,8 +56,8 @@ class BaseDocument: return docs[0] return docs - elif USE_TINYDB: - return self.store.get_all() + elif USE_SQL: + return self.get_all_sql() def get( self, match_value: str, match_key: str = None, limit=1 @@ -83,8 +81,8 @@ class BaseDocument: document = self.document.objects.get(**{str(match_key): match_value}) db_entry = BaseDocument._unpack_mongo(document) - elif USE_TINYDB: - db_entry = self.store.get(match_value, match_key, limit=limit) + elif USE_SQL: + return self.get_by_slug(match_value, match_key) else: raise Exception("No database type established") @@ -99,8 +97,8 @@ class BaseDocument: new_document = self.document(**document) new_document.save() return BaseDocument._unpack_mongo(new_document) - elif USE_TINYDB: - return self.store.save(document) + elif USE_SQL: + return self.save_new_sql(document) def delete(self, primary_key) -> dict: if USE_MONGO: @@ -108,5 +106,5 @@ class BaseDocument: if document: document.delete() - elif USE_TINYDB: - self.store.delete(primary_key) + elif USE_SQL: + pass diff --git a/mealie/db/db_mealplan.py b/mealie/db/db_mealplan.py index 9c8ec2bba..c49e1fdb3 100644 --- a/mealie/db/db_mealplan.py +++ b/mealie/db/db_mealplan.py @@ -1,17 +1,17 @@ from typing import List -from settings import USE_MONGO, USE_TINYDB +from settings import USE_MONGO, USE_SQL from db.db_base import BaseDocument -from db.db_setup import USE_MONGO, USE_TINYDB, tiny_db +from db.db_setup import USE_MONGO, USE_SQL, tiny_db from db.mongo.meal_models import MealDocument, MealPlanDocument class _Meals(BaseDocument): def __init__(self) -> None: self.primary_key = "uid" - if USE_TINYDB: - self.store = tiny_db.meals + if USE_SQL: + self.sql_model = None self.document = MealPlanDocument @staticmethod @@ -45,7 +45,7 @@ class _Meals(BaseDocument): document = self.document(**plan_data) document.save() - elif USE_TINYDB: + elif USE_SQL: pass def update(self, uid: str, plan_data: dict) -> dict: @@ -55,5 +55,5 @@ class _Meals(BaseDocument): new_meals = _Meals._process_meals(plan_data["meals"]) document.update(set__meals=new_meals) document.save() - elif USE_TINYDB: + elif USE_SQL: pass diff --git a/mealie/db/db_recipes.py b/mealie/db/db_recipes.py index 993571d00..7f1f76861 100644 --- a/mealie/db/db_recipes.py +++ b/mealie/db/db_recipes.py @@ -1,17 +1,97 @@ -from settings import USE_MONGO, USE_TINYDB +from settings import USE_MONGO, USE_SQL from db.db_base import BaseDocument from db.db_setup import tiny_db from db.mongo.recipe_models import RecipeDocument +from db.sql.db_session import create_session +from db.sql.recipe_models import (ApiExtras, Note, RecipeIngredient, + RecipeInstruction, RecipeModel, Tag) class _Recipes(BaseDocument): def __init__(self) -> None: self.primary_key = "slug" - if USE_TINYDB: - self.store = tiny_db.recipes + if USE_SQL: + self.sql_model = RecipeModel self.document = RecipeDocument + def get_by_slug(self, match_value: str, match_key: str): + session = create_session() + result = session.query(self.sql_model).filter_by(**{match_key: match_value}).one() + + + return result.dict() + + def get_all_sql(self): + session = create_session() + list = [x.dict() for x in session.query(self.sql_model).all()] + session.close() + return list + + def save_new_sql(self, recipe_data: dict): + session = create_session() + new_recipe = self.sql_model() + new_recipe.name = recipe_data.get("name") + new_recipe.description = recipe_data.get("description") + new_recipe.image = recipe_data.get("image") + new_recipe.totalTime = recipe_data.get("totalTime") + new_recipe.slug = recipe_data.get("slug") + new_recipe.rating = recipe_data.get("rating") + new_recipe.orgURL = recipe_data.get("orgURL") + new_recipe.dateAdded = recipe_data.get("dateAdded") + new_recipe.recipeYield = recipe_data.get("recipeYield") + + for ingredient in recipe_data.get("recipeIngredient"): + new_ingredient = RecipeIngredient() + new_ingredient.ingredient = ingredient + new_recipe.recipeIngredient.append(new_ingredient) + + for step in recipe_data.get("recipeInstructions"): + new_step = RecipeInstruction() + new_step.type = "Step" + new_step.text = step.get("text") + new_recipe.recipeInstructions.append(new_step) + + try: + for tag in recipe_data.get("tags"): + new_tag = Tag() + new_tag.name = tag + new_recipe.tags.append(new_tag) + except: + pass + + try: + for category in recipe_data.get("category"): + new_category = Tag() + new_category.name = category + new_recipe.categories.append(new_category) + except: + pass + + try: + new_recipe.notes = recipe_data.get("name") + for note in recipe_data.get("notes"): + new_note = Note() + new_note.title = note.get("title") + new_note.text = note.get("text") + new_recipe.notes.append(note) + except: + pass + + try: + for key, value in recipe_data.get("extras").items(): + new_extra = ApiExtras() + new_extra.key = key + new_extra.key = value + new_recipe.extras.append(new_extra) + except: + pass + + session.add(new_recipe) + session.commit() + + return recipe_data + def update(self, slug: str, new_data: dict) -> None: if USE_MONGO: document = self.document.objects.get(slug=slug) @@ -37,9 +117,8 @@ class _Recipes(BaseDocument): document.save() return new_data.get("slug") - elif USE_TINYDB: - self.store.update_doc(slug, new_data) - return new_data.get("slug") + elif USE_SQL: + pass def update_image(self, slug: str, extension: str) -> None: if USE_MONGO: @@ -47,5 +126,5 @@ class _Recipes(BaseDocument): if document: document.update(set__image=f"{slug}.{extension}") - elif USE_TINYDB: - self.store.update_doc(slug, {"image": f"{slug}.{extension}"}) + elif USE_SQL: + pass diff --git a/mealie/db/db_settings.py b/mealie/db/db_settings.py index 6eed3d03c..819505648 100644 --- a/mealie/db/db_settings.py +++ b/mealie/db/db_settings.py @@ -1,7 +1,7 @@ -from settings import USE_MONGO, USE_TINYDB +from settings import USE_MONGO, USE_SQL from db.db_base import BaseDocument -from db.db_setup import USE_MONGO, USE_TINYDB, tiny_db +from db.db_setup import USE_MONGO, USE_SQL, tiny_db from db.mongo.settings_models import SiteSettingsDocument, WebhooksDocument @@ -10,8 +10,8 @@ class _Settings(BaseDocument): self.primary_key = "name" - if USE_TINYDB: - self.store = tiny_db.settings + if USE_SQL: + self.sql_model = None self.document = SiteSettingsDocument @@ -22,9 +22,8 @@ class _Settings(BaseDocument): new_doc = self.document(**main) return new_doc.save() - elif USE_TINYDB: - main["webhooks"] = webhooks - return self.store.save(main) + elif USE_SQL: + pass def update(self, name: str, new_data: dict) -> dict: if USE_MONGO: @@ -32,5 +31,5 @@ class _Settings(BaseDocument): if document: document.update(set__webhooks=WebhooksDocument(**new_data["webhooks"])) document.save() - elif USE_TINYDB: + elif USE_SQL: pass diff --git a/mealie/db/db_setup.py b/mealie/db/db_setup.py index 8f6c08d95..8c103aa77 100644 --- a/mealie/db/db_setup.py +++ b/mealie/db/db_setup.py @@ -1,11 +1,12 @@ -from settings import USE_MONGO, USE_TINYDB +from settings import DATA_DIR, USE_MONGO, USE_SQL +from db.sql.db_session import globa_init as sql_global_init from db.tinydb.tinydb_setup import TinyDatabase tiny_db: TinyDatabase = None -if USE_TINYDB: - - tiny_db = TinyDatabase() +if USE_SQL: + db_file = DATA_DIR.joinpath("mealie.sqlite") + sql_global_init(db_file) elif USE_MONGO: from db.mongo.mongo_setup import global_init as mongo_global_init diff --git a/mealie/db/db_themes.py b/mealie/db/db_themes.py index 6867c285d..ad9f9c7a9 100644 --- a/mealie/db/db_themes.py +++ b/mealie/db/db_themes.py @@ -1,15 +1,15 @@ -from settings import USE_MONGO, USE_TINYDB +from settings import USE_MONGO, USE_SQL from db.db_base import BaseDocument -from db.db_setup import USE_MONGO, USE_TINYDB, tiny_db +from db.db_setup import USE_MONGO, USE_SQL, tiny_db from db.mongo.settings_models import SiteThemeDocument, ThemeColorsDocument class _Themes(BaseDocument): def __init__(self) -> None: self.primary_key = "name" - if USE_TINYDB: - self.store = tiny_db.themes + if USE_SQL: + self.sql_model = None else: self.document = SiteThemeDocument @@ -20,7 +20,7 @@ class _Themes(BaseDocument): document = self.document(**theme_data) document.save() - elif USE_TINYDB: + elif USE_SQL: pass def update(self, data: dict) -> dict: @@ -34,5 +34,5 @@ class _Themes(BaseDocument): else: raise Exception("No database entry was found to update") - elif USE_TINYDB: + elif USE_SQL: pass diff --git a/mealie/db/sql/db_session.py b/mealie/db/sql/db_session.py index 6e99eb286..3798a8b0f 100644 --- a/mealie/db/sql/db_session.py +++ b/mealie/db/sql/db_session.py @@ -3,22 +3,28 @@ from pathlib import Path import sqlalchemy as sa import sqlalchemy.orm as orm from db.sql.model_base import SqlAlchemyBase +from sqlalchemy.orm.session import Session -factory = None +__factory = None def globa_init(db_file: Path): - global factory + global __factory - if factory: + if __factory: return - conn_str = "sqlite:///" + db_file.absolute() + conn_str = "sqlite:///" + str(db_file.absolute()) engine = sa.create_engine(conn_str, echo=False) - factory = orm.sessionmaker(bind=engine) + __factory = orm.sessionmaker(bind=engine) import db.sql._all_models SqlAlchemyBase.metadata.create_all(engine) + + +def create_session() -> Session: + global __factory + return __factory() diff --git a/mealie/db/sql/recipe_models.py b/mealie/db/sql/recipe_models.py index 7197b8edc..4d2b9a1cf 100644 --- a/mealie/db/sql/recipe_models.py +++ b/mealie/db/sql/recipe_models.py @@ -1,52 +1,122 @@ from datetime import date +from typing import List import sqlalchemy as sa import sqlalchemy.orm as orm from db.sql.model_base import SqlAlchemyBase +class ApiExtras(SqlAlchemyBase): + __tablename__ = "api_extras" + id = sa.Column(sa.Integer, primary_key=True) + parent_id = sa.Column(sa.String, sa.ForeignKey("recipes.slug")) + key: sa.Column(sa.String, primary_key=True) + value: sa.Column(sa.String) + + def dict(self): + return {self.key: self.value} + + +class Category(SqlAlchemyBase): + __tablename__ = "categories" + id = sa.Column(sa.Integer, primary_key=True) + parent_id = sa.Column(sa.String, sa.ForeignKey("recipes.slug")) + name = sa.Column(sa.String, index=True) + + def dict(self): + return self.name + + +class Tag(SqlAlchemyBase): + __tablename__ = "tags" + id = sa.Column(sa.Integer, primary_key=True) + parent_id = sa.Column(sa.String, sa.ForeignKey("recipes.slug")) + name = sa.Column(sa.String, index=True) + + def dict(self): + return self.name + + +class Note(SqlAlchemyBase): + __tablename__ = "notes" + id = sa.Column(sa.Integer, primary_key=True) + parent_id = sa.Column(sa.String, sa.ForeignKey("recipes.slug")) + title = sa.Column(sa.String) + text = sa.Column(sa.String) + + def dict(self): + return {"title": self.title, "text": self.text} + + +class RecipeIngredient(SqlAlchemyBase): + __tablename__ = "recipes_ingredients" + id = sa.Column(sa.Integer, primary_key=True) + parent_id = sa.Column(sa.String, sa.ForeignKey("recipes.slug")) + ingredient = sa.Column(sa.String) + + def dict(self): + return self.ingredient + + +class RecipeInstruction(SqlAlchemyBase): + __tablename__ = "recipe_instructions" + id = sa.Column(sa.Integer, primary_key=True) + parent_id = sa.Column(sa.String, sa.ForeignKey("recipes.slug")) + type = sa.Column(sa.String) + text = sa.Column(sa.String) + + def dict(self): + data = {"@type": self.type, "text": self.text} + + return data + + class RecipeModel(SqlAlchemyBase): __tablename__ = "recipes" - # id = mongoengine.UUIDField(primary_key=True) name = sa.Column(sa.String) description = sa.Column(sa.String) image = sa.Column(sa.String) recipeYield = sa.Column(sa.String) - recipeIngredient = orm.relation("RecipeIngredient") - recipeInstructions = orm.relation("RecipeInstruction") + recipeIngredient: List[RecipeIngredient] = orm.relation("RecipeIngredient") + recipeInstructions: List[RecipeInstruction] = orm.relation("RecipeInstruction") totalTime = sa.Column(sa.String) # Mealie Specific slug = sa.Column(sa.String, primary_key=True, index=True, unique=True) - categories = orm.relation("Category") - tags = orm.relation("Tag") + categories: List[Category] = orm.relation("Category") + tags: List[Tag] = orm.relation("Tag") dateAdded = sa.Column(sa.Date, default=date.today()) - notes = orm.relation("Note") + notes: List[Note] = orm.relation("Note") rating = sa.Column(sa.Integer) orgURL = sa.Column(sa.String) - extras = orm.relation("ApiExtras") + extras: List[ApiExtras] = orm.relation("ApiExtras") -class ApiExtras(SqlAlchemyBase): - key: sa.Column(sa.String) - value: sa.Column(sa.String) + @staticmethod + def _flatten_dict(list_of_dict: List[dict]): + finalMap = {} + for d in list_of_dict: + finalMap.update(d) -class Category(SqlAlchemyBase): - name = sa.Column(sa.String, index=True) + return finalMap + def dict(self): + data = { + "name": self.name, + "description": self.description, + "image": self.image, + "recipeYield": self.recipeYield, + "recipeIngredient": [x.dict() for x in self.recipeIngredient], + "recipeInstructions": [x.dict() for x in self.recipeInstructions], + "totalTime": self.totalTime, + # Mealie + "slug": self.slug, + "categories": [x.dict() for x in self.categories], + "tags": [x.dict() for x in self.tags], + "dateAdded": self.dateAdded, + "notes": [x.dict() for x in self.notes], + "rating": self.rating, + "orgURL": self.orgURL, + "extras": RecipeModel._flatten_dict(self.extras), + } -class Tag(SqlAlchemyBase): - name = sa.Column(sa.String, index=True) - - -class Note(SqlAlchemyBase): - title = sa.Column(sa.String) - text = sa.Column(sa.String) - - -class RecipeIngredient(SqlAlchemyBase): - ingredient: sa.Column(sa.String) - - -class RecipeInstruction(SqlAlchemyBase): - type = sa.Column(sa.String) - text = sa.Column(sa.String) + return data diff --git a/mealie/settings.py b/mealie/settings.py index 0991b7ec0..b25141e12 100644 --- a/mealie/settings.py +++ b/mealie/settings.py @@ -47,14 +47,14 @@ else: # DATABASE ENV -DATABASE_TYPE = os.getenv("db_type", "mongo") # mongo, tinydb -if DATABASE_TYPE == "tinydb": - USE_TINYDB = True +DATABASE_TYPE = os.getenv("db_type", "sql") # mongo, tinydb +if DATABASE_TYPE == "sql": + USE_SQL = True USE_MONGO = False elif DATABASE_TYPE == "mongo": USE_MONGO = True - USE_TINYDB = False + USE_SQL = False else: raise Exception( diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 000000000..3be3ac639 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,1041 @@ +[[package]] +name = "aiofiles" +version = "0.5.0" +description = "File support for asyncio." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "aniso8601" +version = "7.0.0" +description = "A library for parsing ISO 8601 strings." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "apscheduler" +version = "3.6.3" +description = "In-process task scheduler with Cron-like capabilities" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +pytz = "*" +six = ">=1.4.0" +tzlocal = ">=1.2" + +[package.extras] +asyncio = ["trollius"] +doc = ["sphinx", "sphinx-rtd-theme"] +gevent = ["gevent"] +mongodb = ["pymongo (>=2.8)"] +redis = ["redis (>=3.0)"] +rethinkdb = ["rethinkdb (>=2.4.0)"] +sqlalchemy = ["sqlalchemy (>=0.8)"] +testing = ["pytest", "pytest-cov", "pytest-tornado5", "mock", "pytest-asyncio (<0.6)", "pytest-asyncio"] +tornado = ["tornado (>=4.3)"] +twisted = ["twisted"] +zookeeper = ["kazoo"] + +[[package]] +name = "astroid" +version = "2.4.2" +description = "An abstract syntax tree for Python with inference support." +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +lazy-object-proxy = ">=1.4.0,<1.5.0" +six = ">=1.12,<2.0" +wrapt = ">=1.11,<2.0" + +[[package]] +name = "atomicwrites" +version = "1.4.0" +description = "Atomic file writes." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "attrs" +version = "20.3.0" +description = "Classes Without Boilerplate" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.extras] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "furo", "sphinx", "pre-commit"] +docs = ["furo", "sphinx", "zope.interface"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] + +[[package]] +name = "black" +version = "20.8b1" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +appdirs = "*" +click = ">=7.1.2" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.6,<1" +regex = ">=2020.1.8" +toml = ">=0.10.1" +typed-ast = ">=1.4.0" +typing-extensions = ">=3.7.4" + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] + +[[package]] +name = "certifi" +version = "2020.12.5" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "chardet" +version = "4.0.0" +description = "Universal encoding detector for Python 2 and 3" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "click" +version = "7.1.2" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "colorama" +version = "0.4.4" +description = "Cross-platform colored terminal text." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "fastapi" +version = "0.63.0" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pydantic = ">=1.0.0,<2.0.0" +starlette = "0.13.6" + +[package.extras] +all = ["requests (>=2.24.0,<3.0.0)", "aiofiles (>=0.5.0,<0.6.0)", "jinja2 (>=2.11.2,<3.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "itsdangerous (>=1.1.0,<2.0.0)", "pyyaml (>=5.3.1,<6.0.0)", "graphene (>=2.1.8,<3.0.0)", "ujson (>=3.0.0,<4.0.0)", "orjson (>=3.2.1,<4.0.0)", "email_validator (>=1.1.1,<2.0.0)", "uvicorn[standard] (>=0.12.0,<0.14.0)", "async_exit_stack (>=1.0.1,<2.0.0)", "async_generator (>=1.10,<2.0.0)"] +dev = ["python-jose[cryptography] (>=3.1.0,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "uvicorn[standard] (>=0.12.0,<0.14.0)", "graphene (>=2.1.8,<3.0.0)"] +doc = ["mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=6.1.4,<7.0.0)", "markdown-include (>=0.5.1,<0.6.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.2.0)", "typer-cli (>=0.0.9,<0.0.10)", "pyyaml (>=5.3.1,<6.0.0)"] +test = ["pytest (==5.4.3)", "pytest-cov (==2.10.0)", "pytest-asyncio (>=0.14.0,<0.15.0)", "mypy (==0.790)", "flake8 (>=3.8.3,<4.0.0)", "black (==20.8b1)", "isort (>=5.0.6,<6.0.0)", "requests (>=2.24.0,<3.0.0)", "httpx (>=0.14.0,<0.15.0)", "email_validator (>=1.1.1,<2.0.0)", "sqlalchemy (>=1.3.18,<2.0.0)", "peewee (>=3.13.3,<4.0.0)", "databases[sqlite] (>=0.3.2,<0.4.0)", "orjson (>=3.2.1,<4.0.0)", "async_exit_stack (>=1.0.1,<2.0.0)", "async_generator (>=1.10,<2.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "aiofiles (>=0.5.0,<0.6.0)", "flask (>=1.1.2,<2.0.0)"] + +[[package]] +name = "gitdb" +version = "4.0.5" +description = "Git Object Database" +category = "main" +optional = false +python-versions = ">=3.4" + +[package.dependencies] +smmap = ">=3.0.1,<4" + +[[package]] +name = "gitpython" +version = "3.1.12" +description = "Python Git Library" +category = "main" +optional = false +python-versions = ">=3.4" + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[[package]] +name = "h11" +version = "0.12.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "idna" +version = "2.10" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "iniconfig" +version = "1.1.1" +description = "iniconfig: brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "isort" +version = "5.7.0" +description = "A Python utility / library to sort Python imports." +category = "dev" +optional = false +python-versions = ">=3.6,<4.0" + +[package.extras] +pipfile_deprecated_finder = ["pipreqs", "requirementslib"] +requirements_deprecated_finder = ["pipreqs", "pip-api"] +colors = ["colorama (>=0.4.3,<0.5.0)"] + +[[package]] +name = "jinja2" +version = "2.11.2" +description = "A very fast and expressive template engine." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +MarkupSafe = ">=0.23" + +[package.extras] +i18n = ["Babel (>=0.8)"] + +[[package]] +name = "lazy-object-proxy" +version = "1.4.3" +description = "A fast and thorough lazy object proxy." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "markupsafe" +version = "1.1.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + +[[package]] +name = "mccabe" +version = "0.6.1" +description = "McCabe checker, plugin for flake8" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "mongoengine" +version = "0.22.1" +description = "MongoEngine is a Python Object-Document Mapper for working with MongoDB." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pymongo = ">=3.4,<4.0" + +[[package]] +name = "mypy-extensions" +version = "0.4.3" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "packaging" +version = "20.8" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +pyparsing = ">=2.0.2" + +[[package]] +name = "pathspec" +version = "0.8.1" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pluggy" +version = "0.13.1" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.extras] +dev = ["pre-commit", "tox"] + +[[package]] +name = "py" +version = "1.10.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pydantic" +version = "1.7.3" +description = "Data validation and settings management using python 3.6 type hinting" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] +typing_extensions = ["typing-extensions (>=3.7.2)"] + +[[package]] +name = "pylint" +version = "2.6.0" +description = "python code static checker" +category = "dev" +optional = false +python-versions = ">=3.5.*" + +[package.dependencies] +astroid = ">=2.4.0,<=2.5" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +isort = ">=4.2.5,<6" +mccabe = ">=0.6,<0.7" +toml = ">=0.7.1" + +[[package]] +name = "pymongo" +version = "3.11.2" +description = "Python driver for MongoDB " +category = "main" +optional = false +python-versions = "*" + +[package.extras] +aws = ["pymongo-auth-aws (<2.0.0)"] +encryption = ["pymongocrypt (<2.0.0)"] +gssapi = ["pykerberos"] +ocsp = ["pyopenssl (>=17.2.0)", "requests (<3.0.0)", "service-identity (>=18.1.0)"] +snappy = ["python-snappy"] +srv = ["dnspython (>=1.16.0,<1.17.0)"] +tls = ["ipaddress"] +zstd = ["zstandard"] + +[[package]] +name = "pyparsing" +version = "2.4.7" +description = "Python parsing module" +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "pytest" +version = "6.2.1" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<1.0.0a1" +py = ">=1.8.2" +toml = "*" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] + +[[package]] +name = "python-dotenv" +version = "0.15.0" +description = "Add .env support to your django/flask apps in development and deployments" +category = "main" +optional = false +python-versions = "*" + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "python-slugify" +version = "4.0.1" +description = "A Python Slugify application that handles Unicode" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +text-unidecode = ">=1.3" + +[package.extras] +unidecode = ["Unidecode (>=1.1.1)"] + +[[package]] +name = "pytz" +version = "2020.5" +description = "World timezone definitions, modern and historical" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "regex" +version = "2020.11.13" +description = "Alternative regular expression module, to replace re." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "requests" +version = "2.25.1" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +certifi = ">=2017.4.17" +chardet = ">=3.0.2,<5" +idna = ">=2.5,<3" +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] +socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] + +[[package]] +name = "six" +version = "1.15.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "smmap" +version = "3.0.4" +description = "A pure Python implementation of a sliding window memory map manager" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "sqlalchemy" +version = "1.3.22" +description = "Database Abstraction Library" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.extras] +mssql = ["pyodbc"] +mssql_pymssql = ["pymssql"] +mssql_pyodbc = ["pyodbc"] +mysql = ["mysqlclient"] +oracle = ["cx-oracle"] +postgresql = ["psycopg2"] +postgresql_pg8000 = ["pg8000"] +postgresql_psycopg2binary = ["psycopg2-binary"] +postgresql_psycopg2cffi = ["psycopg2cffi"] +pymysql = ["pymysql"] + +[[package]] +name = "starlette" +version = "0.13.6" +description = "The little ASGI library that shines." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +full = ["aiofiles", "graphene", "itsdangerous", "jinja2", "python-multipart", "pyyaml", "requests", "ujson"] + +[[package]] +name = "text-unidecode" +version = "1.3" +description = "The most basic Text::Unidecode port" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "tinydb" +version = "4.3.0" +description = "TinyDB is a tiny, document oriented database optimized for your happiness :)" +category = "main" +optional = false +python-versions = ">=3.5,<4.0" + +[[package]] +name = "tinydb-serialization" +version = "2.0.0" +description = "Serialization for objects that TinyDB otherwise couldn't handle" +category = "main" +optional = false +python-versions = ">=3.5,<4.0" + +[package.dependencies] +tinydb = ">=4.0,<5.0" + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "typed-ast" +version = "1.4.2" +description = "a fork of Python 2 and 3 ast modules with type comment support" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "typing-extensions" +version = "3.7.4.3" +description = "Backported and Experimental Type Hints for Python 3.5+" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "tzlocal" +version = "2.1" +description = "tzinfo object for the local timezone" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +pytz = "*" + +[[package]] +name = "urllib3" +version = "1.26.2" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" + +[package.extras] +brotli = ["brotlipy (>=0.6.0)"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "uvicorn" +version = "0.13.3" +description = "The lightning-fast ASGI server." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +click = ">=7.0.0,<8.0.0" +h11 = ">=0.8" + +[package.extras] +standard = ["websockets (>=8.0.0,<9.0.0)", "watchgod (>=0.6,<0.7)", "python-dotenv (>=0.13)", "PyYAML (>=5.1)", "httptools (>=0.1.0,<0.2.0)", "uvloop (>=0.14.0)", "colorama (>=0.4)"] + +[[package]] +name = "wrapt" +version = "1.12.1" +description = "Module for decorators, wrappers and monkey patching." +category = "dev" +optional = false +python-versions = "*" + +[metadata] +lock-version = "1.1" +python-versions = "^3.8" +content-hash = "ce807dfb5afb04f3d5db01669ad965f9c140b7568e6f4ac76ce3f76ef49a9edf" + +[metadata.files] +aiofiles = [ + {file = "aiofiles-0.5.0-py3-none-any.whl", hash = "sha256:377fdf7815cc611870c59cbd07b68b180841d2a2b79812d8c218be02448c2acb"}, + {file = "aiofiles-0.5.0.tar.gz", hash = "sha256:98e6bcfd1b50f97db4980e182ddd509b7cc35909e903a8fe50d8849e02d815af"}, +] +aniso8601 = [ + {file = "aniso8601-7.0.0-py2.py3-none-any.whl", hash = "sha256:d10a4bf949f619f719b227ef5386e31f49a2b6d453004b21f02661ccc8670c7b"}, + {file = "aniso8601-7.0.0.tar.gz", hash = "sha256:513d2b6637b7853806ae79ffaca6f3e8754bdd547048f5ccc1420aec4b714f1e"}, +] +appdirs = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] +apscheduler = [ + {file = "APScheduler-3.6.3-py2.py3-none-any.whl", hash = "sha256:e8b1ecdb4c7cb2818913f766d5898183c7cb8936680710a4d3a966e02262e526"}, + {file = "APScheduler-3.6.3.tar.gz", hash = "sha256:3bb5229eed6fbbdafc13ce962712ae66e175aa214c69bed35a06bffcf0c5e244"}, +] +astroid = [ + {file = "astroid-2.4.2-py3-none-any.whl", hash = "sha256:bc58d83eb610252fd8de6363e39d4f1d0619c894b0ed24603b881c02e64c7386"}, + {file = "astroid-2.4.2.tar.gz", hash = "sha256:2f4078c2a41bf377eea06d71c9d2ba4eb8f6b1af2135bec27bbbb7d8f12bb703"}, +] +atomicwrites = [ + {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, + {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, +] +attrs = [ + {file = "attrs-20.3.0-py2.py3-none-any.whl", hash = "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6"}, + {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, +] +black = [ + {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, +] +certifi = [ + {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"}, + {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"}, +] +chardet = [ + {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, + {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, +] +click = [ + {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, + {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, +] +colorama = [ + {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, +] +fastapi = [ + {file = "fastapi-0.63.0-py3-none-any.whl", hash = "sha256:98d8ea9591d8512fdadf255d2a8fa56515cdd8624dca4af369da73727409508e"}, + {file = "fastapi-0.63.0.tar.gz", hash = "sha256:63c4592f5ef3edf30afa9a44fa7c6b7ccb20e0d3f68cd9eba07b44d552058dcb"}, +] +gitdb = [ + {file = "gitdb-4.0.5-py3-none-any.whl", hash = "sha256:91f36bfb1ab7949b3b40e23736db18231bf7593edada2ba5c3a174a7b23657ac"}, + {file = "gitdb-4.0.5.tar.gz", hash = "sha256:c9e1f2d0db7ddb9a704c2a0217be31214e91a4fe1dea1efad19ae42ba0c285c9"}, +] +gitpython = [ + {file = "GitPython-3.1.12-py3-none-any.whl", hash = "sha256:867ec3dfb126aac0f8296b19fb63b8c4a399f32b4b6fafe84c4b10af5fa9f7b5"}, + {file = "GitPython-3.1.12.tar.gz", hash = "sha256:42dbefd8d9e2576c496ed0059f3103dcef7125b9ce16f9d5f9c834aed44a1dac"}, +] +h11 = [ + {file = "h11-0.12.0-py3-none-any.whl", hash = "sha256:36a3cb8c0a032f56e2da7084577878a035d3b61d104230d4bd49c0c6b555a9c6"}, + {file = "h11-0.12.0.tar.gz", hash = "sha256:47222cb6067e4a307d535814917cd98fd0a57b6788ce715755fa2b6c28b56042"}, +] +idna = [ + {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, + {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, +] +iniconfig = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] +isort = [ + {file = "isort-5.7.0-py3-none-any.whl", hash = "sha256:fff4f0c04e1825522ce6949973e83110a6e907750cd92d128b0d14aaaadbffdc"}, + {file = "isort-5.7.0.tar.gz", hash = "sha256:c729845434366216d320e936b8ad6f9d681aab72dc7cbc2d51bedc3582f3ad1e"}, +] +jinja2 = [ + {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, + {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, +] +lazy-object-proxy = [ + {file = "lazy-object-proxy-1.4.3.tar.gz", hash = "sha256:f3900e8a5de27447acbf900b4750b0ddfd7ec1ea7fbaf11dfa911141bc522af0"}, + {file = "lazy_object_proxy-1.4.3-cp27-cp27m-macosx_10_13_x86_64.whl", hash = "sha256:a2238e9d1bb71a56cd710611a1614d1194dc10a175c1e08d75e1a7bcc250d442"}, + {file = "lazy_object_proxy-1.4.3-cp27-cp27m-win32.whl", hash = "sha256:efa1909120ce98bbb3777e8b6f92237f5d5c8ea6758efea36a473e1d38f7d3e4"}, + {file = "lazy_object_proxy-1.4.3-cp27-cp27m-win_amd64.whl", hash = "sha256:4677f594e474c91da97f489fea5b7daa17b5517190899cf213697e48d3902f5a"}, + {file = "lazy_object_proxy-1.4.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:0c4b206227a8097f05c4dbdd323c50edf81f15db3b8dc064d08c62d37e1a504d"}, + {file = "lazy_object_proxy-1.4.3-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:d945239a5639b3ff35b70a88c5f2f491913eb94871780ebfabb2568bd58afc5a"}, + {file = "lazy_object_proxy-1.4.3-cp34-cp34m-win32.whl", hash = "sha256:9651375199045a358eb6741df3e02a651e0330be090b3bc79f6d0de31a80ec3e"}, + {file = "lazy_object_proxy-1.4.3-cp34-cp34m-win_amd64.whl", hash = "sha256:eba7011090323c1dadf18b3b689845fd96a61ba0a1dfbd7f24b921398affc357"}, + {file = "lazy_object_proxy-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:48dab84ebd4831077b150572aec802f303117c8cc5c871e182447281ebf3ac50"}, + {file = "lazy_object_proxy-1.4.3-cp35-cp35m-win32.whl", hash = "sha256:ca0a928a3ddbc5725be2dd1cf895ec0a254798915fb3a36af0964a0a4149e3db"}, + {file = "lazy_object_proxy-1.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:194d092e6f246b906e8f70884e620e459fc54db3259e60cf69a4d66c3fda3449"}, + {file = "lazy_object_proxy-1.4.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:97bb5884f6f1cdce0099f86b907aa41c970c3c672ac8b9c8352789e103cf3156"}, + {file = "lazy_object_proxy-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:cb2c7c57005a6804ab66f106ceb8482da55f5314b7fcb06551db1edae4ad1531"}, + {file = "lazy_object_proxy-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:8d859b89baf8ef7f8bc6b00aa20316483d67f0b1cbf422f5b4dc56701c8f2ffb"}, + {file = "lazy_object_proxy-1.4.3-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:1be7e4c9f96948003609aa6c974ae59830a6baecc5376c25c92d7d697e684c08"}, + {file = "lazy_object_proxy-1.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d74bb8693bf9cf75ac3b47a54d716bbb1a92648d5f781fc799347cfc95952383"}, + {file = "lazy_object_proxy-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:9b15f3f4c0f35727d3a0fba4b770b3c4ebbb1fa907dbcc046a1d2799f3edd142"}, + {file = "lazy_object_proxy-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9254f4358b9b541e3441b007a0ea0764b9d056afdeafc1a5569eee1cc6c1b9ea"}, + {file = "lazy_object_proxy-1.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:a6ae12d08c0bf9909ce12385803a543bfe99b95fe01e752536a60af2b7797c62"}, + {file = "lazy_object_proxy-1.4.3-cp38-cp38-win32.whl", hash = "sha256:5541cada25cd173702dbd99f8e22434105456314462326f06dba3e180f203dfd"}, + {file = "lazy_object_proxy-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:59f79fef100b09564bc2df42ea2d8d21a64fdcda64979c0fa3db7bdaabaf6239"}, +] +markupsafe = [ + {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"}, + {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"}, + {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, + {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, +] +mccabe = [ + {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, + {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, +] +mongoengine = [ + {file = "mongoengine-0.22.1-py3-none-any.whl", hash = "sha256:4d5efb8b6ddffc087d0741fe56fe30637b5629e33c8fae8de53a907ec20c43dd"}, + {file = "mongoengine-0.22.1.tar.gz", hash = "sha256:620d13db551c849402eb3c362878934f5260ec0028fff2a5d81bf53b21d91572"}, +] +mypy-extensions = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] +packaging = [ + {file = "packaging-20.8-py2.py3-none-any.whl", hash = "sha256:24e0da08660a87484d1602c30bb4902d74816b6985b93de36926f5bc95741858"}, + {file = "packaging-20.8.tar.gz", hash = "sha256:78598185a7008a470d64526a8059de9aaa449238f280fc9eb6b13ba6c4109093"}, +] +pathspec = [ + {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"}, + {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, +] +pluggy = [ + {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, + {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, +] +py = [ + {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, + {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, +] +pydantic = [ + {file = "pydantic-1.7.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c59ea046aea25be14dc22d69c97bee629e6d48d2b2ecb724d7fe8806bf5f61cd"}, + {file = "pydantic-1.7.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a4143c8d0c456a093387b96e0f5ee941a950992904d88bc816b4f0e72c9a0009"}, + {file = "pydantic-1.7.3-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:d8df4b9090b595511906fa48deda47af04e7d092318bfb291f4d45dfb6bb2127"}, + {file = "pydantic-1.7.3-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:514b473d264671a5c672dfb28bdfe1bf1afd390f6b206aa2ec9fed7fc592c48e"}, + {file = "pydantic-1.7.3-cp36-cp36m-win_amd64.whl", hash = "sha256:dba5c1f0a3aeea5083e75db9660935da90216f8a81b6d68e67f54e135ed5eb23"}, + {file = "pydantic-1.7.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:59e45f3b694b05a69032a0d603c32d453a23f0de80844fb14d55ab0c6c78ff2f"}, + {file = "pydantic-1.7.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:5b24e8a572e4b4c18f614004dda8c9f2c07328cb5b6e314d6e1bbd536cb1a6c1"}, + {file = "pydantic-1.7.3-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:b2b054d095b6431cdda2f852a6d2f0fdec77686b305c57961b4c5dd6d863bf3c"}, + {file = "pydantic-1.7.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:025bf13ce27990acc059d0c5be46f416fc9b293f45363b3d19855165fee1874f"}, + {file = "pydantic-1.7.3-cp37-cp37m-win_amd64.whl", hash = "sha256:6e3874aa7e8babd37b40c4504e3a94cc2023696ced5a0500949f3347664ff8e2"}, + {file = "pydantic-1.7.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e682f6442ebe4e50cb5e1cfde7dda6766fb586631c3e5569f6aa1951fd1a76ef"}, + {file = "pydantic-1.7.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:185e18134bec5ef43351149fe34fda4758e53d05bb8ea4d5928f0720997b79ef"}, + {file = "pydantic-1.7.3-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:f5b06f5099e163295b8ff5b1b71132ecf5866cc6e7f586d78d7d3fd6e8084608"}, + {file = "pydantic-1.7.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:24ca47365be2a5a3cc3f4a26dcc755bcdc9f0036f55dcedbd55663662ba145ec"}, + {file = "pydantic-1.7.3-cp38-cp38-win_amd64.whl", hash = "sha256:d1fe3f0df8ac0f3a9792666c69a7cd70530f329036426d06b4f899c025aca74e"}, + {file = "pydantic-1.7.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f6864844b039805add62ebe8a8c676286340ba0c6d043ae5dea24114b82a319e"}, + {file = "pydantic-1.7.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:ecb54491f98544c12c66ff3d15e701612fc388161fd455242447083350904730"}, + {file = "pydantic-1.7.3-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:ffd180ebd5dd2a9ac0da4e8b995c9c99e7c74c31f985ba090ee01d681b1c4b95"}, + {file = "pydantic-1.7.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8d72e814c7821125b16f1553124d12faba88e85405b0864328899aceaad7282b"}, + {file = "pydantic-1.7.3-cp39-cp39-win_amd64.whl", hash = "sha256:475f2fa134cf272d6631072554f845d0630907fce053926ff634cc6bc45bf1af"}, + {file = "pydantic-1.7.3-py3-none-any.whl", hash = "sha256:38be427ea01a78206bcaf9a56f835784afcba9e5b88fbdce33bbbfbcd7841229"}, + {file = "pydantic-1.7.3.tar.gz", hash = "sha256:213125b7e9e64713d16d988d10997dabc6a1f73f3991e1ff8e35ebb1409c7dc9"}, +] +pylint = [ + {file = "pylint-2.6.0-py3-none-any.whl", hash = "sha256:bfe68f020f8a0fece830a22dd4d5dddb4ecc6137db04face4c3420a46a52239f"}, + {file = "pylint-2.6.0.tar.gz", hash = "sha256:bb4a908c9dadbc3aac18860550e870f58e1a02c9f2c204fdf5693d73be061210"}, +] +pymongo = [ + {file = "pymongo-3.11.2-cp27-cp27m-macosx_10_14_intel.whl", hash = "sha256:9be785bd4e1ba0148fb00ca84e4dbfbd1c74df3af3a648559adc60b0782f34de"}, + {file = "pymongo-3.11.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:646d4d30c5aa7c0ddbfe9b990f0f77a88621024a21ad0b792bd9d58caa9611f0"}, + {file = "pymongo-3.11.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:8d669c720891781e7c82d412cad39f9730ef277e3957b48a3344dae47d3caa03"}, + {file = "pymongo-3.11.2-cp27-cp27m-win32.whl", hash = "sha256:ce53c00be204ec4428d3c1f3c478ae89d388efec575544c27f57b61e9fa4a7f2"}, + {file = "pymongo-3.11.2-cp27-cp27m-win_amd64.whl", hash = "sha256:82d5ded5834b6c92380847860eb28dcaf20b847a27cee5811c4aaceef87fd280"}, + {file = "pymongo-3.11.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:fcc66d17a3363b7bd6d2655de8706e25a3cd1be2bd1b8e8d8a5c504a6ef893ae"}, + {file = "pymongo-3.11.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:b875bb4b438931dce550e170bfb558597189b8d0160f4ac60f14a21955161699"}, + {file = "pymongo-3.11.2-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:6700e251c6396cc05d7460dc05ef8e19e60a7b53b62c007725b48e123aaa2b1c"}, + {file = "pymongo-3.11.2-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:c046e09e886f4539f8626afba17fa8f2e6552731f9384e2827154e3e3b7fda4e"}, + {file = "pymongo-3.11.2-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:4942a5659ae927bb764a123a6409870ca5dd572d83b3bfb71412c9a191bbf792"}, + {file = "pymongo-3.11.2-cp34-cp34m-win32.whl", hash = "sha256:422069f2cebf58c9dd9e8040b4768f7be4f228c95bc4505e8fa8e7b4f7191ad8"}, + {file = "pymongo-3.11.2-cp34-cp34m-win_amd64.whl", hash = "sha256:44376a657717de8847d5d71a9305f3595c7e78c91ac77edbb87058d12ede87a6"}, + {file = "pymongo-3.11.2-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:36b9b98a39565a8f33803c81569442b35e749a72fb1aa7d0bcdb1a33052f8bcc"}, + {file = "pymongo-3.11.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a118a1df7280ffab7fe0f3eab325868339ff1c4d5b8e0750db0f0a796da8f849"}, + {file = "pymongo-3.11.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c812b6e53344e92f10f12235219fb769c491a4a87a02c9c3f93fe632e493bda8"}, + {file = "pymongo-3.11.2-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:cc421babc687dc52ce0fc19787b2404518ca749d9db59576100946ff886f38ed"}, + {file = "pymongo-3.11.2-cp35-cp35m-manylinux2014_i686.whl", hash = "sha256:6aac7e0e8de92f11a410eb68c24a2decbac6f094e82fd95d22546d0168e7a18b"}, + {file = "pymongo-3.11.2-cp35-cp35m-manylinux2014_ppc64le.whl", hash = "sha256:c6cf288c9e03195d8e12b72a6388b32f18a5e9c2545622417a963e428e1fe496"}, + {file = "pymongo-3.11.2-cp35-cp35m-manylinux2014_s390x.whl", hash = "sha256:5980509801cbd2942df31714d055d89863684b4de26829c349362e610a48694e"}, + {file = "pymongo-3.11.2-cp35-cp35m-manylinux2014_x86_64.whl", hash = "sha256:264843ce2af0640994a4331148ef5312989bc004678c457460758766c9b4decc"}, + {file = "pymongo-3.11.2-cp35-cp35m-win32.whl", hash = "sha256:ef18aa15b1aa18c42933deed5233b3284186e9ed85c25d2704ceff5099a3964c"}, + {file = "pymongo-3.11.2-cp35-cp35m-win_amd64.whl", hash = "sha256:019ddf7ced8e42cc6c8c608927c799be8097237596c94ffe551f6ef70e55237e"}, + {file = "pymongo-3.11.2-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:96c6aef7ffb0d37206c0342abb82d874fa8cdc344267277ec63f562b94335c22"}, + {file = "pymongo-3.11.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:82f6e42ba40440a7e0a20bfe12465a3b62d65966a4c7ad1a21b36ffff88de6fe"}, + {file = "pymongo-3.11.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5ad7b96c27acd7e256b33f47cf3d23bd7dd902f9c033ae43f32ffcbc37bebafd"}, + {file = "pymongo-3.11.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:45728e6aae3023afb5b2829586d1d2bfd9f0d71cfd7d3c924b71a5e9aef617a8"}, + {file = "pymongo-3.11.2-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:ce9964c117cbe5cf6269f30a2b334d28675956e988b7dbd0b4f7370924afda2e"}, + {file = "pymongo-3.11.2-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:1222025db539641071a1b67f6950f65a6342a39db5b454bf306abd6954f1ad8a"}, + {file = "pymongo-3.11.2-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:fc4946acb6cdada08f60aca103b61334995523da65be5fe816ea8571c9967d46"}, + {file = "pymongo-3.11.2-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:76579fcf77052b39796fe4a11818d1289dd48cffe15951b3403288fa163c29f6"}, + {file = "pymongo-3.11.2-cp36-cp36m-win32.whl", hash = "sha256:d6f82e86896a8db70e8ae8fa4b7556a0f188f1d8a6c53b2ba229889d55a59308"}, + {file = "pymongo-3.11.2-cp36-cp36m-win_amd64.whl", hash = "sha256:082832a59da18efab4d9148cca396451bac99da9757f31767f706e828b5b8500"}, + {file = "pymongo-3.11.2-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:3646c2286d889618d43e01d9810ac1fc17709d2b4dec61366df5edc8ba228b3e"}, + {file = "pymongo-3.11.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:3ec8f8e106a1476659d8c020228b45614daabdbdb6c6454a843a1d4f77d13339"}, + {file = "pymongo-3.11.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:202ea1d4edc8a5439fc179802d807b49e7e563207fea5610779e56674ac770c6"}, + {file = "pymongo-3.11.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b50af6701b4a5288b77fb4db44a363aa9485caf2c3e7a40c0373fd45e34440af"}, + {file = "pymongo-3.11.2-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:46792b71ab802d9caf1fc9d52e83399ef8e1a36e91eef4d827c06e36b8df2230"}, + {file = "pymongo-3.11.2-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:21d7b48567a1c80f9266e0ab61c1218a31279d911da345679188733e354f81cc"}, + {file = "pymongo-3.11.2-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:29a6840c2ac778010547cad5870f3db2e080ad7fad01197b07fff993c08692c8"}, + {file = "pymongo-3.11.2-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:6122470dfa61d4909b75c98012c1577404ba4ab860d0095e0c6980560cb3711f"}, + {file = "pymongo-3.11.2-cp37-cp37m-win32.whl", hash = "sha256:047cc2007b280672ddfdf2e7b862aad8d898f481f65bbc9067bfa4e420a019a9"}, + {file = "pymongo-3.11.2-cp37-cp37m-win_amd64.whl", hash = "sha256:1580fad512c678b720784e5c9018621b1b3bd37fb5b1633e874738862d6435c7"}, + {file = "pymongo-3.11.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7e69fa025a1db189443428f345fea5555d16413df6addc056e17bb8c9794b006"}, + {file = "pymongo-3.11.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:813db97e9955b6b1b50b5cebd18cb148580603bb9b067ea4c5cc656b333bc906"}, + {file = "pymongo-3.11.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:523804bd8fcb5255508052b50073a27c701b90a73ea46e29be46dad5fe01bde6"}, + {file = "pymongo-3.11.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fa741e9c805567239f845c7e9a016aff797f9bb02ff9bc8ccd2fbd9eafefedd4"}, + {file = "pymongo-3.11.2-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:b95d2c2829b5956bf54d9a22ffec911dea75abf0f0f7e0a8a57423434bfbde91"}, + {file = "pymongo-3.11.2-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:6e7a6057481a644970e43475292e1c0af095ca39a20fe83781196bd6e6690a38"}, + {file = "pymongo-3.11.2-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:540dafd6f4a0590fc966465c726b80fa7c0804490c39786ef29236fe68c94401"}, + {file = "pymongo-3.11.2-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:d9d3ae537f61011191b2fd6f8527b9f9f8a848b37d4c85a0f7bb28004c42b546"}, + {file = "pymongo-3.11.2-cp38-cp38-win32.whl", hash = "sha256:047c325c4a96e7be7d11acf58639bcf71a81ca212d9c6590e3369bc28678647a"}, + {file = "pymongo-3.11.2-cp38-cp38-win_amd64.whl", hash = "sha256:b4294ddf76452459433ecfa6a93258608b5e462c76ef15e4695ed5e2762f009f"}, + {file = "pymongo-3.11.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:061d59f525831c4051af0b6dbafa62b0b8b168d4ef5b6e3c46d0811b8499d100"}, + {file = "pymongo-3.11.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:ed98683d8f01f1c46ef2d02469e04e9a8fe9a73a9741a4e6e66677a73b59bec8"}, + {file = "pymongo-3.11.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7f0c507e1f108790840d6c4b594019ebf595025c324c9f7e9c9b2b15b41f884e"}, + {file = "pymongo-3.11.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:9d19843568df9d263dc92ae4cc2279879add8a26996473f9155590cac635b321"}, + {file = "pymongo-3.11.2-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:6175fd105da74a09adb38f93be96e1f64873294c906e5e722cbbc5bd10c44e3b"}, + {file = "pymongo-3.11.2-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:944ed467feb949e103555863fa934fb84216a096b0004ca364d3ddf9d18e2b9e"}, + {file = "pymongo-3.11.2-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:4be4fe9d18523da98deeb0b554ac76e1dc1562ee879d62572b34dda8593efcc1"}, + {file = "pymongo-3.11.2-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:270a1f6a331eac3a393090af06df68297cb31a8b2df0bdcbd97dc613c5758e78"}, + {file = "pymongo-3.11.2-cp39-cp39-win32.whl", hash = "sha256:e565d1e4388765c135052717f15f9e0314f9d172062444c6b3fc0002e93ed04b"}, + {file = "pymongo-3.11.2-cp39-cp39-win_amd64.whl", hash = "sha256:0a53a751d977ad02f1bd22ddb6288bb4816c4758f44a50225462aeeae9cbf6a0"}, + {file = "pymongo-3.11.2-py2.7-macosx-10.14-intel.egg", hash = "sha256:c1d1992bbdf363b22b5a9543ab7d7c6f27a1498826d50d91319b803ddcf1142e"}, + {file = "pymongo-3.11.2.tar.gz", hash = "sha256:c2b67881392a9e85aa108e75f62cdbe372d5a3f17ea5f8d3436dcf4662052f14"}, +] +pyparsing = [ + {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, + {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, +] +pytest = [ + {file = "pytest-6.2.1-py3-none-any.whl", hash = "sha256:1969f797a1a0dbd8ccf0fecc80262312729afea9c17f1d70ebf85c5e76c6f7c8"}, + {file = "pytest-6.2.1.tar.gz", hash = "sha256:66e419b1899bc27346cb2c993e12c5e5e8daba9073c1fbce33b9807abc95c306"}, +] +python-dotenv = [ + {file = "python-dotenv-0.15.0.tar.gz", hash = "sha256:587825ed60b1711daea4832cf37524dfd404325b7db5e25ebe88c495c9f807a0"}, + {file = "python_dotenv-0.15.0-py2.py3-none-any.whl", hash = "sha256:0c8d1b80d1a1e91717ea7d526178e3882732420b03f08afea0406db6402e220e"}, +] +python-slugify = [ + {file = "python-slugify-4.0.1.tar.gz", hash = "sha256:69a517766e00c1268e5bbfc0d010a0a8508de0b18d30ad5a1ff357f8ae724270"}, +] +pytz = [ + {file = "pytz-2020.5-py2.py3-none-any.whl", hash = "sha256:16962c5fb8db4a8f63a26646d8886e9d769b6c511543557bc84e9569fb9a9cb4"}, + {file = "pytz-2020.5.tar.gz", hash = "sha256:180befebb1927b16f6b57101720075a984c019ac16b1b7575673bea42c6c3da5"}, +] +regex = [ + {file = "regex-2020.11.13-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8b882a78c320478b12ff024e81dc7d43c1462aa4a3341c754ee65d857a521f85"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a63f1a07932c9686d2d416fb295ec2c01ab246e89b4d58e5fa468089cab44b70"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:6e4b08c6f8daca7d8f07c8d24e4331ae7953333dbd09c648ed6ebd24db5a10ee"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bba349276b126947b014e50ab3316c027cac1495992f10e5682dc677b3dfa0c5"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:56e01daca75eae420bce184edd8bb341c8eebb19dd3bce7266332258f9fb9dd7"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:6a8ce43923c518c24a2579fda49f093f1397dad5d18346211e46f134fc624e31"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:1ab79fcb02b930de09c76d024d279686ec5d532eb814fd0ed1e0051eb8bd2daa"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:9801c4c1d9ae6a70aeb2128e5b4b68c45d4f0af0d1535500884d644fa9b768c6"}, + {file = "regex-2020.11.13-cp36-cp36m-win32.whl", hash = "sha256:49cae022fa13f09be91b2c880e58e14b6da5d10639ed45ca69b85faf039f7a4e"}, + {file = "regex-2020.11.13-cp36-cp36m-win_amd64.whl", hash = "sha256:749078d1eb89484db5f34b4012092ad14b327944ee7f1c4f74d6279a6e4d1884"}, + {file = "regex-2020.11.13-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b2f4007bff007c96a173e24dcda236e5e83bde4358a557f9ccf5e014439eae4b"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:38c8fd190db64f513fe4e1baa59fed086ae71fa45083b6936b52d34df8f86a88"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5862975b45d451b6db51c2e654990c1820523a5b07100fc6903e9c86575202a0"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:262c6825b309e6485ec2493ffc7e62a13cf13fb2a8b6d212f72bd53ad34118f1"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:bafb01b4688833e099d79e7efd23f99172f501a15c44f21ea2118681473fdba0"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:e32f5f3d1b1c663af7f9c4c1e72e6ffe9a78c03a31e149259f531e0fed826512"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:3bddc701bdd1efa0d5264d2649588cbfda549b2899dc8d50417e47a82e1387ba"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:02951b7dacb123d8ea6da44fe45ddd084aa6777d4b2454fa0da61d569c6fa538"}, + {file = "regex-2020.11.13-cp37-cp37m-win32.whl", hash = "sha256:0d08e71e70c0237883d0bef12cad5145b84c3705e9c6a588b2a9c7080e5af2a4"}, + {file = "regex-2020.11.13-cp37-cp37m-win_amd64.whl", hash = "sha256:1fa7ee9c2a0e30405e21031d07d7ba8617bc590d391adfc2b7f1e8b99f46f444"}, + {file = "regex-2020.11.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:baf378ba6151f6e272824b86a774326f692bc2ef4cc5ce8d5bc76e38c813a55f"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e3faaf10a0d1e8e23a9b51d1900b72e1635c2d5b0e1bea1c18022486a8e2e52d"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2a11a3e90bd9901d70a5b31d7dd85114755a581a5da3fc996abfefa48aee78af"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1ebb090a426db66dd80df8ca85adc4abfcbad8a7c2e9a5ec7513ede522e0a8f"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:b2b1a5ddae3677d89b686e5c625fc5547c6e492bd755b520de5332773a8af06b"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:2c99e97d388cd0a8d30f7c514d67887d8021541b875baf09791a3baad48bb4f8"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:c084582d4215593f2f1d28b65d2a2f3aceff8342aa85afd7be23a9cad74a0de5"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:a3d748383762e56337c39ab35c6ed4deb88df5326f97a38946ddd19028ecce6b"}, + {file = "regex-2020.11.13-cp38-cp38-win32.whl", hash = "sha256:7913bd25f4ab274ba37bc97ad0e21c31004224ccb02765ad984eef43e04acc6c"}, + {file = "regex-2020.11.13-cp38-cp38-win_amd64.whl", hash = "sha256:6c54ce4b5d61a7129bad5c5dc279e222afd00e721bf92f9ef09e4fae28755683"}, + {file = "regex-2020.11.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1862a9d9194fae76a7aaf0150d5f2a8ec1da89e8b55890b1786b8f88a0f619dc"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux1_i686.whl", hash = "sha256:4902e6aa086cbb224241adbc2f06235927d5cdacffb2425c73e6570e8d862364"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7a25fcbeae08f96a754b45bdc050e1fb94b95cab046bf56b016c25e9ab127b3e"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:d2d8ce12b7c12c87e41123997ebaf1a5767a5be3ec545f64675388970f415e2e"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f7d29a6fc4760300f86ae329e3b6ca28ea9c20823df123a2ea8693e967b29917"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:717881211f46de3ab130b58ec0908267961fadc06e44f974466d1887f865bd5b"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:3128e30d83f2e70b0bed9b2a34e92707d0877e460b402faca908c6667092ada9"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8f6a2229e8ad946e36815f2a03386bb8353d4bde368fdf8ca5f0cb97264d3b5c"}, + {file = "regex-2020.11.13-cp39-cp39-win32.whl", hash = "sha256:f8f295db00ef5f8bae530fc39af0b40486ca6068733fb860b42115052206466f"}, + {file = "regex-2020.11.13-cp39-cp39-win_amd64.whl", hash = "sha256:a15f64ae3a027b64496a71ab1f722355e570c3fac5ba2801cafce846bf5af01d"}, + {file = "regex-2020.11.13.tar.gz", hash = "sha256:83d6b356e116ca119db8e7c6fc2983289d87b27b3fac238cfe5dca529d884562"}, +] +requests = [ + {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"}, + {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"}, +] +six = [ + {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, + {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, +] +smmap = [ + {file = "smmap-3.0.4-py2.py3-none-any.whl", hash = "sha256:54c44c197c819d5ef1991799a7e30b662d1e520f2ac75c9efbeb54a742214cf4"}, + {file = "smmap-3.0.4.tar.gz", hash = "sha256:9c98bbd1f9786d22f14b3d4126894d56befb835ec90cef151af566c7e19b5d24"}, +] +sqlalchemy = [ + {file = "SQLAlchemy-1.3.22-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:61628715931f4962e0cdb2a7c87ff39eea320d2aa96bd471a3c293d146f90394"}, + {file = "SQLAlchemy-1.3.22-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:81d8d099a49f83111cce55ec03cc87eef45eec0d90f9842b4fc674f860b857b0"}, + {file = "SQLAlchemy-1.3.22-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:d055ff750fcab69ca4e57b656d9c6ad33682e9b8d564f2fbe667ab95c63591b0"}, + {file = "SQLAlchemy-1.3.22-cp27-cp27m-win32.whl", hash = "sha256:9bf572e4f5aa23f88dd902f10bb103cb5979022a38eec684bfa6d61851173fec"}, + {file = "SQLAlchemy-1.3.22-cp27-cp27m-win_amd64.whl", hash = "sha256:7d4b8de6bb0bc736161cb0bbd95366b11b3eb24dd6b814a143d8375e75af9990"}, + {file = "SQLAlchemy-1.3.22-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:4a84c7c7658dd22a33dab2e2aa2d17c18cb004a42388246f2e87cb4085ef2811"}, + {file = "SQLAlchemy-1.3.22-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:f1e88b30da8163215eab643962ae9d9252e47b4ea53404f2c4f10f24e70ddc62"}, + {file = "SQLAlchemy-1.3.22-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:f115150cc4361dd46153302a640c7fa1804ac207f9cc356228248e351a8b4676"}, + {file = "SQLAlchemy-1.3.22-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6aaa13ee40c4552d5f3a59f543f0db6e31712cc4009ec7385407be4627259d41"}, + {file = "SQLAlchemy-1.3.22-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:3ab5b44a07b8c562c6dcb7433c6a6c6e03266d19d64f87b3333eda34e3b9936b"}, + {file = "SQLAlchemy-1.3.22-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:426ece890153ccc52cc5151a1a0ed540a5a7825414139bb4c95a868d8da54a52"}, + {file = "SQLAlchemy-1.3.22-cp35-cp35m-win32.whl", hash = "sha256:bd4b1af45fd322dcd1fb2a9195b4f93f570d1a5902a842e3e6051385fac88f9c"}, + {file = "SQLAlchemy-1.3.22-cp35-cp35m-win_amd64.whl", hash = "sha256:62285607a5264d1f91590abd874d6a498e229d5840669bd7d9f654cfaa599bd0"}, + {file = "SQLAlchemy-1.3.22-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:314f5042c0b047438e19401d5f29757a511cfc2f0c40d28047ca0e4c95eabb5b"}, + {file = "SQLAlchemy-1.3.22-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:62fb881ba51dbacba9af9b779211cf9acff3442d4f2993142015b22b3cd1f92a"}, + {file = "SQLAlchemy-1.3.22-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:bde677047305fe76c7ee3e4492b545e0018918e44141cc154fe39e124e433991"}, + {file = "SQLAlchemy-1.3.22-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:0c6406a78a714a540d980a680b86654feadb81c8d0eecb59f3d6c554a4c69f19"}, + {file = "SQLAlchemy-1.3.22-cp36-cp36m-win32.whl", hash = "sha256:95bde07d19c146d608bccb9b16e144ec8f139bcfe7fd72331858698a71c9b4f5"}, + {file = "SQLAlchemy-1.3.22-cp36-cp36m-win_amd64.whl", hash = "sha256:888d5b4b5aeed0d3449de93ea80173653e939e916cc95fe8527079e50235c1d2"}, + {file = "SQLAlchemy-1.3.22-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:d53f59744b01f1440a1b0973ed2c3a7de204135c593299ee997828aad5191693"}, + {file = "SQLAlchemy-1.3.22-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:70121f0ae48b25ef3e56e477b88cd0b0af0e1f3a53b5554071aa6a93ef378a03"}, + {file = "SQLAlchemy-1.3.22-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:54da615e5b92c339e339fe8536cce99fe823b6ed505d4ea344852aefa1c205fb"}, + {file = "SQLAlchemy-1.3.22-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:68428818cf80c60dc04aa0f38da20ad39b28aba4d4d199f949e7d6e04444ea86"}, + {file = "SQLAlchemy-1.3.22-cp37-cp37m-win32.whl", hash = "sha256:17610d573e698bf395afbbff946544fbce7c5f4ee77b5bcb1f821b36345fae7a"}, + {file = "SQLAlchemy-1.3.22-cp37-cp37m-win_amd64.whl", hash = "sha256:216ba5b4299c95ed179b58f298bda885a476b16288ab7243e89f29f6aeced7e0"}, + {file = "SQLAlchemy-1.3.22-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:0c72b90988be749e04eff0342dcc98c18a14461eb4b2ad59d611b57b31120f90"}, + {file = "SQLAlchemy-1.3.22-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:491fe48adc07d13e020a8b07ef82eefc227003a046809c121bea81d3dbf1832d"}, + {file = "SQLAlchemy-1.3.22-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:f8191fef303025879e6c3548ecd8a95aafc0728c764ab72ec51a0bdf0c91a341"}, + {file = "SQLAlchemy-1.3.22-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:108580808803c7732f34798eb4a329d45b04c562ed83ee90f09f6a184a42b766"}, + {file = "SQLAlchemy-1.3.22-cp38-cp38-win32.whl", hash = "sha256:bab5a1e15b9466a25c96cda19139f3beb3e669794373b9ce28c4cf158c6e841d"}, + {file = "SQLAlchemy-1.3.22-cp38-cp38-win_amd64.whl", hash = "sha256:318b5b727e00662e5fc4b4cd2bf58a5116d7c1b4dd56ffaa7d68f43458a8d1ed"}, + {file = "SQLAlchemy-1.3.22-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:1418f5e71d6081aa1095a1d6b567a562d2761996710bdce9b6e6ba20a03d0864"}, + {file = "SQLAlchemy-1.3.22-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:5a7f224cdb7233182cec2a45d4c633951268d6a9bcedac37abbf79dd07012aea"}, + {file = "SQLAlchemy-1.3.22-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:715b34578cc740b743361f7c3e5f584b04b0f1344f45afc4e87fbac4802eb0a0"}, + {file = "SQLAlchemy-1.3.22-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:2ff132a379838b1abf83c065be54cef32b47c987aedd06b82fc76476c85225eb"}, + {file = "SQLAlchemy-1.3.22-cp39-cp39-win32.whl", hash = "sha256:c389d7cc2b821853fb018c85457da3e7941db64f4387720a329bc7ff06a27963"}, + {file = "SQLAlchemy-1.3.22-cp39-cp39-win_amd64.whl", hash = "sha256:04f995fcbf54e46cddeb4f75ce9dfc17075d6ae04ac23b2bacb44b3bc6f6bf11"}, + {file = "SQLAlchemy-1.3.22.tar.gz", hash = "sha256:758fc8c4d6c0336e617f9f6919f9daea3ab6bb9b07005eda9a1a682e24a6cacc"}, +] +starlette = [ + {file = "starlette-0.13.6-py3-none-any.whl", hash = "sha256:bd2ffe5e37fb75d014728511f8e68ebf2c80b0fa3d04ca1479f4dc752ae31ac9"}, + {file = "starlette-0.13.6.tar.gz", hash = "sha256:ebe8ee08d9be96a3c9f31b2cb2a24dbdf845247b745664bd8a3f9bd0c977fdbc"}, +] +text-unidecode = [ + {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, + {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, +] +tinydb = [ + {file = "tinydb-4.3.0-py3-none-any.whl", hash = "sha256:c8a8887269927e077f3aa16fddbf4debd176c10edc4ac8a5ce48ced0b10adf8c"}, + {file = "tinydb-4.3.0.tar.gz", hash = "sha256:1d102d06f9bb22d739d8061b490c64d420de70dca5f95ebd43a492c43c7bd303"}, +] +tinydb-serialization = [ + {file = "tinydb-serialization-2.0.0.tar.gz", hash = "sha256:02d5ebc54652a38c52976658c1d25732112afb5ebbc4c0b730b3abef4b121b59"}, + {file = "tinydb_serialization-2.0.0-py3-none-any.whl", hash = "sha256:d1bed979e1566452b51ea065942e1208ea751285064ebb56bbab52e2ffbf3100"}, +] +toml = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] +typed-ast = [ + {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:7703620125e4fb79b64aa52427ec192822e9f45d37d4b6625ab37ef403e1df70"}, + {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c9aadc4924d4b5799112837b226160428524a9a45f830e0d0f184b19e4090487"}, + {file = "typed_ast-1.4.2-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:9ec45db0c766f196ae629e509f059ff05fc3148f9ffd28f3cfe75d4afb485412"}, + {file = "typed_ast-1.4.2-cp35-cp35m-win32.whl", hash = "sha256:85f95aa97a35bdb2f2f7d10ec5bbdac0aeb9dafdaf88e17492da0504de2e6400"}, + {file = "typed_ast-1.4.2-cp35-cp35m-win_amd64.whl", hash = "sha256:9044ef2df88d7f33692ae3f18d3be63dec69c4fb1b5a4a9ac950f9b4ba571606"}, + {file = "typed_ast-1.4.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c1c876fd795b36126f773db9cbb393f19808edd2637e00fd6caba0e25f2c7b64"}, + {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5dcfc2e264bd8a1db8b11a892bd1647154ce03eeba94b461effe68790d8b8e07"}, + {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8db0e856712f79c45956da0c9a40ca4246abc3485ae0d7ecc86a20f5e4c09abc"}, + {file = "typed_ast-1.4.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:d003156bb6a59cda9050e983441b7fa2487f7800d76bdc065566b7d728b4581a"}, + {file = "typed_ast-1.4.2-cp36-cp36m-win32.whl", hash = "sha256:4c790331247081ea7c632a76d5b2a265e6d325ecd3179d06e9cf8d46d90dd151"}, + {file = "typed_ast-1.4.2-cp36-cp36m-win_amd64.whl", hash = "sha256:d175297e9533d8d37437abc14e8a83cbc68af93cc9c1c59c2c292ec59a0697a3"}, + {file = "typed_ast-1.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf54cfa843f297991b7388c281cb3855d911137223c6b6d2dd82a47ae5125a41"}, + {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:b4fcdcfa302538f70929eb7b392f536a237cbe2ed9cba88e3bf5027b39f5f77f"}, + {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:987f15737aba2ab5f3928c617ccf1ce412e2e321c77ab16ca5a293e7bbffd581"}, + {file = "typed_ast-1.4.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:37f48d46d733d57cc70fd5f30572d11ab8ed92da6e6b28e024e4a3edfb456e37"}, + {file = "typed_ast-1.4.2-cp37-cp37m-win32.whl", hash = "sha256:36d829b31ab67d6fcb30e185ec996e1f72b892255a745d3a82138c97d21ed1cd"}, + {file = "typed_ast-1.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8368f83e93c7156ccd40e49a783a6a6850ca25b556c0fa0240ed0f659d2fe496"}, + {file = "typed_ast-1.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:963c80b583b0661918718b095e02303d8078950b26cc00b5e5ea9ababe0de1fc"}, + {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e683e409e5c45d5c9082dc1daf13f6374300806240719f95dc783d1fc942af10"}, + {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:84aa6223d71012c68d577c83f4e7db50d11d6b1399a9c779046d75e24bed74ea"}, + {file = "typed_ast-1.4.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:a38878a223bdd37c9709d07cd357bb79f4c760b29210e14ad0fb395294583787"}, + {file = "typed_ast-1.4.2-cp38-cp38-win32.whl", hash = "sha256:a2c927c49f2029291fbabd673d51a2180038f8cd5a5b2f290f78c4516be48be2"}, + {file = "typed_ast-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:c0c74e5579af4b977c8b932f40a5464764b2f86681327410aa028a22d2f54937"}, + {file = "typed_ast-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:07d49388d5bf7e863f7fa2f124b1b1d89d8aa0e2f7812faff0a5658c01c59aa1"}, + {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:240296b27397e4e37874abb1df2a608a92df85cf3e2a04d0d4d61055c8305ba6"}, + {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:d746a437cdbca200622385305aedd9aef68e8a645e385cc483bdc5e488f07166"}, + {file = "typed_ast-1.4.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:14bf1522cdee369e8f5581238edac09150c765ec1cb33615855889cf33dcb92d"}, + {file = "typed_ast-1.4.2-cp39-cp39-win32.whl", hash = "sha256:cc7b98bf58167b7f2db91a4327da24fb93368838eb84a44c472283778fc2446b"}, + {file = "typed_ast-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:7147e2a76c75f0f64c4319886e7639e490fee87c9d25cb1d4faef1d8cf83a440"}, + {file = "typed_ast-1.4.2.tar.gz", hash = "sha256:9fc0b3cb5d1720e7141d103cf4819aea239f7d136acf9ee4a69b047b7986175a"}, +] +typing-extensions = [ + {file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"}, + {file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"}, + {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, +] +tzlocal = [ + {file = "tzlocal-2.1-py2.py3-none-any.whl", hash = "sha256:e2cb6c6b5b604af38597403e9852872d7f534962ae2954c7f35efcb1ccacf4a4"}, + {file = "tzlocal-2.1.tar.gz", hash = "sha256:643c97c5294aedc737780a49d9df30889321cbe1204eac2c2ec6134035a92e44"}, +] +urllib3 = [ + {file = "urllib3-1.26.2-py2.py3-none-any.whl", hash = "sha256:d8ff90d979214d7b4f8ce956e80f4028fc6860e4431f731ea4a8c08f23f99473"}, + {file = "urllib3-1.26.2.tar.gz", hash = "sha256:19188f96923873c92ccb987120ec4acaa12f0461fa9ce5d3d0772bc965a39e08"}, +] +uvicorn = [ + {file = "uvicorn-0.13.3-py3-none-any.whl", hash = "sha256:1079c50a06f6338095b4f203e7861dbff318dde5f22f3a324fc6e94c7654164c"}, + {file = "uvicorn-0.13.3.tar.gz", hash = "sha256:ef1e0bb5f7941c6fe324e06443ddac0331e1632a776175f87891c7bd02694355"}, +] +wrapt = [ + {file = "wrapt-1.12.1.tar.gz", hash = "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"}, +] diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 000000000..0ede86a0b --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,37 @@ +[tool.poetry] +name = "mealie" +version = "0.1.0" +description = "A Recipe Manager" +authors = ["Hayden "] +license = "MIT" + +[tool.poetry.scripts] +start = "app:app" + +[tool.poetry.dependencies] +python = "^3.8" +aiofiles = "0.5.0" +aniso8601 = "7.0.0" +appdirs = "1.4.4" +fastapi = "^0.63.0" +uvicorn = "^0.13.3" +GitPython = "^3.1.12" +APScheduler = "^3.6.3" +SQLAlchemy = "^1.3.22" +Jinja2 = "^2.11.2" +python-dotenv = "^0.15.0" +mongoengine = "^0.22.1" +tinydb = "^4.3.0" +tinydb-serialization = "^2.0.0" +python-slugify = "^4.0.1" +requests = "^2.25.1" + +[tool.poetry.dev-dependencies] +pylint = "^2.6.0" +black = "^20.8b1" +pytest = "^6.2.1" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" + \ No newline at end of file diff --git a/scratch.json b/scratch.json new file mode 100644 index 000000000..e69de29bb