From a603be1f256ff888db9c8d5bbfdb716aed5b35a8 Mon Sep 17 00:00:00 2001 From: Sarah <37188711+sagarrat7@users.noreply.github.com> Date: Wed, 14 Jun 2023 15:17:00 -0700 Subject: [PATCH] feature/matter-text-extraction (#231) * .docx text extracted * .pdf text extracted * test docx * working docx unit test * refactor request out of parse functions * parse doc & parse pptx * fixed documentation * update requirements * check-manifest * docx tests * add example docxs * test pptx, pdf, doc * remove print statement * test docx, doc, pdf with single file * test pptx w/ single document * remove additional example documents * remove print * test error handling * update files --- cdp_backend/tests/conftest.py | 5 + cdp_backend/tests/resources/example_doc.doc | Bin 0 -> 41984 bytes cdp_backend/tests/resources/example_docx.docx | Bin 0 -> 19145 bytes cdp_backend/tests/resources/example_pdf.pdf | Bin 0 -> 48911 bytes cdp_backend/tests/resources/example_pptx.pptx | Bin 0 -> 41334 bytes cdp_backend/tests/utils/test_file_utils.py | 77 +++++++++ cdp_backend/utils/file_utils.py | 160 ++++++++++++++++++ pyproject.toml | 6 + 8 files changed, 248 insertions(+) create mode 100644 cdp_backend/tests/resources/example_doc.doc create mode 100644 cdp_backend/tests/resources/example_docx.docx create mode 100644 cdp_backend/tests/resources/example_pdf.pdf create mode 100644 cdp_backend/tests/resources/example_pptx.pptx diff --git a/cdp_backend/tests/conftest.py b/cdp_backend/tests/conftest.py index 4b5f0af4..03c9c8f8 100644 --- a/cdp_backend/tests/conftest.py +++ b/cdp_backend/tests/conftest.py @@ -42,6 +42,11 @@ def resources_dir() -> Path: # City of Chicago, Illinois EXAMPLE_VIMEO_SHOWCASE = "https://vimeo.com/showcase/6277394/video/722690793" +EXAMPLE_DOCX = "example_docx.docx" +EXAMPLE_DOC = "example_doc.doc" +EXAMPLE_PDF = "example_pdf.pdf" +EXAMPLE_PPTX = "example_pptx.pptx" + @pytest.fixture def example_video(resources_dir: Path) -> Path: diff --git a/cdp_backend/tests/resources/example_doc.doc b/cdp_backend/tests/resources/example_doc.doc new file mode 100644 index 0000000000000000000000000000000000000000..bd3838b0e3c32dfc6138b83194c8e937aa3d1c40 GIT binary patch literal 41984 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 literal 0 HcmV?d00001 diff --git a/cdp_backend/tests/resources/example_docx.docx b/cdp_backend/tests/resources/example_docx.docx new file mode 100644 index 0000000000000000000000000000000000000000..4b86bd82f02620b6436d6b0b5cb9f01d5cb51413 GIT binary patch literal 19145 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

c65^iVD%Uz0Vh%~YxzYP2r!K28O2t8BjEZC6t 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 YAuk2`AsN3sTkrs#AHww@`s?Wb0hNZ|qyPW_ literal 0 HcmV?d00001 diff --git a/cdp_backend/tests/resources/example_pdf.pdf b/cdp_backend/tests/resources/example_pdf.pdf new file mode 100644 index 0000000000000000000000000000000000000000..80c5ef2388468ed26cf51dffee36a81568f1f996 GIT binary patch literal 48911 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


9w9|=Go1H_PV3dk?cJo9l4sow2d8M3 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 uuM8E08P%c4$W2KBtQVLh9zBDoJcm z3WsVks7XF6LYmmaP^y2?LmszVC&+^xH($>_l*!3iP}b`C(m~k8*4E{Ge$fI!0^9T? zO?+*)_?D~SOlEily(#|C?dqvq7Y*`T1d?`L`;8||!X$VV5$kSwAB{mMNo2WJ7g1S# zW;L7!?~S75ETRK^jg}fU*zUNo)&OOqk9`W`?bp}w>*tj6>9iF6WuIv&CSZ3A35}$b zWvx7)7adJ-KkA}qC1nx2 zm9ve1;IO?cgDeV5-HuxzrS!3f%6}^s`YQP;FBxb6k+vct)}TgbfU00YQZ>xVa_ytzw6-QHUQVUP7>ccC6G#sJiB4FH)d&mGt!M1nH5)yM1=1sqoc;kug@x_D|#=8d$)5tLg0^aBmLed&+PE_ zesM!Z<0N@99V=sr1=%&|d%TXLwiN1cl;0=T<0U~VN68hKfPHE=t|!HQ`S}cPb2}Fo zHvyBg47vIUNj?RI?ZtlQ@RjJ<&IZHf%-RkIwpte7?BYu8>e%8wCrS2^r?t&sV_N7~_Zimf zj@Rr$3IzI1f`viVH7OivX)tmV)caJY=~zlsB9Nvhhum+8B-!0gu{ENAFX#nC)om1* z0n(`PqF7Q8;uy%-AE*2oLI}^U*s;ymJ3%}*yGZ-(yNzo{+b<`gCLJtTE1Kt|FNv(W zPd^mO@4yg*-S1Uhf^O(~*wB{4=|iocnV;fgSn9>$1`-55sp&C%jgvH4l;@~sb@#Xjy9D}M%NgD|VC0f_LH z=p7hhmXi_72+|DaK84ZG=P(4>yQ7Rq{W3BfEr)|)@rOv^4bhe8Pom2QO1YBbbaWL= zoemZPQW$DU2kiYMm*;$%H$1j9s)%+Djn1ucrZ629-9n-B&&Q-rn1*5#(ngm$cGEqB z+Rl6eyp{diY}YBd74^LpvDzro+mk||j;ltZMx?j6=0!hrXo+ify!)gKNRUv|BVyii zlcQKrM@=Mn=PIaoccRq)#N&=4LiD!q`f4 zYQG&4AAiB-S0x7ce`mUv{b#0o;O~60Kj0y-n)#>5Lx1B%{*H%!X1f25iCDlm=x1#7 zBL@1djz5+1|6!ni<5%@3FY*IC!@_r7WHx<73W`-x;;DnDvlAR}mKp{tZKi z4b~e!2~)|JiVtfP9{q*lT|_=rckK}{WF&*LEOd9*xs>(Qre0YS<;@q5I{IBHlKI2E za$0F>l6j;N2sGyM zVh8{*Gf%iHTO~lg3-KQU{U{2KByZ!|)cYHW&*G90&{iC!qPu^Up5OZT&!_ztkp2e< z^o!8^jDz68I0($Q%)rVH?rdf-8#aKM4fJ0*kvW;c;i|q@XJYG2!oUIm`$zr7iTodN z5ExEIIoCk|5fmQhy2;NNPS zxf~3stt?OpW+oywQ8s;6Kruw1L1pVxE=DKmU@U_`ojSz_A`V)O0(gAuD(7Iw~Tgxlg8BU|TU#%*k z7}6n#^!37vkPM-2C2WfA4j0?4SD;tv@OF9X9q_yI50K7`=JaH^8gn)j`fGFqo2%Zt ztgt>J8}qNM?Wp&Kv>2PY^D?-c+^0U7VCtKBT#pD$K-}{SH*m~`LMVRBL~>zRP9EXs zSFUwE?-R921#RMbR{?}|WR6-*;9WA zyK(dEnODnVh&SWy1-2ID6lS3F^xBvZ|t%&KRrq+|nYuJM(=}rX=VwwB`xx=h}!h zs;*LXRZ!ias!>z~i(@|->s{GM)W1@3f#F( z{%AX@)BN!zq0>RJ9o@?3uohO=BZ6ndo%suwil%ziuQpA<9M3i@W3kFmyi}odE1xHg#ctzru{-n`0DsHiVU1_%N!6#(pc4PrcJNw4XX%{O(GL`E za7Jw96d1jfXjW@wMX=er(twJy5NbE|fs+GnBl@1g54RALq#n{5Nkx?{9~x%#-akE6 z3?DU^FG^=ze05@Tgq;H1(rK^UGX6Ea4#QXX zCsg|u{H93mZDu2GZNl0YG#IyY_3vR`6>#Hm5W_`WK|u~?EaT}3HJw?PtYhY7_{qN2 z)K~071%;=|%9?!kT(oPuC>C*1&kEz$nT}aSHa=xchGwFy#O10tQ(B{-&P)a&QLg;D1us;Ps9Fy@2sI z<@}>F@1M#U^lug@Vt8%AVFQC)GhQ2UK^JE9XdprghCvYB1T^#dk&OrYX`&gsA0J55 zSin2Gb&K!5iKZVpaI%sOT;t{VtQgp-PH6s0S^-)OFA~!PX1>_1NLyL?NVId)HiJyI zf{*|h2|>*_%hF%fwVA(^kg0UQU=H6GRdvnf`hJ38*>_R|^aP$paI#~i?d+jG3oguh zsUh{2@}1VJ`?f1>UPvlKarf~2^uoEzFd;i}G^AW>Mr@jaUEhiu)28Q_NiS*A$a}gK z!wO4rG(yi~?E43VcvPQVM$jJ~q7#9WT38H*2Ml|7Zd@g#V&9$5$}zk+HoVSv->M6* zK5J@r4{b*An#t`TZ*#UD9o_R@ zZt+&OmCnNp+CMY*Gfdl{zY3Z~U6Z2Sm4k6(hoE4p*OYtbpe_hZ$R*X67m1*&pRUSqi z4)mqTr!gTz!#W{wJ&4*nQ%2?j+|NX;pJ1sB7@=6id>PSiwBn_GfdIcs+3IJ4h8Uk8 z|0TqS02U6=^?b1kzTA9!JOPU3_;oODFENaJnI4WHDD2c0O5xZs?uB5%TRQi!&waZt z@VX`v%+Ffo@Q141i_DH@5N9U`&A2yrZILcHGI)8hGeW+VXmrKgw*>{P?Y^cCGm@Xr zeA{BUH>#H(AOA>g)kCzTJ{bN|s0zQLqb7aaSc*kqIcI8aaXR|sRiD8t+oPd$T9FmF z*0*?baMpr)h6=?~h2+qjue${5M2gHfh2};3>0Gsq9pMyxz0)cp=kMKR%DpJ%_BdUd zt~5b4ZznuFIins{!!g?LZHaPkd2nTX!uwKp4&D}ysO#h|sSC#xMgi8!xiSFb{H>bI zaOB!}3(28Iwazsztv(-`y$+?uGp+=)3LBd@4I1+r@~Yc<7hIypW*n7DnB`$9TxHwR zwe2H~F3vtvh>a${P)QZ-r23NankBuLHv5Xo=_a5I{U~&>dT}4C9T^$O_8bueL{fmy zZC4~?yfIB=iZe&sO?}mtlAQT=8S(?HCE6)G1Z-zE&_I`s>U^MDDko=BJJGSVBR#R9 zk%T98+$DWz{!}6>MM-5Nt$T~4cgR7qO9)4xlzgs5sceuQGsNlf2~G17_J0^fe%x)K zV&QCULP9NTVdQA%WM}G3qGso4Ou|57;$~oDZ*8JyY-hv>e$$XJDLC30yBL``l2F?i z7|AP>sG2xBS=iZ<09Y77jI1Qu)Iu&6*2W|(0C6CIQ=5iF(Z#^g*@HwuL`)dGgTutl znFgLo*wMtm*$!O9_gcVZ{&o&7M8v=u+z1ga7G@S!W*~qC00#QZ08M6QD)0-OPu9-( zpR>UKHCVVgnwY{flK|P_!PAL94iXR>8+iMUDajvc;PC>iQokQ0wtu7n0Icj_$p5!A z@Ci5??oVm#?B91D{Vm^j;18Zy|1ItJv%jYS0BqnX%iq)fV?Gwne^nj}8}R$A~V+8`i)2siT4+sEp{HuIGW^m}%e^DOzv4Dr}@5f*5W9I`N{IDc*nfQ1D-2mGlHR<>X3U}gDLURc5L zYk#_yg^lz36!~v$W?=(?_j&!41_J!@oLPaK-}T<#u4M&+fIqj76}*`L^RoxCuzBSPj!Hs_j8+pAOPF1`Pjchm%q1< zosHv%dvkU)u&_39gy-P_qgo3O6Y%esgh|QH&Y6Ve4^%2?YidUVHlqCoQ6)u4v`BbN zIN6z5Sxf<(Aa)Y~C%Z9-!or_wKt=v27a_+p5?$Dz@#UV%xT@if!Arom71CzTasZ=X=ljPHX#a|M$FD zYpyotyclzh{u@t!dY^KVz#u39FaQJq03ZZ__uA+00s#O!Z~y=@0OFhG4;yPoBWp)p zB{y3m2W?tcD@%erkZ%+@fNx*d|DWT(@DmtMUbA1NM+my&ig&p_X7vYcke-DL3NPq5 z^-Cpz&sl}0h$W3|n7)409*beelqtR0#vZJD{CtWJRGIyGpHOZJG%1;nycpg_{Vg+1 z>eQ_F@~YFNN^M{MSc)Q_P*3vOl9~IJ{@v)Z_rZEG({NyPB&akG@}9ll zyrZJE@C!vz_v^+bsBEOj^m0$HKP)&KJ)%S4Of$K=b{w}_O5JfQ47EL})M22&@isOK zT!K$N;v!WlRDpNr^a^&}WEd5hQOFIG**gcQ<%rz9rEJaYd(qU1A=r!>`x~i!*zO`x zGaUDcpk@1-8E{#ulp$2A_z{QrZkc+O4$GdFSO;D|D@OJ4f$UCfQRnJ0ZhFP87s6av z5oXjA!o94_^$iKgD#4!zzWiDCmk6cyCkE8fTBb#|TI*joyuShix*`#{v9E~v%PQqQ z7PG^C*0bgR$=^mxhKk}n4SNvyz8kET#!ykc4;n6UXdHZL_%GBhuRS~_%J8Yq>m zIqWziSTu&lsNEQIA_<-9zQHP(Sr@13yznycnxoBv<6%8!usPKL>R@$x>dFLSmU`5-zPnoEqcsyS z=CiSb$wI*;=*?;ARAie9(f)9&VF(wzQSa%-xhfcUCkSqViuF8kB;?q)m+FWp*{UIL zDLcbX^=8aTr5{+N5Yu!3&EpYz!Pn%}XC9_-5^D%4l_GC4LZ8t;4Mk1K!I$K~M^+~E z&p_A6R1FEv^tdq{!c45zdB7_Dls0{K$(?pmne&?F63selFAB9O#!w#=YC(xUQDk%U zk|A7Wa{F<3pRX5@EnWzoBf<&e5BY$>;| z>j(!g@6%QI6dk$M|2LYA$^^?Dw{JG$(fyc4hH@_0qaGv+v3#zuqR~_qTW+~mTbtJGD&sJ2b-2R-n&}qxv=}HtBZYN$c7%aeTOb!FFv z1vp)qcUQuimu&v*T0I0cv!PylQbfbZ0t1)sc(zHN~+uVaa z`eZ<52@wz%k=w48&QLRj5y|#4e&V=2F;>_z#AoV(j36_|_nN*d^=Ipv?7 z=ZUJ?ZGD0N-dGu$ITI}flM6Pj zN5zE7W^iPGG@1EUpg4+=UbH5ftB+e4-V_RLla;Ui%_4=cy0L~LvRU#UdXV@8!d%;OTMup{9;|xKV1jraF)z8d=XR6diA%&%b zDY`i%lWL4pO`?`vY%dYlt5Q7j!5Cy>KDwsSVrJ=C{g#w&P^x5l={YPBH)R1O^l&P5 zBjMDlEH7ZGiF`*2!RRGm{7|{wu=pz|dh3w7cDVKqH5fw;$|ipNfRorJo?GX>Ld7WU zN5z~cQX4qd5jNrt!Yn6=>WAEXYvS|W(U_nRxV2(Y%yv!i9J4~+*$O(m7Rw^EDc?~t zr;i;5S$4)ZldQSeqcA2b9iZPQ^tqawEK0xj`HXNApGh(kpnr#*!5GVT`q~9CswIq_ z7;4OmOns7_S=IBUy(#wIu|eRYpLLyi>Rmxf`P?Fj=Cn9|GUyI#^|Bon_eBe3n_!?pR ziUflH8Rh>{LVt6e>8}<4wVWE{M*zRpzQ*mnAX^X+N^1=vU=QW(j@4TGnI52p z^7?4pu)Xc7+r_7fzqv=Cldue0tw-}6VPCpt(go|XdCnaC7n6JVkLvqTOp%ehvWxd!x8v7R4@xvsWJwCsT;qi+*~Tz$d{^{}~;wmfQsUNt%Q0?V`sQ;D}0+ zqEJg}ZL<%rjY1OJAHh-X?k}6b7x21w1-!MkQiiz;uoNWOf(1RjuLpmwLBa;)Z54?c zY6$vr+q%}ecJ~YLZZMe2B?z17!}d)KmZRCZ7Ac7rq_aoQ3!;qZSDxY7a#mO-@+mFA z9I=ZyL7@*&oO5U;2fJz%w?w1qMs!U`S`hUpAaB=DfK|%A1BZcDs@|^7o{oY$w5hyi zH~t~NJWp~=l&((fWO!#~N~d$&`p4yvVZbp!`Sm>PKmh=J00huqqUK*AU~6yW@MRY0 zIhxs6|F=N+N)CX&{DQ9={%arY3DUBC^e{nJVsF7zE@@5vH@Ssv1O>P;2od-(jhDe< z@f2|WA0BzIWld>Ba5GWf23_8UqB@mbT!NTox)6?JWit6{Vr$w}YjT zj>M(af{&1A%@i5-TS_eXtXcetZZ0cp@)cF~bSAh6MVoKcunk(D|B1;FAj%M#iJ4oB ziAIPi*KiQBgYZ$73ct%r(%%_ajh??g4;~|MD`04n7T|(wW*cG>g*FazKq14}t~M5< zwhEX;V;18LNsmELQ15=W6xk)|<4QkcdQT68-{n1~+~ESUX+o#hm=Sve&W-<(`uUHm zjpP{W4hRGQ7=`+03H>*5$5kY4*4Pm`>1saxrnO^9G-ac(@UI(6IffR$c5J;Moqv*P3RWvt{-~O`W?A{Ct&7x2X z^QcBNgl~S#L?1Vq?m>>D$A9=_BYgh)+)R6mA~jI{oNA5_1>hjANPc5NM{OCu zhp|u0+OPtC-Z5j-ai3K?d43bT{jTy!InxcGh&&5f%kPIM%6djCB@V`*#3laDW{tIr zVw4Vg8dG~%lIR(Q$l;MtGP2Y zl?z(inJ8|^{hx4->_D0I0s@#hYf_H++D@ot z{E4LE+*049me&q#k)G8<>Okgzwef5gH?K5k7>G zb0MI$Q0;b-gyULBtEkwjX6IpN0jGRnxAX&_gorUwGawgtRqrUPOz)flo*A!2h(me^ z+XSAQt%~Qbeiy@f89{p26*Ryif@LlV4`RrYqSG3wDe<@%7J3atX*@M$7p*hDX9|)> zf;9~(WkJnHw}j6I7o*p zwgoAl0GUO*a_}kYA)};RZ^FXs0cEMJkDTatWW_hJsug!hb{_O?dFOM8a&S<+rgQ_T zsikTe+}Vx3=2C3EPXTB)_(taHA+Xj;ZzB(?8J3NF_zH6W30Q{H`VPFVvZZvhmvX66 zYYNR8^`t=oxP`dq-}ZK~lN-vYqSmN^7)R=LqkRhK)K52Kzd#Sqppxo&P%|12Jr1WV zCoV&RxNq}GB=%gbv5(bK$Ss`oR&7)_Lir%NR#Mr08HI(d)wEpvG#<)Nx*G6_Q6E{X8UJOZZ|N=N0K^oMNp zGlg)JQc7Zqy$E9iIg<8Nmv<`5oCtz=N-vZYu5I5wiiv5y5|fj*x}{j;0jdoI@Jd=Z z*7uY!^k$Sluf$`1smyyr!gk{f(s7ls8JF5#ym=CRWi!PW3B?l zQ^4#X2EoaWhHnwFql464%MOpvVt1vxv>`li znvQOGxj^CSKJ-BDhDuaEXF@5KFC!n!6<;dD1r@Q_4crkgC$U&pco1_oFMLcGH&Lsm zN$!opOX|&4Q>E6+FHRgOsupaXx8N@x+|}u#0iQ!JaSp?ocI%%i-x><3p%jjU>Upvx z)S1v+Y8*I65yFN51#P!f&uwT=4g`_aDSK~6%H^Y2{v9hRQ_fgT!Gf$EwVwoK5>A-5 zifg_tI40yY-|2UOetqIqz7j%J8CndY3jx6k0p&(WVHmt8uxBgFO^wy{16d?g#&z2u zM~zot=mX zP6+6+70E79<2M5ro5O@VK}Ll(odre_9kCV5E=fs0d;Ml)h$^l4fi=NoVEV^{b}Bd(PSB-yjF z3QA{fbI|G!HX>}bl*it4aL~T(P>@!XY<#B2X2`_nmw5X3?3)O9-|X{iXB0&Gt8(){ zm`hT6ZZ=Mi|F^~TuOI(1n$*^;*F+G!=%#%LmXBat*mNR>fvSaph8W8Bflcj=5O*r~ zC2EmDhHV8lWKooB2IfG{R(V`#=36E^&eV4pSS zSFX!0gn*w^taMF~XkVGikLzW9wN=q-t%l0#>lljP-@P82%av2Ze^0PAn(jl)hEv6F zf7Z~p>4}_O`Y%4{128&X%Or2}{7sE0zw2SGR&4ctV}&QY^;Aa{iC?I>)=|e8E29qR zWO2OmAe^sQ`Pg(ByDV7ZifShBkVk{kTQ$>|iyV>CW!2=Vt+L`vFJ9?+E~{RE2&JDy zC%bma?WAcWn=Fit4u7_0(d}v*VAUmWR@1x#THMT~Dw}CZ--+SKU_hkeTaC^an8dSs zvDfn!S46rcF`@{>)OQ}1OQFXv3~-0En+uUUDqoGv^lwK`i{lGZ*H~^5Fws8r;%fN* zOl5N>j$YsHD?Uy}mYA$NJ00msCynUxJDR;283mLLk1riz&n*6)tk1P z`7JvXqcxxPlO01ET8L6dbd#1wgmGcHlAPn9Zpkc7YUtIyPV&Bz+CV17D*8=Nia`0E zYLC}A-%lTj@s#rsmRI!rl0Pfh$}ZPAyBC7nSh~}C=Y$KFps zjKNZI6Z)X|%bgRarHp9iFGUG2+1c+-mimfUa2@)=4oiej3uo}c8Yb_tv?fN1{K`vn z<-I%`IDMK@z~^Ra&+giN?h?)=5p6=xuX4xVql0_Xb57vg#|Qj#Yn$OKugOfC{0HX; z%8B)}n3)TwK(k zUg!UA|5XVfxAcKu+i5N1`?`ZyF%a)i|AkvPZ9<$`9#Lg|S+&TuxVjAcTL zTF!;HG3qI50hjwAaHg~AyCi2!g{KzZydswWP&YMLB_=%`4C<7uw-ZEQdLl&gTkCBv zhtv)Ox7cxQ=Vp_ve>~f33e?WHzgomU#I&m0f6kC_3)xReHae`lmExNX-W2h6h_L(Q z27ptGd7cgq8#5%J;SCK3UgD?qFvAI+bKv!T{$Nr=jj7kv=INp2ZpuX$VwPV$p>He2Rcp_7ZheeDZflzV4E*U4H^o|x!jr&n zAiW-1C{M&?f_f#1${V5l$$GYF)hJ^A?jC)wQ0&N&b}6NFeCNX#{Q0E>{+*ryU6g9_ zU-Xpua_;{VJ^$rns-9V|v7&tN{k$SD?ZOO2a>|u2uA#*NE0CryhVK@0tWZW`33I+c z1$xm~+q)MRQBYVXQ$K@)L-?ep2sgt9IpT-buC4te|mKZ)|pW z-CzN#wR(taBCT{AJABM~cs#qy_HkdBcxi3V@#u_Anw@!M;%r`0aAq1h31_h|^%>+^ zEVKDei$%2{x6WCZgP(9&<+e?2v2bBlL|RL=&NwM7D)Cl@N?Ii6 zstVMgb;;TXb)&8g$#`S!BC)1S;S6(WZSs#E3R9o61?QyyL9=4=r1STgV-?W8)d{P> z6`fBm_o#~kWtjK@y(TqXUP8@^JMw}|GvK3e=|)w5yXcJ@GM6CRV+u?zT6Yfh2E>K+ z53!JB5Do#~57LUOb8&vut-T%S-0C50HcScEIRD@UHN;+ z2wpBd;ZGe4_Mi!aPTdze`T)h|4fleCc?PV5py(opklW#JEt0M+OX=$+i&C@d8)Jp* zOXDz{?MWO3duOwdC4S)qex^ ze)XNilX(BdH1ZfCa^Vyk%7?moIzbgP@w~j?R@YRa(E2j}Cy)S^AV^JmKY<@65PgLI ze7L*>+R5G0qC(l&sO~7TMsy-YXzu75kmM=g9A;X zA;SE~@c6g`uF~PAGM3f1hO0$R#+;h4ODS=ehzs$h{&C6@1ngunkV0Zspa2+pGAde% zX&P-cC?7kL_4&Mgp5r4gp)E?y;#QoOw%M17+n$!(6Uu}f1y9(4pccabApL5-?v*o`2$YIsgr6#=qUPPS=y=pTkW0OF*^-d6mHRcJ9*V-VR0Asg0?w` zB(jC5(70@_A4dqDX!Yp?*Ykt!AAJs?YpqY#FGr2`Ee7fYC7IL&WQIL{0bGKF3%#&Ku_~>Ca%^E0Jx7iyF5VPhl-b7WXCoEH8T>Z+ z%&QRW{c_$~l~EbvwZh7T&U>RR%Iv0@FtIT1^-cx4?&O}xBCOIFnbN|R=aQZI`8GFq zSy3GpeqOXeAv!g4Z?ZD3{e2=sv&w7Am!4&S5Dr*pu)2 zw8Cd=ld<*nrG&^ z!G$!mD|mQX37Bnmuz!)QPGT8Slz8lb-Ap;;j7SpGlUG_^2pJ_%=_SyvD2Nawq(B(G zEP|v#fIs{oHke5ZN>cJxxVSF;pNP5Eaig{7?++w4XYx4lgUp#R5sp|1S9`t%gc1lL z@+iJ;5Rhv95&n)*^gD!lga`P8Ag1Gr7WvnMu0!4AL@$?l6I+imbLM$4)xb7f;eJwc z&S&z9qx+@}*gC6|ykk!a;|%+b+i;A0hACUd*e@uv-S}og8AL%V+Kj<1ZA?zMjRTQ( zKKYu``iuK#Dpy@>eFe(ZNvB0fOX_AA zE9$f=)+B5cz%xq(Yoo>KhZy)H415U^#^V6#NOh(#KW8R?O?ov4cjUHXZ$v&*C9 zrIeO|3yOX#8el;mWjlgL+Yh4=iW|73#*3x{Y~L>le{J6{y(j};4aBhv`{;_e`v`37 z?g~4MNXOMZ2Epsz#zXbjbz@Jiu*-W-YX-Y41fuObK%2gGbL%!>`|pXN0@bk2h1boh zREOcl(1{;y-%%Nrsluf~H4~wDXCwm0F(c`31h7aD{y_7BNAQCPO3=d$bKg&#!fThJ zj5elem@Jr=se#3M)*9BbRa7scKK7U!7Sg$~uF^x={z8J<1sqZu`Ga9M@0hK^N%Ym0nRZ`-W>i^f3Wa9ZZK1&$knTZGLqap0N)wgDqDrh5O& zlDp54NEv;}wMB?$IqQ9;YU>lCpjKwEfK!$um=pYd$Q*7N2&tUxfRDa0tHS-9W+12{06<RdvN&{f}n8Va_kb7N*q--dxm|G2G zlV$NgKMv-Ge7w6)^wUr1swmHz*v!epdI1C6-#AlHVge8CvcOOZP>_*CJ@NMXO^f~a z9WIW0_8R6IuL90jXFuQ}-sO3lG`hufYrgfL*fusS7daQl7KZ9JCwgW%(KV}(G`{~H zaxP)&#gTd1^iP_j&bkRf(gKZp`<^zZ^C!*t){JXR;xf_AU;E)Raqkq?oKs z-04$O*PIPFCnHae9N4zHw8BK1%a9fi{3-!$v#O%eHmeI=3;Veva zx}WvsGZ!${FC3>cCe27KtWRE2*rUKWL>tf+{NDW-P+l?nd`t1Vts?|7^q??qdtpGS z1@N9rOn%hqLRiy3S7x+;j?i$YmmzFS(;Vo`upl!Sds9*nX64MwdqZernNWuT`ba=2 z>(Ct;V&xU7|E`Dtr4+QA9Wrv4FOX$c!a{TixN#AXH+6Ex1xTQ|Z zTx~`sca2CZ*`5hnYQ|qArbfeMY^4-M^>8@X0y8mhZGf*Px@FIsWlr0-%d2P?1djt} zeG%}%NJ9PaDX$R&5lG|{fTCwW0ukcayQjqccj!=kbm*MelQs8jYAk1B9?mg$<^Hv(Pu^ACBEkk{;52roXuFxpJR5+6FoH;a0S@gq4oGms7jW zG!`n~!B)Fmhu}TBwwCo@!gU1W)>+f+o0~+tf=4gh;sr;~(RRwVZ9*^5I)q-e(tgXu zmm~ct1-SWzfB>O*2nI2j@*cg)QsJK93<)z0fAfKG<%3eq7tS_8`YF-!r?AtB2c4`6 z9kBllQv>n>Fwq0+rN1GR1crk2`sh=oywJSbx*2~Z39c=CA)#NHjc~;r^^7T?|EBKC zgb>UNrsFG?qCZv0`^N60mjLxcoh3v0$f75D>4kWgHM}A>R(#^_QDf*9feV3Scx_f3 z^e4Z~SiIJL*B06CQ%vNzp@DXB^Ov|h?2>CW;w{8;^5QqcD*b_H;H!^QrXzycYn>o? z|K_ME!Ek#qoGssiKKpmiC076Sh&YV0xFH~5voK7E(rh3x%J6vK zY2TowwecK6D`m&FOWJI{_xCS}`N`dLsh{?oJ*?$4m;M`hC?SU=!cQUyC}S2N6!FLR z8E;S=Mo5vyJ(BAyMG@XoJ}gFbB!98A_v+7~uocJPXY66NH^i<4^Ul3f zwW8VFf4>=wDPRyS=!bboOUXZ36guMlB;|TT|EF|U&>DzCzh2-jG~fKBu~oM<&~lgmge=w?JYR1}F(TJa0Jq==ybX zC-&`eLpV$QtiXDT1)R}1!aXb z{ZLOs>gD+%<@rEARwR@QgP<1#30*S7hPU!jH_;&i%Z`yeg*E zdy%nxT!Z|=E`xhVwV$nxC68rHmrY!zwnrpZ_5HJJ2IuUSt37$jnU}J>;6V1J_y`Ck zXar4?zGukbAP~^_H{Cx{yk_bN*TPTxuWvQEkD=={GY-v^lBHWrw}gx~!wsfW@{r@Q zWULNM@c8#RFo3omDQmRp0ONNc+gXyS_mJ6o_k~*kqdQv`9VrhVk0EfPw9}dhUKSO3 zsyyauTpLwlPR55u4Y;&fkNM~`ytF~%WETbMn!Z5#bv+Tnyrq#K*1&`no^S+W3CzwB zBXI4DMs#aT-P4oeQ}YJ2OCxD68@l@bb)}b~6#4IA^>XC?1pxe`jj{{Bg6qVBhVUVE4AL>i@CB;lz%og>(=yV8 z8qYOQ6bA?`AqI&32uKz*yA$rNR_6Rwf-jpt1cnhvk32VWG+~e(y&XA~f7#EpVz8nn zB&ks1rWkjhfNf64L{7T?wuYBEm4Ze;G0|xbP{CW0KQtZ|KX7IK^DcRmL#X`S(e@6i z5L^hGUyx(gKs0x?S)N5HI*hFZj%4r`Ly6qF$buXX)k=;aDK_$8{?Ccwvl^`O;6lxs zZ;%Fk26`+i@MEks5Rk^K=e2(g9B9^LY|lho{8~`ssaWndAHPYs@crw&9(0Vt2gwMl z+`?ucV5Hj}k!Abzx3{avVyp#{{oQ_qR8YiuqHsA*M^eI#r1U5f*d|PyZ#gpJAFb4% z29!X#O7>*6M|URDqiJ_WDKsw$>xE;YMTSCF=6BfOpN$C-sRT-q-m5L2<7HpSU+I2T zO(mCC?^j8xh_?jETRC_|lua_@!K>i|y8?z8RoPaVWlBt_lg>S5UqYJ}jtccvn{IoRw$Zj0OKm)JxZb)_D~4UwVLW;imBAif8KPmH`wqL28kaHiIe? zPGom=hOJe#uDT2V+8{sX@?Z8O#K$xXr@m}=@(l9YSKJn7SFHBy2d~Nj`5BcG1F{Ae zs2ddhQM+3seMcfTrQ&4YU=AC|rfkUKc4j25rZr&a!C!rJZg;N+?m@um zM@TecIz~TQLZJ-!n*AP~l6Bll=iUT&&ZaWtHQ|Gw2{DA{2r!tH42aPbU9+&}RoUT= zOJ@SFkUd|Lxk-+DR-v7~m)b!w8w5ICf^Asg5%{d~Ko2zlP6b*LrG&A^>D#`TZpYZn z5qbNFexnH&$LC~mifAEbfzYH@Nz?iPP)r;MKfA=~wB5I*z44u>-x5rbMGbO`krT9A zogeRG&DEc8zUTV1eYy#KRp~0#xJynLw*k-zOh5#)J3rCrp}vJd-e@u0)l@es3fOCM zl{sWMm)&xgmNT+^?g_RfPjSv4u_SHGZC^EnM}Tnpz3Pr6Y|n zX(yr?vpF&ez4E@)&-Jgn1JUBH<0R z6<8H?G|-IYV@~{TF|BHZ4GBB8O)#)q&5NUbNzMY2YKt~sd3HZtA$xYFj8q5q-SlQQ zX)D|SoU$tI)j#8nG&5-0>Wxd1uYIULVy$4qnn|nMRH!fVG0vOIzl_s4x}a9>qao{R z>gyRe=*|Wgi3jK*%&<(;Kemexd4U~PS34`13I|>@grMOZ-O-xo&=Ef^{bd$n4@=qgP9Wyuc(TgDQo}|#H|1mF3Az_b2EYeOvPAD0QzHV-TLk&d{}}ZAlz}MQD;zYQQlyNCOWu644!b!inJ=B3V;xt; zefop9*EGOW9^O1Zs*yfi$43eS$+x7XvnEd%pOyHxdE%n-&4@xK>8OPI)t{VzhVf_H z{GR_NlZ*YoWb!B2X1d?hZ=^+|3Fz9hQzRL}>I7h&ti22)j@~m8k^X2xxNiKwTcmmGA~y)CVhbN&foN6 z7JpiITMvxI1IghQcNNC&j$MpCfg2KYlo2X=a5)$cdx%=Rj{t7(xM~6hYZfif!`kKf z@u6C`)9d{ev^5;_uy{qwi7EYeJc%9uEQLS}%n#=99}UKS(J5E*X=J`d$rhLQDZGbp z5ZObSov+k}U-I%HY$KExT!-#r*uN7Yz?wdnSz#ZgV$dspF1R-7%GJk?9>;9Fi-#po z=gwYAuQkc8!DiO%?!@_ezeSH6nTp=YRh znv|Eu&3=AwDz6;RaWIrKGFIr<{;>PP1tLs+91c+;?st#Njf;NarI;^`7nxsa^s9ME z`iHTV&zoG{a1+_cOIqWPsintI*~hgzT^~25s-mXOpT&A~G{ZBp-;r7rci7kZ9{jn%W>1^yr#sBU*~=qu^-QQ4{)FBdmct>%|Y*iMY$H_jxB;@hpVBw`fl zeV;1J)$G?}26J>b%vD5v3rrvppQZR=mev;Ht{1k;9fB|txBl=(pQC5ncK^+swOnL} zdO8^oL#F6Pzl2v>g%4m7wwv0^6`iWu7}X}M*ciZeYQx{VT1f@tdTk6AQNOv4TmvD5 zH`lDKJL8Qr?yd}0c=`3AdyNN(Ll9jeZcbkY`{gSiFn!E z806!JKv+v#KA0H-hluef9qU#|B@P%Q(yP4nAM!-a9sRJ53VzxFps;lei5x;Sdw1?sKdx&6^i(XW#*^e3Uyz34an$C?%jU z81W|c_h*)ctz(UI`~qH>-MxBu>S1_1;vC+f48Yoir4->cvVurQ9lmwJ*vS#lMU62- zo8b)3Y^0>36!IuNt)JXpobh#ey}n#QOQCn9&^4U2ZqlrZ&!y~AOCb7EB981Kkdng6 zVg3m)G)pk_&TU|F->-G<{=nJ`So(|zZXQc=hHK)z6uaLU-{#IDnPLR z9l~lCe-$9!|0;;OcBzNs$Cc!W=hDFe&$6n`g3FO`E|yh`H=I>KOfRkC70WWlAsGzW z8IW5wz13Fj_Yv!4<$F+ec-NOnSd6rFnx5`KdK$@6>zGLE%&QK?!=uAYhc1LSOwQGn zKHu!8J;k$;^L^g8@|=#nF?U#_^~T{i`6S@U9tt*y&Y5LTxFtSTrzI`jcB#)Pm&O!t zEHGcq%Eq-(6%RLUm?fe;7~*Wu>0b&rIOb92!-l*@c~BQ!TB#H^4FOwp8Ir6P+wSqqPH zKwTKqZF_9zIlG^B8LOY9vKMAikSf~4Czi@yl*E;44$@7f=h2vGmB2j+Q!C#KMY+^? zmsw!xL{eeZ8edece}2VXw#+)`mz{tu!e&!ehmCK`hGRU@Ldn}t(xBjpp3_Oeq-ouC zy-j66;e;gi9f3gLA|a3pfyd}&7QhQfaJHE@J;pP_U0Quh!j2Yr%BoV1b&}p1?=PG8QLtvrc9W1n!Z3|2q}%a@VrlyvtZs0;&ZCeImkp(JoiX2zX;hAuir$)e#Ia> zhb0nRY7*@)N&t57AW_ka*Daq(zNH|QIRZ2wB@rOU^>1ZCzN?|EWhiu$ni^%^yDJ($h@6IQEP=jY*N=ksG;bq_(8BK~2mrKT%#d7X z5V)#@qdl9$a;#^<6<|a?-j|BTI4ot+-pAZVG?C}xIfM5TKEA=po+4}v5w(W005ErP z)$0EGj>A>+K(+udIzH;b@&{e=Rsao8uLXY%%zCK-$K-awa{-)r?ke5alMk%I-8^CC zie^Z2w&a1EuJSrwuC*uK7Ux@(Z%OIke+s=~(j5xBuoG^|4yOr|KOqD&#sOo5uK))` zmly0eb$mBt9i#BhHDdO)OZbxuU6b8U@c0JuCl=jzIoM9j3cf|=_AOIqp*qyt_0Wt% zQBgDU(cSz^v}rH$;TXFEUl9T~^kZ_@T-nT}%q37bbL_BGkjMN+rW5K|9=lP%ioH|a zL$u6p$sS`XGp$WITa*_cDUdVbO2%fnY=;=XKTBqhzBd@EgRmf^jQ0+tx6+y(X|$uP z{HH9zx;bXhG;ym1ub*vsbwoheg{?fEId9OkQ#*OsZI@HY(1Oa){31K*n~W7HT|-k4 zj5|UbBm@x`Sm+)B0yqT#g(zuz+L-nQ-rR!rQdxz)wXWUUj}W}Mt#%bX%CtbW&g=H>}Hmvp@;X+f2U%1vX7 zQ!XQhQb;ji$vF;rI&bM&eYJ3OSM$;{Y(>j}b&+{=INjMnr(`3K0%Cny4}di8D_VGz z#|{C2)F+2CU?XX|dvi_?wZ8spcWj84G@))jQa)iwdaYIP5IMc88*X{9me;n1yzG?g zF+kH#7s2=$QLu=y+6_+tngR-Gq!-iA?C#z3%9w1?q@eH&ej6XgkU4P1n)qxz;8BT=t zEfofsm zaSj$Ny27M9fKT;#%wVNMdhJQlDo%p!Nle!~kpcV|E6<)SyF>Ql3+ew3`%*x~n)}xX z`2P>sbNmbTD_=Pr%3r;MUpbt}E>SGAK6rj5#Wsn^g{Lo(9k*bk@~+e%?6>{q)v1x> zgn|O~b`oS0oIgfFc9%T62OQie54Q`gRF#RxFL|Z1R)2aMY2^Q6{ZjE`TR8~*+NqJo zk=e@p?tCX=$NTB|lCDk@xmRj-G24WK22}o~?5v^(p^?WfyH^u}@@kithAF6_f6%OGUI-Y?A5T} z*zae@ytPRxtd7QOo0d0^S<9A)TgVqu@V3r)W#w34F3mX1i4Mxc3Tp0ok*6AbM!TX#o(g*^aFDvUM^T)*r*`K=>$)ZcV|Z%OhT%l|fD>ugmt9nwdEh~5oT4}gSvv}5!oL4`-PBA4HIv zSYMo6Qpd}a^}zaKo9iB<$4-^VBoWhGt%R>oaA1%ifidubU>Bl*A6KkgxY2S`lQ)@I zd{#7~(J7CeJn|CcE{$xJJILaUfT!Q)ie=c}r^yWm$$=p&YJJT-93tA}ilEpr3J>Dw z0>m;3aeM(_?03YC2Fz0s=X8Mzg*h z34H8vA6sCW@XDh!|NLbVb6zBc^A4hn7#A;|*)1X7FgXdKJkP)o!g)sh*q-3VCrFUv zC)_0rD+%w&-VRyyvFuwTqB+Xv$irV5h&`LJ%jK(yGyuyj&hshbz*6PNJ#tc{iT1+DUk26#F(D`-0Ry^&=tg;_CR#qgdt=W0a2Uv?riw*bIz7L3 zri2Y_E;M>bgprJ0#0DK@+U4ITXitpC>b_yK_d(K}W!4yOv%kwKUH^^#GuaMIFv`Gp zPl!?)7aedTzb^vxi-Jg&uDRtLtmC~yii^c5e!tUh{uyrsH`$z1-b)>=rDl`5{HYn@ zDf-)xBGx6qpHJmoyo2nuqTRi0qgO1Kp7>x z>9@QP5??zyu$Vg%h|(!a6YTU8mcmA?joi!IgS)OSujjWd#PtEKqN{|tiuA>jO#a$n z!6Iky5_1B?;-5)>@Wi;K#4u{qLkuc2(c;=xy1khXaJyl9q=VRR& z0>%fBCH;k({1@7FPj43*&vl9~))HsLj2<7S9UC>0e;l(4CG&c9^S*v%+W!vjxZA)L z^RJ3^z*pNM(SK_CrvIDVs{g%^^VKKxm1)P#6x4hK0hu9>pIrX+Zq%s_%Ecs`p!E;`SlG_cb%_e{?ERR!n9Nef5cb?QHa*KWW%X*A`T zAggyrsX$%R>}KS{-%TsxAqoT8ZwqY2N+}t?>*&FMf%Luep4F_z>3A(phF~clt)N*CTdh% z(SjbCFIsw|Z{)QhxId*&1k#TRnqfDlEPgdF&Q(u{$X0NzRTojFTP5eI5E~9GXQco( zWq4>B!DKL=Yf`RM?-rhU>Yk}OL|4;b)O0bG!_mh-3{_0(HubcX-cQJBRzc`}ZU!JZ`ePJwcU0JKk z@icb>0U$J>baD&Up$)S=I`^CE?kUI;RwrTBb;5llF!$nzl|LHlHbT*@;P-~dpi0QU z3f3~+TV+6ddHNi>jmkiW*G#0q13KsahzYLp0jB>~dtVt))z+=O=@O*7yIZj;M;Nn53lE3@BQwt_r4R>X6?P#dYE&}Tyu=^j2O~D zu2#Pk!q98VHd~-TDExdUS=Hr**s*8B?5vwUe?tt&_d-zTP&9dj%dskzmtR?6rQX(g zk%c&Zvbn$XQHzEvY+pm|pxK{I{Sdw^Y&g)n_|Q%%cm=JIUpb-1oJi%VIq6dq+W61% zU(2aU717A0k2KzI@Qp2#jMsuuR7A%6(@Tn{5c4Ozrp%}%xOl-MyYpr9O_`70Hop*Q zvHCMZc3hwE(Zu+Jvh*x?#jRY9Q@Iol`euqPmAzlgu~br?ushPq2CeD9HMw)W1j9bbt=I9rb`|eRBT8nEq%+r;Kxoay zam{r&&ZLz<;THy1^!>)^gcKU|rUSs;3iKuvXwJ)iEmQ`mk(NMM z&qm&~o1gLpT}E)GrU6GPL&RSgss8j&xz`hj5mQOVL^_r?qCuo|ec|#{AuUx2w92VZ zcJu{Yl$_Zgk>M#sr558EYjyc($Duy?t|th<-95&*%B^)0LQtBbxA^vlq97jbYEU$w z-V&bLdZ2kvy`sFVOXnTO^=bUZb)Q_k@r6>I68bc7s`k*ej@gpMHKt_C?0apj#h~s| zw`UMd;}R49jOzGY=T247I<~50E_-=|d2Q8F3LEM0z80t|2o;y#fc-|mro{hY@>0JT zs4CFuHu2t$YTP1H7Y}L7e@+)?=~_`oN5bHI06CWz;j5?g-M*&$03%RY^o54lf^Uc# zhF)37^su%#(Mj?AHT{*6H+|??(R@R7p@K$o@$}G%9x_Y#?vQi}*y(_4QrgZ`~|DdH-yfO@YSv4M;<&>J~ z;=5hzr$iBIZd`&R(YaM&8%~&Ns=Vix06aTV<;*XO%K7h~ zjXzZ-<*#+AC|Es&+zf{|npZ9y96@g(p;g{?f5cbZ+|tk-tr=upn8Y_yNY0m)aPa7& zl^{KYDMWQkPh>2@O%OYWHX~eng6#R>0SIy5_NnH_mG?LEzHFX7y7QiSqm#p6i6))n zc~lZu!6?llri(e0%O8YU3HfBxKM4o$50)swU=|i4sW~>pE}tqpOV+6wz=sB#N7hX_ z7C+;KLU}!m1038SPilES8s2PJ65kM1RwP=eO>M3$nm4-2##kXa>c=4?xGRLEhaN_T zgMs3O4hVl95bwz9$(vK}i?sH(wudQ5raJfIUL}gTYLL5P882$2_CGb7Yvu){@XEKf zBp7BuS%R+9ihz({=19Q$tdL4}gy`WP^g!YAffE@!>sirPq@LkDN^W-68OKZ7bnkjrBcFrA|FEw zGGZM?F$xTPFt(AEYhzs=NXSj%<~_5rhe8iudG@&lqjI16xF!Us@o3Uyrz1+~r6v8O zxf*t8iC@N9IeOTsIuP%A>t-xInt)ElCe=c|PU%LHsh@U>&v6Z0YW?d%OtQ?8a}>A$ zdj~Wur2c&&W@YVQXs`GizteAw2=|}-z!4EqVFt$ZDBxV^bGu2nXFO31vUZ$8Z$wV^ zV;zh6)V@>;S~5~=ZDFZC!2krjQ>n|7jNLsh*)3mxePXy0D*>VlRAP8^zVQ7b3_02` z-(=(re;nqW#*MsPsAtc%ki(g(3Q_govc$cf1Y8GJ>8CO)?4A^ScxI*s8J)`C05aHU z%9i_yC0&DYf=`w5svOd>+3*`2_o?T}*SK%4Vo^{Ok7Sv2AR3v|RfjLRFHEZ&LECxG zOm4^gq6i6a;o|%UwOTPRpRl~CbJqT;E@)yT>aZF3&3C30y5A*pM~?D`U*ZpZDZhIs z-V5geZAyt>Agd!%d%NffNZ9Hu|x<^XkN!d{@e z^Zt`hr9Bhq;KnEDJ&O{Z$(U!mb|ac5U7BGoHj$$8Jm#2oVca>>k64KY5c}dKFh*ZB z#1yC?4dS^gY!}YvpI8cTv%K#!6Q|Jdt8XQ_)_+}UAAr!#Lwp!DV`8N>*?Ju>4yZxsB^HR7|vHYKx z!kw=8-%JYIjZr$aK%c~yKy%FR+Vt=21o!iV{SW7N!(#DsDcKc9#MZLv+xC9mY}3&^ z6M2+bG-M5G*x4%EPvq)7XR}tO&hNcHS40nkirOsdh4&m^wpMI>(^Fxt&XL6M4R1au zUL)!c>V<8^cRhDzdACnw$@q~GB_*txcVglF*Q+{v&eaaN(6+Q~B7D~dCOb^QF1MC1eD$4ife zw#bvdNwXH@2QUs@iAw0ViN(=YHN`mxE6^P7J|>H|%lLHa(Il7O>%;WeRuh!zg`D=d z(Oz%eGw2r$WjIKWooSS2@yavid%-Txo#2bZ_8t+(M&VYIzT?!DI@*NUPM1K$C9BCV zTwdrfWw(hd?xk#`K1|Al=zO*AYxq3l0L$1%*2TH)PKz1;fjo zEaOABYh-pa!CzaXEmC>SoLuC30D{9dgIj&+O=w>Q*d95rUeD+l<`>Rvd*Hd##BoaB zLdM&^W8akdwn@5s;YW&aE#c01U_55Ux|`Qx$_$s*yfF&kc)k40u1qSLIrswUdgR7blAc$=aYB!DO^DJ%+oDd_S1hafJrF#PUQRlS!SyO2 zz-;yBKVt`782b2zj&w+>#K4*rHet9u!^30xogRZ{{pzfhgM|3VGlA{vuU!d6>bTib zgMnNr@{rFuJFLtkJS?Qh}UhcYHf$UDmFY(Q-z^mvO|ByTTz! z*yi?Uuw%v`(95wLh7%v#zMhetV+{c~Y1D>LX(&|6NY4aB8D8+3@_l-bwdKBHJV@E2 zg>`F5Nr4kgMZ!&^*AH7+Ri6`CQldXPX<*J{W}Z@6qBp7>V}YSqdlg$TbFAS76yiTG zHU1*rzg=P4Xe)$OzNaoJO_P~tekFNHxlkKQqTV;tO z-`-}sLv>xd>Pe5yd#J7yKMI(StgIR#zXDjA%xN;(44;u#VVk~PTUg$+U6&|r1i_)G z=$T1QN$IULNZQKGFV*&RoZI)V*D#t*QgKvYCBbW9aSYwCjm*CA$i8(#!744C@Lhu$ z2u=wjpJ>x8S#_p)Pq#A#?= z_+g%&gh^tQw|?c4T6N^IZuMScp_AEblgthB@q>>wz&D7kHJTAm8;azsci}floQw3R zr?;jaTBFpyRgIlmQ_5L5u=P}WDUDcQ&Z*(+nFDw-QduzPQ3B})75=e_2xnoiFsIqq zm30_Vt~vfQn8b>+&>I}R=A7;~+HV&_F_ut1`RzgYEl8~uVz1#d^lZi1M+b+Pt6;sk z$m~Tvi0!sZA2X!m+ErHK8odo99>~)b34s=aWb)MeN^}^~+hJwGDX*h@Rpo&_(^Y)u#B#B0NB)9Cf+I9~Tj9x0vlN7T9bs zofU@B5{xkXb=`o}rXuzC>00jQuMlDyn`xKl)Cb@IGJ2nM>X%G>VyEmfg07Hv$g*41 zTa6UpYtg-ttuUGv8)2VXC>o4tEk;Tp)sXp#pz6L+z}a8y4=_}EL*QC5zN(Y0!h;S= zSsQ@HR*d&%v|uC~H<)!U@+{R;`%zx&RKYxsi zUB5ES3d-FEX*=J>2ty8;!FPmbj_Wq<>UtjUBk7+#cEcd=qxoj`b*GO`Fr$+!|D(6N z7dZ}>HEzmCX#_B%den$p6vRtQ8mMxwKidti5X)AFl({;+64{z=q;n6%Y0z zq1%N=6!e!D{OyveZ05(ocBTBuDi)7oqxrrR(Z1GsPdL_Jd()b^To^Y-hWzA(vG^s| zzZ_e>mgXPF|3QB79V*GWcGvQ`PnO(iLU=j2Z; z&`i5|A(U8$Dzk0b7^-be{KuimO)Op^z+}A4>S_x!Y(nvs3D5lKwt<2uM67j0nOa7D zGf?<)Sr^g#Q~?~z_<}q%7>-$BvaMszTA{pi}HN9FTLbr`el(ad5m4Gkag^Nn4z+WqCrD7JoZVqfvgjIU8uLKEENt z!&Fg(?e9q>i%7hufpAf}#@CX5+uCmA-0lS5XtTRw#_5S@cOoJjhHNH^5Tk??5pVQ(t2p$7pZxhc+-^blr`%z6qc1ajpz-Ia zy$RCd2KD&x@T;zo1RS*+E_=Ddlg!z62Vwf#+fxj;H*>(33xrc8twxf%q3wzMP_57B z7EtZm=JgHygZ>ReI@HV2>sqSrGvpcc>%+rNh{L5$niU^szHw> z-iU;c;$jjnBVx>T`AuUpux6)l6+9E%MMt;h1$LKtK6Gly$Bg@cso1cdwm00d>Sj;kD6HJi zaj^~ZaM)UI#*L=Qiwa}b9me@vk>_>7?lh1qB+K)z>N_jwS89w7O+pzA0N~ zd+N5%_Vf(P!`0^9K%+!X^33LzekA)-`WB0MO4k9J3#tB!#3r=)4FxF$2?t2eUh&(j zBLXqL$(XKdC@??0zE;!{0O^dAw z2Q+|aUfrv5xAX8@_+NEx6Zs*5K)$ z6(N<9d>d}{(Xd~a2)%hWWwZ@NB~-t<$lZgZ)o_M))D?-s)soHY@{91bkA3aO1wY>* zXydD$872LvR>dD7XX~IuOV_A(foE0viiY1T(yyD6O-gX4AhUvK99+M?>tPx{|%QT5+nTHZgu{Cn9~pxZA|~<1yn0{l~*6`jC(9Kx*_ykc&-=+%cal z>+nPjcIkAp0qH)dUGVp}}3%~+ZVhW(bq zAEZtru+@}MpQ5+IBjQ9?^S&NFBa5&){2IO+&`#ORahfucOF*I8ul6DR5jF~xVP(sR(SVMT7MD24{z>z_g7u;I6f`oelbv%F6pES>F+z314$8fmy7~(3l!dy zgp%pEW~7L=O1IfAkX7K4C%xs(NNJ9AZNWJJxn@$eh*B!3*h z4OeX~WJD`L34=jK6s)4%?sh2(KUB8=oH8-WZ=opOh?sx)kZ1XWEAeFaTQ#Bs*zKv7qZ(@rA97Qt*eVDnzQJlXoR$Q z`HyF%TSjY;Klv@ek!0=-rl=gj9H^EHP4{SAY)j&`A}KFWAD6Icx3=`KX@~7sI1PgD z4P`SII@vmR9?Ec(F;e>w#)Gf9^aaMCiS1 zx#+BBqqE-g_IeK1Ha#7Gbe2lDsdokGsH#hfo9l>CGMaTBj=<4;Auv8cDGt?*t*1dw zT44K)SaoicDASWq1-Mg$zI>WX3OHdAy;hgA$-BTRF<~cApKr}wl`Dnylf>(5*sOAJxBtGRRqK`)@_Z&JVm$|6}=49g55QFEtg+T07 zV;u0XqnO{-f>+td!%8_f3w4Z&=MB~h)c9AW>R6-KL_hw>{GKz*U-SSwnuMp2`LMjF z$gnTmIUoACyc0&lwt{CiYx!J-C+-*u*GnV!J^2`UNFUy;OwAW61xtDa^&z&g=Lz8^ zyo%x+pU28?Jv$@6-P&6yDj9#4U`X0YyRcTC*zsXJR78Xva8y#q=Pj zvNO(xe*@ZK2lqL#QlkB2d4o$_m85og{gW#n*Fj0go@K`q(a^0`U(&-U%4eR@;N@(` z&x>M#QGTA;b!cbJCeiWqdV#=K)`Jw(Lz>neSP#xrP-0;OHS zU_!}RlX^{vvw}h)pS>ZY+I-?eL{R(0cvY#0Q9%QA{K*uaf^wjCHTb0CAgI}kjG2?H zTn{OGL*EeyyaV&obAbg#`D@s;Rc-$$dU}=W>oOaHo)Ys9Yx5~F`wr7k7;=EUc?29~ zI%A~|Z-s-lXWl7~6A4W{b~peb@kANN_2|XfZPHru+M*iyER>~i{VE(%bOpuYkclwm zATr&=ql1p`MTE;C4542zB;_m!<*B0MLK+|{-^6E`PM|fd`-pxOJVHnmEM^A)r1UKi zvz8kHw_34-(IxdI5~@7Dm8Mz2i) zK%1(&Yt(^%zb75w0lfS7zhLPg_lW7Be_Ra$NC*4l91sD#8gRP{;E*%1cCfZLv9=*( zp=She2ua9*e@6$VyK}O;Q^aw+keP5mCHSTfOv27rA+Osu01`AH0{DMGhykETAYe!! zw_V>=Ss)M~cj@jn;0p*S7&rtZ6f_Jh9Pok~L;xrV7#Jux7zD)ke*@wP{2l;~1c6M% zBnXKjuM0(Ni^}{mG6R}KsG=QBVdQ|6MbFL`1{NIy6APP+oPv^yn)L}AI|nD1u!yMG zQ*jAN#pg=ODynMg`UZwZ#wMm__709t&MvNQey{ukUIzvRM@7fP#>FQjCS_)2=j7() z7Zg@jRoB$k)i*SDbauV(?&LiAFmR~v=T>=9I1%m(s1A~Bs047Li z$nOan7Wyv1{+=G)C4}$k@t^4y2m%7c00#$$0{$Yx!N4K@x6|!BuvsGB&H^3*gA0Np zfgu6-0oUI$gDC<39|zd&@c#nF$o~Sy=s#gxY;=7_Ipqg@Gi@CCrsfp1crDx!uRfSa zSvWlZCE8d{YZ21&>>RPN2%o2pq#*rqMt<2x1_-ZV0?a4xUh?Z7;+C7<0?_t(Wb#aq zc3;8@HO{r?YYePLR$r${)zi*E(ZLy0JlU&#SH1rlNQH0;vQ(nWgO$IvB2;_GBxSv` z$&j=-legEkzNr(n>Pp4=N^IyUH?$te$$PY;4~2!?{f}$ig7iAasP}DdhzOY(%z!kEgq+$1UKB^J`uYAH_jgVDvJ65kgJT z7ca6&hb%{k!kMl^HBHQwIoPUQfDJnf8{aX?peKj`1giW`4}#mVzZZB}$~#knm+bs_ z9{d@b>PE$lcngX7R!NK9nuEDoon*OLCX8ZyBbGFjykHQ#MPFvK3e1$Td0$=T7TCnq z#`V8YGvJm-bu^+##~TEA9J?PtN~O&TKl?g?kRS0SF3HWcQT)xdRhc#JS=?09@yp7g zEtB9Cew&TpC5N(^v1Pj4*V*5Qnh)`lDLQ!{tG`x$ZCKo?nzS$pEWYGyhYGVRh<*xj zbw4|gX=v~V^_C;;(9h5r!X#gtWTr`?6qc9NghT?w$X*h9_(VnzA+Y#8C;qy9aI~*- z(>F$+JI*#gGu_AAOnV?|>#>hZxjSw+T%?1SR|?Qe$3@7w;@_&f1;90{ExI`NmN@e2 zcb&hW7%KyZ6yLS-uEBU-t)@r&C^(9^*oS#fbC+;&A`Rvn*VjSAm5-<%&kvO=GCpl5 zwfY-pPpi&qe0pkVa;B*HAy-Z7LuGNOZ5$yHfdc}wC-eCVMMn$oM)2`_E)ToeCen(F zEdw#(fJc6`uy31fePscY=ml2-9yDXAx^JObF{tDW;5AkEG)?RXda0ewid{F zZ(#tqw}3Y9*Pl_n@Y#b(nw{OVUd);|*4$KKjp;XpiSIpu`A{jgV9!X|&=J|UuPr>O z>|Z?X5-u|KO*n^zH?F`MZTwNce28MY1DOUma<&2fQ@4q9&|u1+9*=Lw|Gvc(Uu#H? zoz7Dqi%g_zB;yHT(QO1()r#jRgyms!P>YwqQi65U-U5u%{L~#Q)l^-KaNG^(J@VHQ z^^Kx!$c80q`u8pUUsBb_%tfcV@WFd<)=p&}K50!PRS&@k^~QbU>VRg2+pGEtc?Z^G z(@Um_&-ubjKTSFbvy{k%T<)+pM@?2JTPOH}Mfy7O1fKC}8v3?MX*>+0djUz}%5y^x zA<4&7=cOWVjwy}hJ8eJ~w%@^c0XAn_^GeMd9m5g}%<&B;<_G3mvMZrtl_hxEsnOs` zGcXH4>UKEc{l?kbtpi#eTi&-uO@^Do3BuGiHq;?yVafIr#|r3f^rKZY2v_=|E;s94 zo$(wzxdkMnn4O>1t`EVfPEHG=5czT-vhc@s3t-P1KKCf>|FE)77+wl!1LJ%TFgBUx zOI+F|9uOR{oE(!K%LrRoKpmQ14iX{`SzV+AOB&4#22lRZaXaz%74nO70@&^3{{qI; z{{qI$UxVnn3pZ-96Q~Wo!C^;zhjGdO$lm$ela+8p zifMiBWCM1!%H$Z_np&PLRTk!`W*ihyGR{*4%IutYA#2{4Q2{XcmXmN8(&|lu5sJ`V zteK>Ba}-c5hUuvF^S54Z`m51nOpakp7_Z3i>fB0~xj3*Ym?S#F+_!C1%^JcY zD6vTTkw4jDsMg2Rd)>@HIJ^+!=tk(JSmxQPkBq50UaQ1xXGGqZenfF#(cuz8>fox1 zZ|?x=rmtSAL>+1uBEHN86D+tJ+V?7?+&=$#BZf*p6lyCn)p%Rr5m*j34l*|PTjhyx z)j%J+4a|`+xZ{wSKB86%t=GgvOM*QmU&1w7T{4={Gb;tyDA>o-ay}{O@RXQx;^UV< z@P0hUp0DwOPq)KiH$lMm>sC*LOdo+(PO@WiWHWzR*R?KSI+oe=d1tB!k}vOFtN;Gx z*2gw;x!IH2gHGLu8Ad3{q#dnZ7gWc$@YMW;*xi6>E1EUNY{Y$@wx|OT% zVl(SH^uStQEtIQibg(?<#Lz16Abz7qC+3Vr04l(ZArZx4$JB|!3aaTt$+_G$L#7M< zl3f@Eg;BFWDIk{1qljO&uKMYSYlz+G=CHU0JQZIUrY&Imisg)^+f}>_#8E z;ya^c=+Av>4~U04#_Hm&D0oC{G5jfS(GGPPT7-)K;>V{2Sj=D?TYBcrqa)+uIj@Rj%qeVzySgu7 zYxbV@LeorOoVjS(bb4D?_6V%+arZ9P#l7sh>8|Az8BZXDOArQE3ZR?!4P3gB7O|wD zW2@_z`5=?rkkKrE(nacO2~jP7^_3v+>_SKBcf|9p=l9--I)s1^2>dPHXX)qZl0`!y%XpLWy z%Fla*F~{-fs$0#HM29t>87~TjIm|6ddkGpiAZB1mD^9Sy(ktLX9SVV=Ogkx8s-u6m zeu$5gmo>4q<%9wr@u558n|i2l1^L*B7)w*PM$uG@oOWF)H04YkQDpK5Qu(?FlTt`+ zVWF~}=c?6owCa+cL~z$tC$PBB5EL+0TH~30ZTuqeY4~%FX!hSW=Di6qrEfA)d!b>= zizkaiYPVz*)$6Yd{<>%VfauU z(fWXWAf;lwKGd8A@h(^@H19j9@{2}D*mI^L4FJzJ!y;vm_4`!XUcPR2+M*n!4_hr$$Tq3y;> zgsZ-UaO{rhu$WDNR20%UT5q4SaW}$6etvD{_$)`9p?6R402 z&H8g1uPHb)FS)|%Z-RYA?y(93`;$^ypUYIBylO`GC-8mb4Nz6C9rlR6Rmoxu)SbI| zY{PpsQ`dY9Rn;_VM4&g==*0m)?ki&^hZOSJQ!S?@oy-hXDj|IB*-nf3lN>-}5IdPME- zFs*fwjkH-?H*l~CKSl(9m|iOACH>0cExU$$JhxMp>^ z=E9QK_=eOjeqr|ZQcrMTSUfO3J8G5!>ZhFmaad z{>$**w=++Sk?ROfJ*Utvd~-^P=Cj@_N=Bgi>pD}_&T;Q9cCi%HW+Df(V#%z-kkKIw zuGpG1SK|~peQ{j-2Axujpf@ELbGFDf{Pm3mM!_v7eu!2BZ`~d@yn9*?CB?4Sdv+C- z`u8=uxcoRv;%~{mHpU#Bx!^tzAV~Rn@Wd~sgouE} zbBU|R==(|S+*$H3QkC~pR;en7PxOZ{q7_-eB4^On_I z{!M5O3|l*O(wlrBNx2cf!fs=@bGD_00-t{wpQdtOUja6cGsK*u;iN#oCV~;El&*#o zok7YlsJ?G1Uw~f#?4rrh3uE36qW1pT;}7W z)a~)-ZitHTi~@7;>NfkKDN&GB)h|UGtaQZ2klE-q$}N)}hg5^@eLsiTq2^K1idju~ zuZ~pfy#E~N{?_>_cL~wC3BibSSEnHt+^AT_bnd-C6$?|@WtPp-P|%HgO0ouLZO6b8 ze9|o(YfC_s`6?&<=P)mV<6YUGE+?n2L&J-K-_!yRVBn6sj^&`MXJM%5;A&xL|GjHH z`XGVe%ZMqk)Dq-ua^p!SEKiEsK}h4g1wtJ|v?*Ycg}gFvcyScPFvu^N8LzryzzTM| z2!h=BWIh`TGThxyUtrR9-qy5QryLf}wf1ukkFBh$eG#h4_HeFAvJGUGy}eMN<a48 zU?1x0ag@7E^)99$-Br2@&7-a9X|2FKHfeqF%GsMMvfA0WGd;qNCC{OizMxHysquF7 zYNV16a=1vSKC6~g2C*68dPsbkZK~u_%5})h)lh!x7uQ<-Xlo?_&hym6%04hD64?Dp z0c?}h!4*q5CJ8~fL|XM$j-ACcj{ayX{KcRth(|s+<;4bZx(tsdOhld<_C3wHoN#2I zhlj z0VM}@i9NRAA&zdJ2A5FeAorwC%3l&)q%=39!^KdLCcZMj?v@ZVa!8V6zB(JzI!Svq zXzP26g(5UBoNL@I7;%oGeWP*#RN(&P*)5L5^b`x&7I}fHX~ZAfqppq3f12Z6OT2r@ zel9ON$B5{aR(-3pmfEPRkw`rSji%(8o~5AZ!giKZu|6HSi`J<9PD)xB4i8!5#nHUy z21EQuzN&$|*$BF?>8Ys(7di<@<)c)V?9molABI|uNkw#H8HYMZ=LCD{FE(T?HnqU` z%%H)^ED{WqLIx8?32E|0F$parsZz^CyN0dvX{6|uW`V?9)8ZdrcOv=cK`X!HGIwjI zr3$M%)E146w)9>qoqm!Jh2Ov zYR}zDFV1&lD=n(|JT}=N7~b0<@ehOSxUKsPks2Ntj`u9Bp3e5;3QQ*h0{p(4xKo}} zsoZDW+NrDp#>@8Ya}K*Kb|oG)+qpqxS0JtWES7{*s}X)=!&jPU0y?hBwOAxY750w3 zh%Y0dwfvopRG(@B%lR97Bx(y^LHXAScvoM6CuapMRG*GXPQ&MW4r*kk-ZVMj9C@%} zE|1Av@J)ps-Xtx1|Jj{DK$UT>aPGMUmY@lx^loWuvY?2RDMV}K&y)1>@M%DO&{LK%4$MU47`aDXwC?X zGWbK11%C22q%T6;szju+rL221MOiRLfmcaJcN)s<=trk{_pSf z5QIPE0RX@ThHL);;s=_DdkflMM?(Y3_vdK$R>=?1ronv8CxLky`j@;R0!cuAj&^V9 z{SYlhpYuHx5XlxebbcRP?-MDI6X`qJZ$*3ChP!i9eF*n33dcPhDeFJO-TD4LgnLNfe-FpO@y~E~6b%pI9+HXQ!(DOzGu$2T z#Y4D2a}#e2Anr~eGcbVt$h5bq(?**%_=^nZc((^2*zx6nNv zwft{*cc$fv{}t2F!+iee#sX|}KO_-_pXBq00r>Y${P$zs-$P3&{u1;(_su`$`n#*a zeNuS-E713RGQW{PaYyaWDmKQhJng&$UnA?`}3bRw1>P5 z_h2eO>(W05;J^BG+>PoFeL5ay^T+n^*Gj9^_yPHkq5WT)+C4$RuOl~W{tEKF)Bi){ zhpzMY(&*6o0r?MUJe0#jxW5+x63_(rPvQQp2<{!}ejORZ_*amBtsDQf+VD(%1^Mrn zR(~%I64PHn{`)0h^#fO=`)Z>y`wjW77yMCezcsZVKKgrUJoNCnN2WFZ3GzeC->MC` zUb{>GYC3)oM{N7IhU5?H{-G}Q9z@6ew>&+xC;D{+W#4~6_~}CH;m-Db9;AbQL-@-+ z_rnZ4+q>>we!Kk&}V|+Is;2^uV86;KExs`un^82XcN00RR91 literal 0 HcmV?d00001 diff --git a/cdp_backend/tests/utils/test_file_utils.py b/cdp_backend/tests/utils/test_file_utils.py index 63188cbf..5391c623 100644 --- a/cdp_backend/tests/utils/test_file_utils.py +++ b/cdp_backend/tests/utils/test_file_utils.py @@ -12,17 +12,23 @@ import imageio import pytest import requests_mock +from requests import HTTPError from cdp_backend.utils import file_utils from cdp_backend.utils.file_utils import ( MAX_THUMBNAIL_HEIGHT, MAX_THUMBNAIL_WIDTH, + parse_document, resource_copy, ) from .. import test_utils from ..conftest import ( + EXAMPLE_DOC, + EXAMPLE_DOCX, EXAMPLE_MKV_VIDEO_FILENAME, + EXAMPLE_PDF, + EXAMPLE_PPTX, EXAMPLE_VIDEO_FILENAME, EXAMPLE_VIDEO_HD_FILENAME, EXAMPLE_VIMEO, @@ -402,6 +408,77 @@ def test_clip_and_reformat_video( os.remove(outfile) +@pytest.mark.parametrize( + "document_uri, expected", + [ + ( + EXAMPLE_DOCX, + "Word9 Word10 Word12 Word11 Word14 Word16 " + + "we Word13 Word15 Word17 Word18 Word19 " + + "Word1 Word2 Word3 Word4 Word5 " + + "Word6 OH 007 A 001 Word7 word8", + ), + ( + EXAMPLE_DOC, + " Word1 Word2 Word3 Word4 " + + "Word5 Word6 OH 007 A 001 Word9 Word10 " + + "Word12 Word11 Word14 Word16 we Word13 " + + "Word15 Word17 Word18 Word19 Word7 word8 ", + ), + ( + EXAMPLE_PDF, + "Word1 Word2 Word3 Word4 Word5 Word6 " + + "OH 007 A 001 Word7 word8 Word9 Word10 Word12 Word11 " + + "Word14 Word16 we Word13 Word15 Word17 Word18 Word19 ", + ), + ( + EXAMPLE_PPTX, + " Title Word1 word2 word3 word4 Word5 word6 " + + "1 word7 word8 word9 word10 word11 Word12 word13 word14 " + + "/docProps/thumbnail.jpeg ", + ), + (EXAMPLE_VIDEO_FILENAME, ""), + ], +) +def test_parse_document(resources_dir: Path, document_uri: str, expected: str) -> None: + + actual_uri = str(resources_dir / document_uri) + + with mock.patch("requests.get") as mocked_requests_get: + + class MockResponse: + def __init__(self) -> None: + self.content = open(actual_uri, "rb").read() + self.status_code = 200 + + mocked_requests_get.return_value = MockResponse() + parsed_doc = parse_document(actual_uri) + assert parsed_doc == expected + + +def test_parse_document_bad_uri() -> None: + + with mock.patch("requests.get") as mocked_requests_get: + + class MockResponse: + def __init__(self) -> None: + self.content = None + self.status_code = 404 + + def raise_for_status(self) -> None: + raise HTTPError + + mocked_requests_get.return_value = MockResponse() + try: + parsed_doc = parse_document("some/bad/uri") + except HTTPError: + assert True + return + + assert parsed_doc == "" + raise AssertionError() + + @pytest.mark.parametrize( "video_filepath, output_format, codec_type, codec_name, expected", [ diff --git a/cdp_backend/utils/file_utils.py b/cdp_backend/utils/file_utils.py index dbb257ff..53894e3f 100644 --- a/cdp_backend/utils/file_utils.py +++ b/cdp_backend/utils/file_utils.py @@ -2,19 +2,24 @@ from __future__ import annotations +import io import logging import math import random import re import shutil +import xml.dom.minidom +import zipfile from hashlib import sha256 from pathlib import Path from uuid import uuid4 import fireo import fsspec +import pypdf import requests from fsspec.core import url_to_fs +from tika import parser from ..database import models as db_models @@ -759,6 +764,161 @@ def clip_and_reformat_video( return output_path +def parse_document(document_uri: str) -> str: + """ + Extract text from a .doc, .docx, or .ppt matter file. + + Parameters + ---------- + document_uri: str + The matter file uri. + + Returns + ------- + str: + A string of all text in the matter file. + """ + response = requests.get(document_uri, stream=True) + if response.status_code != 200: + response.raise_for_status() + else: + document_raw = response.content + + docx_pattern = "\.docx$" + doc_pattern = "\.doc$" + pdf_pattern = "\.pdf$" + pptx_pattern = "\.pptx$" + + if re.search(docx_pattern, document_uri): + return parse_docx_file(document_raw) + elif re.search(doc_pattern, document_uri): + return parse_doc_file(document_raw) + elif re.search(pdf_pattern, document_uri): + return parse_pdf_file(document_raw) + elif re.search(pptx_pattern, document_uri): + return parse_pptx_file(document_raw) + + log.error("Unsupported document type: " + document_uri) + + return "" + + +def parse_docx_file(zip_archive_bytes: bytes) -> str: + """ + Extract text from a .docx matter file. + + Parameters + ---------- + zip_archive_bytes: bytes + The raw document to be parsed. Word docx files are zip archives. + + Returns + ------- + str: + A str of all text in the .docx file. + """ + zip_archive_stream = io.BytesIO(zip_archive_bytes) + zip_archive = zipfile.ZipFile(zip_archive_stream) + archive_members = zip_archive.namelist() + + xml_regex_pattern = "^.*\.xml$" + text = [] + + for file in archive_members: + # text found in .xml files not .rels + if re.search(xml_regex_pattern, file): + file_stream = io.BytesIO(zip_archive.read(file)) + parsed_xml = xml.dom.minidom.parse(file_stream) + + root = parsed_xml.documentElement + text_nodes = root.getElementsByTagName("w:t") + + for node in text_nodes: + text.append(node.firstChild.nodeValue) + + parsed_text = " ".join(text) + return remove_duplicate_space(parsed_text) + + +def parse_doc_file(document_raw: bytes) -> str: + """ + Extract text from a .doc matter file. + + Parameters + ---------- + document_raw: bytes + The raw document. + + Returns + ------- + str: + A str of all text in the .doc file. + """ + parsed_content = parser.from_buffer(document_raw)["content"] + return remove_duplicate_space(parsed_content) + + +def parse_pdf_file(document_raw: bytes) -> str: + """ + Extract text from a .pdf matter file. + + Parameters + ---------- + document_raw: bytes + The raw document. + + Returns + ------- + str: + A str of all text in the .pdf file. + """ + pdf_reader = pypdf.PdfReader(io.BytesIO(document_raw)) + text = "" + + count = 0 + while count < len(pdf_reader.pages): + current_page = pdf_reader.pages[count] + text += current_page.extract_text() + count += 1 + + return remove_duplicate_space(text) + + +def parse_pptx_file(document_raw: bytes) -> str: + """ + Extract text from a .pdf matter file. + + Parameters + ---------- + document_raw: bytes + The raw document. + + Returns + ------- + str: + A str of all text in the .pdf file. + """ + parsed_pptx = parser.from_buffer(document_raw)["content"] + return remove_duplicate_space(parsed_pptx) + + +def remove_duplicate_space(parsed_text: str) -> str: + """ + Remove all duplicate whitespace characters and replace with a single space. + + Parameters + ---------- + parsed_text: str + The parsed text from the document. + + Returns + ------- + str: + A string with no more than one consecutive space. + """ + return re.sub("\s+", " ", parsed_text) + + def should_copy_video(video_filepath: Path, output_format: str = "mp4") -> bool: """ Check if the video should be copied using ffmpeg StreamCopy codec or if it should diff --git a/pyproject.toml b/pyproject.toml index 0e2bcd29..398c635c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -70,9 +70,11 @@ pipeline = [ "prefect>=1.2,<2", "pyarrow>=8.0", "pydub>=0.25.1", + "pypdf>=2.0", "rapidfuzz>=2.0", "spacy>=3.4", "spacy-transformers>=1.1", + "tika==2.6.0", "torch>=1.10", "tqdm>=4.62", "transformers>=4.16", @@ -222,6 +224,10 @@ ignore = [ "*generated_*", "*.wav", "Dockerfile", + "*example_*.docx", + "*example_*.doc", + "*example_*.pptx", + "*example_*.pdf", ] [tool.mypy]