From 38c0942198c7174c8454ee84e76d421438a88476 Mon Sep 17 00:00:00 2001 From: Saurav Jain Date: Wed, 15 May 2024 22:55:11 +0530 Subject: [PATCH] docs: scrapy-vs-crawlee blog (#2431) Co-authored-by: Saurav Jain Co-authored-by: davidjohnbarton <41335923+davidjohnbarton@users.noreply.github.com> --- .../img/scrapy-vs-crawlee.png | Bin 0 -> 70111 bytes .../2024/04-23-scrapy-vs-crawlee/index.md | 318 ++++++++++++++++++ 2 files changed, 318 insertions(+) create mode 100644 website/blog/2024/04-23-scrapy-vs-crawlee/img/scrapy-vs-crawlee.png create mode 100644 website/blog/2024/04-23-scrapy-vs-crawlee/index.md diff --git a/website/blog/2024/04-23-scrapy-vs-crawlee/img/scrapy-vs-crawlee.png b/website/blog/2024/04-23-scrapy-vs-crawlee/img/scrapy-vs-crawlee.png new file mode 100644 index 0000000000000000000000000000000000000000..f98432ce8fe03a6146bd624248ccac4f83536ff6 GIT binary patch literal 70111 zcmW(+dpy(s_qPk?w#_Yfo9o;X8M$w>xfM2-ZYsHzA#%-~Z7xIDTq?x z=w^zNR74p`E~C-#^Zot%{_FjCzRv5M^SrzYNM5colB$v-A|f*GZUi3@5imtW1egy2 z?R>$k#$rT7Kq4d$KW9}nt?lh?l&+SWyQeWqYqz1c`EG5riPk5phy5`+!LGW63Fx9|GiJO+X@-4y*q%%A=+wgo z)$vx0kloZ!<10}X0nWN-JoU<=%`3yqQb;Izv{^Y7ci7K}8fBJw&>%0zH7ab+vBO5u zY1q({CTFu;FC|-N##to!p~BCg{k#pyX@u}|j+dhLmL=~ypXpGXye~D{+{e$D9AcW4 zwC|L=?!lwG=@cxL;uIchofBsf9AXxI&aOJy=HyA!kf?o>@ZBNl?)j-Uq4D+!Ii8v6 z4hbptiDxZx((Ng^?u>BL3)F)l$GpO`+!GS^CDB~Z##*H$SRM=B>wj!_LMA>W$tj&m zNJ+6RIBXmpWf4v#9zTsv$-w3$Sp`JyI~`_zB)}|~Y>}3GATHAEQkLV%7`qdx9#!e~ zp;^R}$Bau;e9P%aFXSGMIPG0Ra|%duIhjd1nSkBMSNfZbJWKNwWT{tV_^rk2L+px%}wbg}|bnnjR?F|iAuQy&e z8F(r=IsLze?4CzWS1wncjZJvidSwCY*mNnu*Y9WrgHn)tj!Mm`V?@mS{s9QLCLOR{ zuy)EyJM(#FIQ%Bz=;_@19~;@P3xDr*p*{{tZ1WxX{?wz&mf3wyzzjM@#?70$t(=XM ziM4jZm~XvfSe~~Lw)t;O_aHN@8=l>U#o`@`PH#MDK2euNxm)#QWI!jw`%Y^EGa{HbZ=+2E=mDPhGVg6=ANqA+_MH13 zCH~JJYI&!;&wg7*o`3v~+y8A=?%89ZQu}$~y#?jkC(pU4#O6rN)w;Wvqzypn4)gR) z%_P~(yJMUg{#P0I%X1A)BQj1F?a*6lsm337w>$qy%wlBwuP#!AO?#v^)_<=YB{oZC z!-}{sH5Fn>gV~x}%0ehEu!sQY~S)QGB z2=PCM^uRoRko-Pg5SdTBfcuy^oOM7eBK~(27AKZ4#%VK%>-#L7<=B<4VmKc(Op4=t zJd`nZXM%#`7BqjSv*qn*n(9^V8C2PGpMbd2 zZid0|#syrXj62-?d-g5YvCP9&L9?H9l=S;SzT}(wf}p#%AAp0sk2U%krt(aD!RD_f zKCJ^X!03ndE64wce{ijUWg{VzHCf>Nb5NbFK#L7^Z^oZ*2#|xTW*_WNM~PVNl}s;k z^8_@F*Qm%+iJftgd~KA=_TR!D)0g%8S+~cB%wwxj0*>$e;yVCD;=ge1{9FE7)*VDH zJ#|1%aJ1CcxN_ga(j~ea|FxXKY)B%F9SsbQ^(9;PFGCs&J~Yrz+^W^YB;gQ|ZdlG8 zdeCHXG-0Dh(ET;ML(nz@)|F?dU!;P|>iQehogk`A>ZWYi!qWLK4%$PmV3#-{fZ>O- zn*!w53{SF`?~h!cKoyTpeU!L;;7(t3QzNWc-=U%#_S%1SWu^Bh(deYetX5`+rknvB zZ6`W(eMs9)mLO|mFyF(_A&<0*yQ+5@@~Je(`DGn6L#uMXh*oBc0QXcc_s;JBD7r^C zWZn8h@<_reBR&r2Q>Y#u_Z~fVL}__mAfERVn6E^*vNdLycSI_qgr=Fp(~7(1BCxUg zhp>8(-!6Gwvn(Gj*QRq^)O%Idutx_wXm;8PbZM39v}=yx z&ckkYB16}J>=Tpls+F0gvHO_rx9i;n^sH7x2r|y01cf~BkfU+6XsNp)@5r^d)sTOI?s(!tQ8Tyy6V)7V#8pd3&OgBACw#nj@xq6_^e82 zb=6m9*+1Q9$Kw@MNza`c4w}(xuFC{pdr$0UCpAQlNrKq-j9GWDA}G^HcmxH7{|gID zn}Y6he5-lRFdP`xd`kJu#-{=NkxqsdFIKpCYSp?4CizP!S>@70Vh@4@-D+9Us=Qk{Jx(ZQV0p!G$0k;j%o{&9L8rYO893u6ViXa>M~u4ZdWZz8zBeJHxPGLFHU8^MY*N z+_Bch6ws!JD%({Yd5U?HodJnJqH)ZoINj`mGFm?fb6>u}L4`N!b2~uD+#^ScqPRzL4z?j!NcrAu~mLUWM+W-73bC zH}_$8Q{TA_C2u$IX74HL1ix|L0Gv7p@|(pkqxW<&(`C+Oilpso*L=0qR&olyfG+pf z%41y=F%B8}kor;=FGSVVFWC2P`#>_&gN{My`CNye zT9E176!b=nw$Wa2%RP?(dha}ba4$sV4{PS0C9pGpJ@gn0pN*J-Sq1=B)yUxALdmUl z{$n`gqBB~x1d8>+8yk;fY#ra-;80^L+&&bxY1!fVh72H0D!b{`4972sdo}4uu&E&2jqvgC(){Lu)+g4VeCo6<9^d+J z;!+Y<&AJ=`lzCWG_KJKAdsx!F!jW^qK`v3zaQePSVm{{;sPfX*`mX@5=M*nld+Qk) z{tCwnYoeY`!oQixHo7`P&(JU7s1yEgX7dnT&gj6HC49Jr*L!i<*v?NHZMjdQaA z{7|T9BR&^6fc%6MK- z+EPq!Wf9+CJ8L8Zs9Jhi^P}cr%)OT0vE;MhDs6+M_s{8X9kUQbz8-0cWbWqPFy$$R zQ!CqeF9{*~2`|eyfL%Y7O5#?*hrn?kVUsrI;0uKgqiL?B;a!<#K_jbQB;Qlt8h^K2 z8+$>Fs&n`kmVa(cdU*BMn$EB>2LRcs&XRTLYE}-N70t5F0QygcoO+zS2a3fZ>ZN|> zM9O&HokZ<1(mU0pfA+h(mwiv(JnyHaz^Lsp>mg^%Yo{F7YIIWM2N$#MCtnZswMiiEQJw zN8<7M1rZyitj021l&Cf6eL4wsr#KwW~({p{48qo z@3!)HdLZecjsYY`@!Z$DT5k1|G;a80tjN0-6$A8ZOm(ctog+)}pRwCY4iB5>R*31c z8sM&#tV)nEAEN&N(0}z`FR?yS-1BnVY8JwLK^pr4IpW7K{8iRhjeoeyN#W<2y#@#F zM4?Nj{Kt$8E@EF&a%$ad~47*xSl3BtG+UQpr;4+`#$yAeRVsXoVm1~3F1GbIS)S~2@&h8 z`!7{b41T^gJQ8Rp_o zO4~hVPW0U)i6YL%@#5+5SnneH99e@sd0K_oyFMqk6*9G5Hax6`cD3wtK_s3=>Qy}z z$4|Fzm)>MMf{$vA2@bUG{;?K@<^BfDKL$EfTLJa574AXCG^vF+Wzo$2_aw?1{;C+z zy7=p+V-gj6y81WI0PClxmIOy!LYv_@9WF(4!|dOY=4walt*7?>2{fk>$19hff&I-E zZ#$)YdPHUPo)T~aORio&johz2CYjGvD8_XwOh<(>V(E>Fnf;R%gck@8>ofz)GUZT6 zS&Nkj`x(_`UGB`W`jUt@pT#!jB!y_OV%iz#HHU;ZSRC@kWHUtf9R+EcEzpPb!5fV> zLSOw2Tsepy9}1GV87g~oqFA|rn5b?D&c?!Sx44#e?gguibT>(PPlUmln?2JZhEg`Ub@4J2 zDF^3om&=ptGFz{kLslOI`gve4W6pxOt6+-XLqT^eq?E&Zf3o-e&FQ2=o-rs>7CqwS zZl+~{izmi4had^*abHtNcN+=m`quv+_?@>G+6z1SPm3A9*fs(Bi!Z`ht;X1Je#jpY zo9}#4v!?8lt}Bg+V9l)DnkX+P-46TsHLElt1N>5g9E>I4D$H54>u$CE z`JgA{<9;~f^5Sgb-VNXJrD6pl197saqSix8gVOK!$%X zk+Du!t&oSCKP&o^#>(L?T0KJ!yNBlfey4zB-N#!Vh<<)%zk-!8CJ*CBW!lXb6*tIpl?S%)kQQURf1O2sQ2_W@Peg zxM7u)04az4eXzyYvwL}0p4@i53XM1DoVickg2|*36PTAmDk?s%2fk3N(CG{&G#_7p|77XtsjUnTha$QzwL^R=N|C z}BEoEi_e9S|bMZ_|SjgyA~T}i|`7yEP2I0dwq(v!Ptg>GmCS(!q(o|D-Kx$r4al+m}b_UGPU zyMmxCkxc|7u~@vL74{6v)C+nsThZgkIBD&nByhGX2FIHFNo5x zE6bwj5rJ$9IXVmIIQ;{-7M=?#RCaWIO@oUAG#5xVc#6rE<$5 z4QJ`p%AAJ{BDkPr-P3!?o_W#QId$SDq!*t2fvJp}jow^?a%Pus5fVFWAjXsU21-wm zOH61Lg}1otXE%;*nsJgQ=z}ucZ+lV^rDV~ep+x$$8w{1{fSJmC3z{4H)_b< zR)~?(-9VbhBN?CKkFD1iv5z2+Rgno%#k#usHrEbgjYLzzE<^ia`&rqV1~f66uvj^0 zmhMDyeWFnlWtHBa)(v|P1mEmcOU(9)p_lRvKjPO^^Tq8zh{ZObE7v9Q543+H=};6! z`A24g*zi++fJR)@TC|tkl)tKzwG|*kbj8RjL(S3+f?XJvkO`e9R0E( zLWQjUf?5T+E%CK!Am_92Kx^M$qg-Byrop7IJZu=s3#K@>J7y_Dv|S)ITYJTESEh(| z$i6}P4;~eV*d=fWCD@5;i9&o-X$f)0IqH}nlrl$q_e`rTx7T`|EL~_ZCuQ)cgJv?& zoE$Z5_^KNzD?g4dxDz4UNT6yuE#fjyJJsgFJ>RB>Mf+z76N3PIOr_F|;ZFwFbAd>-Ne2yn8MYBU)U@HTZGjDC?`(>R7W~_qSK5G_h5Ch{`jUJ4>@(W5aY8@Us`+$G;Pjco%UW!R>b^(&2+(D4$56kH6)6tjU~uW zqXv}yzKOc4i~YsN_mfGvY;ylLL$&R&1DXLGlt|;8@mOi6zdKkBx(FSho9vu2e>MMcR^im6iTiiD8a69Wh#zt!f2$`G^? zq0jZROpYC9iR<{Oe}|sCs{EG=E{IMM!4=e=hN-+ij63%`0@O3@Hx01Ay9<0xB1fUP z&f}regXRfYWH1L3SG>;Nk5O;yt5vm4&`9nR$ee4vjsh9wFKEicJad z?qjSNtcv5B`WY1sf#HT(j|O4@DYw=G-8mSsWc%RFso+haUHDENH{O>JuQ>!c5G}zsZA|Qa8Vzx>vG@Kg~Gf4l*?=%vj5`MLgSW!;x-7- zC#=t^t9sns6G75I`$g27!2)r~4RkK~mNh!<9Y`--D3X~hxon_l;7Od-UkPYWiEnrY z1rHsQ&=%duezYugd5Zq@@I}DhC1w-d<$DJ2{$^06==Zz6pAAj4hzcMvEuOsik6}Qm z8LxQ}OQJWjh+6q9hrTtHtJ_-W&%hr~lH`76gT5c*ar0U~scQ!@lyK$W|J60;pTqu% z+?LJ;;#m5(PD(00VVwuq(gPW&q4@&y%o4XZTW;tNu2(t7MuksWjqRBP*s_`H3Ey7! zuVZlZE!O+ZmCb`(ZWkq`~ukdgwG7Z*@U68p@y&N#|4E*K=fxAw{7ODasA>O!P z%CROipz`2fT|L>*5_F@uGqNx3v)0e{k}en!i{&~cWGJ7mpwD4gM@)SR$C#+guidd`W%s*0s|B z(%ASkE8~}vISN+1-;&C?kBL>Z8`)QkY+_~4P9il`()s=G&C_{}x{Ep1;6&uREUpo} zk$pr0^LK%AsKx;H?P&4`E4O*}_{NQM=w{+t<6v!!O5PcP{HV>A^w>D@15u*@Ap`Z0 zX6_B38sbxUkw+dQjQ$Qby!?l3QbVdv-lxAvmlm_htj7Py)J@b6-ohUZ*cr_BsUuZ* z_>Wi`B6v%+3CF-lzf#WqCmZXhjI1Al7(u9rYsxuscfH^h2gr&#_i?B+-V*>0GTnjn z;?kjMs`g)oGV~v^6?~WO&Qn;hcVOJ-3ssxV(=u0h`7IKX|H@Z1PV}l)1xk;t?lL$@ z(aL)tHkSp>*sK@Na!bgMJWT4B{4+KA+WP@SfX=hZLquMABc(=O#a%g$^);9*@1qg_ zA%a|sySCs4qj=Pc=xDDs-qD0( zxwD_*M18LT*cbLftxlk(wZ1y91Ad<~qD{Mf3aWe1`tFw^y`yt|q) zU?aU$Yjw^aPxm@~#=&o$jml>IHoBvv@T@||qE@WOz=uK1^D__g0riLMJ8H%O2ao7y zS8OgE;Im(Ya>rNg{hL`{Gp9fq`kv8&;DPEpea+|bEf2W6N9CXJLTs{2bjKh#r_wBG z2V2%2#b~PiEgaLmj|I>6q9K8n*%AD~iz>8XZkfb}KAaGoTu9KokuCNmDGdHbBdzv* z;a!P%ZMU(Af8q=(a=QJ8nA?zNrTKEt2l|WB&TdCIID;oIMYs>L<>)K5){#4rh(S%c zHz;WTQphE<2yWi6TJoxl^vgXkOS|J&nuzK?&w#<;OePMp*rB=X@WRy-v>^?|T#_37 zG%TDwkq{v?$R}+64b-9hG!62bn0e{{*4P^Y(B`$ZN@=Ilw4_vr4rs}N9~BbXB@4^t z^b#tkT}A0+ggn=9gQNw0HD+|k*C0y9Ru;>V9p<&r&TXW9E~th8G3uRytDo7~SLBVq;;3ZD@brV!77 zj`y6?Fu^0C^!HEvjgepHu&=U|iA?!UWZYY@VVDW`^=Gs4Z(S~e^iMp)4K9R(zqjEk zr{=g@he=yyEH6;|#&GfVgJe&CkHOku*P}gx*85a-|GsmPjN6+9_it*Trwfc0NXdv^ zuke?aB*))|myvKkDWpHt6_zr(FOw%r)lv|!M^?}8joq&2-JDfTof6CMd~;wk*Zrw( zp|wiZ9m|wf%>F{n!?)Z-oBGmv(kyuvb8!H>O97rcdxCe{o-QCR`}D+nXg)OMPVT#Z zT;&25f%uz>mbFkO$bCH2E)x6>3)|TN&hyP;v4ybfI0D}Bq6|sB!S%}fi-9-fT>YKT z9+rpk`_=?_o+FT5Q%>&l^uS9bUh}TL+Cdzx`|@qBirXAOIW@J>JIO`T>=ZLWcKi+c zEAvKey4D}2zPZ>s?}{5cOk99V?PZ;qU(xn;sY{s zr_Q9VZmcft@~=_mS;TRcECRZJst}H6oU@F@dLplOHxG3qwHPQ|NQG!&$d^uZH*hHL zAUFFq{mkd??!JNde6}(|Nf5p;8h*g@Q}&^^i2dQ$5hI0nAAe-6$13~^Q~fogs4}gh z!Tj>Pf+Zdsp_uK)ojUu?vQk<>_niW*E{)_MZe%IvXAz zv8||ya{JWjQLdpB-|_q4T`VZgi(FH(*g-kG7U{P!RCB*C3m752>;X=>{(hc%YmT6OuLZ$LConkFbO3Wy?axaSJ-rlQ`*L?`uFAPFp!Sfx1b{GD!Qss9U@;S$!WU3J3 zXQsMGvjKOg@;fW_q1GmK|Dg8eg_W&3LSyipOeB;%dTP>+0Lr(;|#)l|YXqZylCG7MiYMm-N z@iRaIUu5Gz(!89q{W9I+iCA!IIt24sd6LS@L!6HA1R_+q1x^`2Ty%!Q^jbEbYBM)M zmlV2Hf7vkjYyaCp*Wacte4kVfK=oUu!@pS@6Ou*$5X!Hx ze3n+__)t?-%TpbW+FlkHKKx6?U)oW~&&s6*)E!~{IEm7^49emFoL2N9I8CCW{HlY= zX*=W;^B>X`w%bK&5u884IREK!q!@eFC|@kaBa6xvVQTWP6@-s2_-_3`13C1Wt1tMM#1*3X}rdb5B=f zYE72-f$N`hX0}ke-<6ZAv2q#A=QMGQ3qo}gh*6P?;{K?kVXn7g3MUT=zhgexlZD!{ zD{TbCiwpZDGD|*UN7(SvUHLRzoI^NOOqc^&rfzHfoFA+q=IYVE0>89-AJ)s*t6?8m zgWA)5dUi!|SSwhDP#^V()luBthuGh%<BnbS z+b2_Req8J+a1o~eS`&ZstwXs1R&}t|70)K{k&FkbUTn907<7HVFUo^dPd{zLTPVgG zl%Jk_bCaZoY@NdU(*FbNh!6^K7fzN2{HElm*+xCiJ2$LbtSt=n@1@xCMYr2lyv+1U z_&!eL!G1+1RO+W|Z)ZT3H%h=Z79rkZAMCB;{8+VcCvQ*z;h84j|FI5Io#qAfV~1fq z6QiZ~{Gi&o9cuV|zUEbgVkXR>!AsA zXn~t!*{|!7kCXmjY?mQn2Y(+NiQV#k@|dxmWwInLG;tL7nJ9PWS_7R+p6{%1QZKuu<&1w3(M}f~~y4RToHb1g>o^2?HsRL*GW11%)W!4tqxV{|unj1P;6d@14;EnQEeO2Vb z)Si&{xil#ip4k3p>5w~8_(eE~gm~)L&C2CN$ECkty;O}=*g|*pMT!+f?ATBp;w^dy zBs5L>v zZRsdEvi5IkNrV&uxuQuq^!#OvN^xbjg0TRd?N1?JanNHnH1g-dY&MudXssHBW zjEZd-_~mS~@^ClNXdhP>cfu2MWZ%uv%?g;btq^bjPwNRSXzDK(L@RSr6Y+s2neDm0 zggS_kY@0T~!oQ&C0o ztKJU%mjlDy3}q6r<{Q(}cOT})RASvX*Ofh zRa9Lzs9R{kxrEJQL0pgzlv6M2p{dNWN;%GdC!-oN7m!N(g}jAcDh{fyB%tDEl31rJ zDG{I=(S?cfW0f$>3ZQ>BBy$w|hs|Pmy=$JF!a+gsG!_6`jS548Q?PKuHFcGEF>q|m z2d=H0a+ezr;vj{S#;6Q_a3y$Ptrhz#pYUqD9%@Wy6O}-)0y#VdrApErO0m#_U6bG} zcH=JD{3R&yBw%VIO05*wsVfcvdN+Pqiv-PjBEU)N7{?883c20;ga@`I^IxrZ;TBC; zGNrBxPJAK3>-1=0satXXA;nm+FmU$bo0GXzwkJeJ9**;RF7f@r(wb#(!MRbFzsFi{ zj6W~K#Dfj5UG7F*bQ=CHgF04~*=Sq0>i{{7Sd4W>REzQrw{JHgrW3soCfSakD>DsR zn}Je8|AXO2xeil$2nxigUk+~hc4q5Q!~Uq)-!%K_N6wzu-Q4$I7^MW3E6q`$-G8Wo z{#ARiJk|Pm#~SvmD%CA`%a9}`6k*-mBe%V-zhQ}4wc*ontG2Z(_m`s{y$u$+@1($1 zHOa#_yC&pUV7U9wkOu0+>G>ex5->XuDy{8yZM}K5`Ef>#V;^J_T1ExIC-o zn{{oLVYct5M$3qPoDD?<3BO6hvR zs6Sh5?*JHr>$zyoJ5<+V?FE8zk*>?s^tD*&SaPJQNx+H9M7g4)fS+)A7wi;wTmB!mx6jSs@EQ_N!Gh!}_LR(JVD&&>|}r zkZEcq%jYWHuFM=S_@4n`TP zc{S})#5-}dL{REpE)df##(|*w7$ZRGgygXEWN$kl1;rJVUWMi3f;S?aX zVnqU?cJi4#{VeOR^V_-(#=88aRz_mN=6C6xL12|xPTg}h;N=9Yud8wYMI<9sP{5OL z6VC2wnEBI5TBV2&5i;*S%Rq!|H=nx=B;hXnXxrb^_o89>|sc_Cc@DurY=x z%wd&iCY}*Il1uHs9POr^DUBE(Sl(UpU)@;>EbJLT^}!&RM|F69JNr;4i{XAEno^Bp zimMIb{jzXQnniC18bGP03TpD)?8zBipSG;u;oHxlO05~(D>s)^*Wy0t(X0^+5!Lm! z>$2p1YP6Dv**0;l_a;g#AV0C%56dM|?P)mQRY;@$?U2Hzg}@S|-ma^P#;mL6n_Thm z{`&%5RdMS=_zC4iC!`f7qB5D6G56>O#nBA1z|Fn&b#re2GYaE*c3%oSQ{8S-{Z=4) zRnp^J!)R5OnbW|_PsNfM%G4a>v5ml;24JzldYt;@O%m1ziY;J6nh+@1eP^V=!UIc} z;cL#CXJ8q17un*+zI34hQS$jm%*Zp4u?@|9t^UOob-qpNZ?|U?BpJ*QU;DBDXgRW~ zjb0|t-F>26+;=>6ssLy|9Vh-JiimAq9&Vv|GV6oDSw`@$N#-vNSn`XLTcWASaa%Ea z&HM2IoowE5DX6({qR|^QiH|QwV5MyQ48ZADi}5!@OoIxLCEWO#ojrc}iBc{ar}-+L z7(5M)1)Q_ydub37I}x{bq6~Z%#Qa}O6>f26auK#PUvN<#zJJTakYJkzKihTx>x(}d zCq|=%+Nlq|iu6Jf8cnm9w%#PSQ?ZJ8gvwWTqiGeEb5puj9Srjx9Lo zovT^Xy^ovLAetGs#qQA98(cxelF0WVsT(KkF@0P$b9hcVRCW41>pT1t&C$Dg{`Nyr z+Xn-+C?)Q$lNxeCf*fz63s4A0^;2{S1}3e*%6& zt1M`|7lxrcE%T?E%2_lgb3p8b7X!nAgVS$Cf|rGF)P^o}Yh^9P|vLN=L>yBbNJ{5C>m!mh|tB z65>I$WOxwj7Eo~$ZN|814UH3l~|5&I$}3!OE(2g z4xY+;=T6Y0z{5*d%kGOKn_)(L5}beAl#8GGeF2|uc0R50!`ly7wL8{#O&3woffYew z%deDDWa!#w1f8YAg?&f5Vrvm_Jtl;S(iD$R8#WZ~w5 z9Bp8d4Q1EG0$h?n$=U@5Z#A7ZcFp&Q7QN(y&POb+7ds)uMblh_Ii|1Ywl2gI6BO#Q z%;Z-CsG9aq<>|}4N|1URq3>dvu0HD!40q1o5zy|Vuu)kqy!;gUS!U04pEDW+H?_?C z2?jc~pZ^K`u$;71vA%hJO6;6d>}tIa*Ht)Eox$hN%W_nm+*!})_ktxnD`Z32d2Rtct=Z+|c?${&IG)Eb&akXon_ARxU)`CH7zG43lDTGrOx2DT&rOhc$ zIBdf}nnU~qkC0EVjfz!SA#-AMzX!@@fPSqqCi_~lOHcoQck_hYwG=Z{5~zH@Hc=gR zqzV4~Pt1Ye=auo?$evQCE~`cPnpct6NAVJo!b;gcvrMRldP97H{Tu++j3iiaTv;3s zj70qpp>GeH#Vhq62Q3WGT?WNp(^ATYOYeR1`02~Pf1*pJgl_(TAEV_*73o-w+&Zhd zK^tI(REDl%&ta~zJoCH+`8e)99D?zkFfhz9%*w%B3@`*G4fhIH0$rF9AWVt^Ju5$q zk?>R(&MS4Fa`2F6I`Nk7I&h`-2OpaVL-`s2xL)jvuc-tC#%ag68GdVp3+xA=m-~GC zes!=YuuEpr2UmNUM;f|^v$wBH7_`VAL&{}4wlmjs4GebSuzlqRnGbqdr(s^dB{)01 zRzvdOVyS`V;e8uA6)m%<2<>nOzzKOzjprF!l_9Af2+0)J4h_QjtC{|1S$_yMM+h^L z2Cy_Tgl_;Bb|xM&Mj{m!V}&OAbvJfkcAT|dY|G<51kkW%5YarRWAbndI2dSejoO8q z(pME4OoPtpD{J4DbxQHkp#?I#R21IBaP=%0uOPo#r@z~-N*C%WHF`s{%29o^K^lBd zolwATB%T9X2EM;^D|1cU1t~YGkm|!i)m^OHI_{ddG6!6~P5)u8hur`o zRWn3n^+VURWa?ZGB#bjE=l3QA3J67xrb$#66CaQmnQw&vs(%{*4Z;E z3erG_47XXajU)SWk=J1MS9`mOk}j;e2_^#@Nky29;)7d`I~kWM56g3dMXtU4a-OiX zEag2biJ6{s<@~!EqDIN{YYL5P(K-+sYdM0Z}b$IF%Fv}K0-XJG5 z6e39;m;^oL;rE00JoZj>AUs~WuD$)}qP{KWR$#C$62DkU;hTMZMqxrnZk>sRTb@uh`DRha(!(f&q4O zgeeVNr%5G?5L-|z6N)&V)C`55+fd)aaQ`*c!@lyg=(DJo#x{W45F?p7f?XyMYb7!? zBGS`|BZ^s&zV!SAVk(ynGu+I?zpOzN1eZOq?F9>E^K5q^X||(SC7c>F|LO7k!m^+F zkOH3B*Id^DCFUX9hQjPJpa<7jY!mOS02^T z`z@tp?-VUW+GvgG9mgMVl7FzL5WxA!b*@{0s_`<)1r53tQc>g2?YYKW*GK9!X4-S9 zW8+;t>ZzmhI!xdXh~F==$`s7JzaQ@isB__}**Z#oiGz4J`u?H4J4hPDhFXobNCQiW zdwF;EI(;dB`D>S0(wzQ_Hr-#ZloYdV)N6|zza8)0#WAngw45)+SF1fwNi@jv0@TgUWI&MFj z!dVD>*)wPc_?<8zqasCyH-12|9=wo%%tP=BjNR>HI`E}ok&4gcYSo=_>^t&0q{iVX z{%QI2(cKhjoV?Iu^=c4Df)L`^OmfPXsyrwe*1?#4@u{1w!oP_UOTP8oTSOf?w-)wx zDwfW=55&dS;I!U8dN1C>BX6xQ-4H{*BN8#~Sz?&bX{=ei8ffCHmJb zptvdR9e5|2?>){u6}w=a%j3oYRSo&ZU?4_blFF`!IjT{=GCvySa{vZv5{QTIz1|C! zG$BFi+Ry1P1li?0evL|w=@*B`u9W`Ik8brR{m_QrY|E1@brRLSLKz3)uRMPHPbunF zoz3LqwU}*yl@?LnstGO{q(FHej>#s~T?+JFC<|@WqeB2_z z`ARFM*#^>owC!Q7hJHYH1;XS>ajv_c<-r3A*NPe?9dB=InKkZ@0fmTNTU{}zOEt~k zkn>JC`wTf4Br=wz@qDX^X2{tS)PZ{S0W!V3N0#mYA29Dkobtrz7MIUlt={q1#da8z zI<49RE9uRfb>1mW)!a}^FrfBQ-&`O!V~1g zFCDc?Tf`M;>gCDnM_dn|{v7u7Pf%OrsAbTHZsHLl_TwV`tvh<6SqbNfD6+qPg0BKA zK{oC`D{|))np5g<-pK*@NzPykhP`%0`F{#t8fO%c>)yR1ob>H^k(B@6jX#0Y$ucX5 zoZQ-#g9*mfHc3MI1PoXhWs8?9-jAJI?ns7`*UVHprCdX*xv2^D|)eDxJ4pA z?Fhc#`N7R{(en`N1fRvF)V=Mr-Y>6e@Ry}{Jx70yd1%d%F2%{Eh^OuJEQ^VmTl*L4 zhG3Ev>a=|ktvfVdh1em!Y`>Gp0%hl)7guh4aR^&2nzVD-9X{N4VTJffe}8z|n8$4u z1>$;`q|weTN6cbjlnaY7)J`8rJBOgpX{fs77O;kY^*lzM#h`eX@#l` zrOk*ftJRSQ1D@u9pz6;LW~Y=|TAR7uE7qG7_18a<4nBfoyIFchnj!Fq)O~(egIQi^ z!=S!xQ!oy3wAk_PluQxJq!MqZ1Toq;^JnKRV1dRat|X=p#*c-1_DcM*h=E;7S>+9M>BqWL72;TKa08VD9%MIDK^w z(`2it6JFn*lfMT6bo693!f7}N0!i4>AoKGoW9azg%g4L+rZ1cC6W)#E-)^eN=%&Bp z&4Oag3ROp55RZ6b!CkIjB7yb!xVLrUO9sk4JNJt_3B1qvF6lBVY}>TT1mO_>G~M)X zN(}$$QpHq1%eBn?@Z4inqW^7#PWwHk7r5PM8G?z63x$j2go4BW@jiR7y4yT)2f&6g zXUTeRoMiPEk3X{gAw`iY#TnDElh-o~dem&L>%`iz-YyS=t zk6Or<#7ybk01)JQS=BiZ(;(TU2EVsXj^a2ZqngrHNtJfu9aS>_iG+Z&x}qhHx#4TQ zN_6O513zmPbBOSK9hEGfgg08ewyW~xFR%8tyuLHkR<-l6qq_N4z`ljNS^mojndn0yMNfso2DC^;H~>@NJL9MZZPERRoe*CW0w_e>nI>tpOprJ|15GT{)&&v~Bb-cE~}&$$8z%vVi+{`_Oa z*WR2KzETE283T8Kmi6zx^-|F{I83h7_FQV=s)-ykju&&!nqom4e@5DvMOxSVr}TIv_O{D8X7(TF5LkPGEs01pAX$%*yWnEfbO zDic3!Sc%9{QzTsHB#9@2QEq;8QQF8Tjmk`}-3| z^DvniMjAZ%{jk>;v|^HN-Uy^|G$ZKVv`~f7?3wxbc5i#u&0hB*07^`=Id^EV(*>0dWoq-J#%9uDQnoFRahwdAqbJw)$cGeKde%ITwY;YsX+*P; z<{>2HXvP<TYr3H1??$&J@jLNfx9+;Nyw`L!!Y&o~+XhyR{tqUmIvszs`=I?#DBJ&MSW-aM)DQ$zlF36c-;wM1AxmTcUAk%{!@JUmS&gA?gR2FdKO zML1SmxVkU#feo>>ITpwA2e8zcPCnTg5<2?<<}A>yoSnD8&^kXy0gJ7FuJJ!xuZs*D zTrZU*l~~Z@00dOiT2iEB1iQ#u_N-bg4wgZyxnm0;*zbB!XHn?%2JJY^__i8nNddt& zuMGNH0fH?v<3xY`*hH))tUk@J0heCvJ4hb)-$WE{#TNd7zGL`6K30o{FiVPtmhyX; zzPp^pS@1xI9Lxh-R<$E7(P%_$G_>_CR&uJX7(CD9d$(jeZU=!4oA;_Seb_bMksb3+ z(N=}Stm-QTI?dfy0Pwygjk=%!S`gEJK`2Pn-ZTaPZeV&lv*y$Qm@I?~d$L@&Rg;Mj zw2)iRor(d6^PZe+m%u8-h=Dfm^`~VolEO-U0SEZt~@43F^vJB&jIG|GkNjj>H!fH@2K5RquI9-5Q3ko_uA&CS^LL&Pb2bJ(|LX|1QLSdN9y@ zFKT7F)z!J9N1o|(w;$8UYPXbsQdXIOFX>53K*q0eg}I#t;0#zSiez2tiaw{hpt&nB ztQ3!^^LO!|I9V6Q6U?&%+^*bb1C-{H?3u-$&yXf}g7tQb=7E|jaPxR%7N(0O6J>el z7aQpMD5WorXY|G?svPH~6%z{4>x*ZLGJ}W6axr%Om}sgDKH9)q*?s$=GlTS1p68>S zm@CCRv%xW}5{}FsL?5G60%oCYy)qFoY3H&+@wQD{@AA(BK29qJZqN8&i$9Rs5!d8V zS=1kvxqb3)#<3B+4NnWMmwsGtD8&DHuUSF!gLp#I#huo9|IXdy{O-@4m~E`jFId}= zS2hjFuj^AurCyF}d#7!0A-Z62hBX8JS_YZ=s;jo{-_0TQWuIRJ#sq8oK`f zXThyipdD*eKp#h6lq;wDYjd&1+p_2@&x`)}U)!b7$kMi=^b76ql@OLyN|DP;Rl8rm z&1}8O$oF40VtU2$wV!$7a93LVA>A?+h>N>Q3FlQ|D{VR12L#9ciWgr6O4W~m;UH#i z_K^Ch(VcbeaiVf~wCvBn@Mk^nVP3>+zIUOy?Tz6cc5tdB;voafPG~s@oHaYE>?)CP zvqq6!zM6eI7}3rHpoae+3Hk526~D&h>H&hbh=?l)Z0`%-aVF}L9=&IyY_xLw>jgh& zumGRk+|%ep;ci?%TFKf;7AwUUBevedwY5DAl39eWyAsSxzRM*q3IuObJnB?GZpoqY zJ#$gaHBN-Q84oN?rnH_ct89-aFJ5yjO@SHQD4*laNtv;k*)AE?&`!4;QG||{^b*ZP z54sp!iP}DM_Kp~Qk3SA#m$~2L9or5YV0Y4c>2G}ONVVGf>*R)lMEd7o)S`mnO7frw zuw)t%C`JY7a4w%v0m`cn39+vK8e{7IcMg+`v=me(Zp!dPs9CpbVkn1=*e~CIPkyP7t5F4PYO-d{j1q=zZJ=H ze){&!QR{-JQx?X#$8@|9d%eUsjVc;We`pkdPXFho^Mq2H^dmMCvCl)iq*unFut%I&Ow}|Hu-&yMXfOlr;rvlJO zroZER;tM`o-{q+hnIyI9;zTy<&(>g(+U9hzMGh;0Tsxl(s}Y(^GCCBxBtO1SaMMd~ zSG|T%TVAo9}ZQE;Lg}}-#;@-i3;&T;1#F5=7ik=B#@YHp%~wBD3l_5D;;&u zOqHrNKPrrEjUbpc^@Ooa4BTfb6GdNJ(tmv0P$hvgf-2x2>%bY# zMTl+%L{{T?Ditc#5&Wm!dHX$Zb64;@&hdSLBTtxic#`Zndb-OO)Q{mcEZyYO?!BdJ zTY=(I+ZzKgC1@91Qq(CMtt1j^33~`QByDUKx!E2&8Qn=XT=$n)Z@>6~6{hN(1o}ad zdep|t^4Pz~6E!)n#2N9y>3TdjFeV}QUr1KzR#Vau+rR{&E2R&xonRtA(%e({)S!9J z0Ms;ZQgI&$cqcCtv(5{s7LNhFYNtsNFitsU$I_kGM6;;}+ILBq^sYe|R+bD+*?k$f zBXFm~7&g2whCS|$cD;u-H|CG-gWq&rK*IIE#xSZ3iqO z$r9wuJ$@ay3Yx#pPC;uD!X@<;)a=)>w}f%II=vfZVo}#c^=o=)C+Bt5J@Z5dMMb`7 z2Xs~Qfw*%R3g=8hR|^vvDM3W@Bzc1nGs8O|z67iBJ4rkET?{~8&rNmaN zjY4P;wo0ee>DmWyj1?!r4{YMulD_5zt>jKvolm6QGU443*d`<&Pg;ziUtk*HGzvF8i_ozp1pOvE=hW-HBU5$ za48&hbXNp*>AgAoH8CHHZMHW)%;@dQ1)&BaD5o z5sDX*iqv!+)~Ghh36XgEz_A>W2mjeaEhR|d+$2|q+EO76a&En(L++t#@AMq=A%gKM zy%-}{<^MYzinZpiaV9J}_BhM<~&@N_KmkWh=m!hVY$9phoeTo^K z_JCzJj$1eoUw8iaU~`D{va9OJ;#A8Ak}KY{;b@KNh3wq03gPObj<`F`Wbq1|;W=mXbEO^PL5 zl|2@@%zLLQ3BEL-pah;ibxoxCo7I^Q1^6p(b%31ki&6wODP_TTccXtNCzCJ=b*eN( z>u?;e_4PP|wzD{UZe-8`(F;(l{*dz8hgq+}Ad(vqIi4C$ku07AsM~tIoI57ySN=w- zIel@DJ>+)!LwwOpE}AgE4k&>oxt$61m}R&@6dsz+f;Ad*J0I4*ivB~pDsQA@uk!V8phGq)On5|8P(DOQk}(5C`(k0- z6QWR|o6l-XD!C)=QecmiZ$&ee*Sw^B?Y5uoSfxCS?bY%Dr;90-wqCI4T~@5jga6Zz z<1MjaAl(diPSi`RI_Kdj8h^Z_S04QgD73oW4GQ>g>+E*yhV_RY_@_u9nB{TBD{X9W zpl(DID*k3%y$}_|SrYN`9JZNf<)m*xyJ|-s6Whc$O0yQ~R&1)y@UTHWGRH;J$cw-D z;QcgI+e6?Bddahr@2hqayOlAXJEojj$j^#| zkj8<=DOLF1MmFoxoU~UY0O9~P9v(H31Gr5Ff z9-+R_NRC%RsB4<^>jzhXhw+mbcshQ-5Aub>a@8BiS;EdYf1_0p&(ua;oqi45lt?ZF z$}xzIGB`ds_fy*P_d3_)cHX_o!6KPNBeT||Q7+jR0rRs5XKSj-k&1V3X{&2pO3en% zvzv|dag)x6XJQ(915K{S85O5K;tct~V+s>#)a#*MIx@Te`K8+Bpr*v*I9=Hdf4^1d z@4w)0*Nfvr-rKJoHmIsvMl5-P9x<4Tqqw187asjC=__?~t;!!#eNn{~{o;!nWA(sl z`3wN7m{1B;Qe9S5JbA*ma&u%sg^}kMf6d*xF`Da0n_JzO^vKG?Z%F{h#+j_YsO^|p zz7F2N{kNDzeHIR8j#|-yD^C)lCm(H7~YAe=%Pj zMrZ9h_wExLGtI&-ftc&BU<8Ny>$zA%fbZ~foa}o=_86u{+onQk7}~flnn>dz5KL$K z(ZD{}nN&81Yw`n7(g5{qS`Cfr??KhareH2`K?OeX^^SUt{WygFpc}-$p6^e)nFV@# z*5`h&HGIvMv#PuJ^*KjO$nCK6Tbv9gADy$B^Hrj_(!tFK!v<&Ok-tPLlu&1j1s*dR zQiL4|l!sHDP~~;kEL_zL@j05`;y~`a&7fHoQzfd0n;Aq~>C4UJUIzmR#Ohzb9VP$Z0WS zhYrY-NnyyKUI{~NivpSPhZvM1@T!S$V6wJ{e_HFzA9^)G8y*3 zT}$&-8Uiv*!{M%i+F==Adl7`p)8D*494M?+Xarp%$p5o3BP*_#&FB3H`zbcRAE3j5 z4DrdLtHthBt?jn;DWxXJ&#gNTbE#_#Z*G?XqLkgyAXF7O-ZQe37};ry0=Xg4gOm$ zL02Ti@N^_oKcqH}b0w8nQoK9Mi}5WH+tVH!OCpty;Gz>DzF-qu%Yx%OI+fCvC7i|u zS?1YFV$gdRRFj=C5KVyol?pF>YDj5qr%|dkrCqr?WR_@yEA`I28fFjvwM_q`@2g=Dw$pZCp{dZ=72nsawj!@lXRE1VeA^XAl24 zl8?ne#9iddf}U^9=$Z8z*N8rYTA&9e!;{4$?-c3LGwQ)EBBM?aOr#(@R2FNLbjP-C zNuNM6W4j$8hksNWk^8S!)mNOT^wT*qB7kzgO-aPQO|admb4VXEZsCYYu_^|x zy|*R7*;s1qkFOM?kBitF6w5b?gI2Y(T6~d>jRSL3f{chW-!a1p+)47ffTVnyjI}+? zBuC?(>f6BPa0h_bgyJpCATj++)2V}P5fIOeoao#j*J%Cz(xs`9EA&GSh2d(^Q#7sB zBP(S7TYg1xE4U@w4uUareVIwcnyF13^8ezidV}feh5{2FeACulgb(c#|sf;WA>z)ad)p$beKS&InGI~5`1%m=)oT|o^P zOkh{UIk+(>^8}qzd)pD19@*dm$q>|6TUQu`c{rD0`0wCI%beb z=|Zq9_k(~j1|N9u%}Asn)+6GlGJ+71r>Yv}Knk{@=R=cSw|e&iZ#M;gDDNx}=h zbV%P!Su3sPD{*?8_g1BhaSw!iUC7t&aa7Q91?X*klOOPH9|qtYW}9@JO>tQS zhw(Boh5BkF<2Vtt09xW)pC5&afuwBi-j~x|RU%sNXJ}2ADcH1D@R?hlUpDUB|I6N1 z+MLt^!upJiHL}~BBCtzwljNe9+0fLUKT6WRH*mr)@L9<%H>4v%Oig?O)kQnudD#eKyKZl99<<*SY<@7M3tt@$&I6l~Y~9q>y=NZxq5l`*o!&gqjF<5s*BTJa{bBq(auB?tCVudqfK?C zx|Tpds}&db#z8E7>UjS|XSw|3K{mg1aIidGvfX*mJn^GjHK@M($P?62qLSTD zrapZt`*6fsx_z=taj5wT&Ed9VJ#T^HLr>g~PWfZX`KY}NryuA2$M0%Tetrnv}hCtEM}$pNahSy27p99agJt5>^`J?*QUMH;+~`1EEQq?;qadBuw&00_nFt0P@1e$IrF(5fOjuk4j&2bwOKvy>m6QmL{%{qajjO8q+(F%xi{VN5> zuV0%IyC?TnR_cE;+7uPq6gi7Q!(xL%@O1JJxqmDI_tE(v&h63jTz5`?DA9B7;HA?~ z42=+-&X|jtw5YNreY`mcn*$#))q;sZX6k}&K5Z7Lh%|ZAQ!U5s4RaGMO2ki>k{}hYaZj|ak!Q0y3Shre+ zx6|Kcp@dbN5?-q1KWtA03RgO9`}7Qh4ff}B zc|31&xlR|vz~i4$8i^mgZ<3=*`QkVnZ}N^@1!Ac|DZlj|d|@LRH_xy0=GJQYj4!$m z8FJp;x6a!+VtTwjkl9u0n=2ZrER#}F zL`#?l3vFt?*OA5BLQJTs9Y#Wry)sd9FU4hp?$_}j`#~@qn^v0C(K6=;_Sq5=bU5!I zVUyg&Vi0>JRmz1jvQR_iBfJ9ivd&S!yinDID=%9tW6rgsQMWX7+=e#CbFjYcB5bSE zl2wZh3g?Rel*EWH!hvB9a@cu9+Z?04`gw8O*P`AC!{&tK0{p5bSP$vGe?Xfp#bl03sZm!#*UM$Z)w6IOg*@*ujGvua(@ zm)>(G$@A{~9`K>+-8ly%d>rteqQSo#fP+s}xz;{nz}rSv)E4sC^xU62>?WIoJJzMI zSQtHT8rq7Al}#xb2XYhWwr~~1=M>5}vBwM#UhXKP`Pkq9Yxs5g1#C&393I-Z1b;erKirT+N@aOMlldMYf|vfP$e z^?$Usio_6QCjkC*=ynNKoutIJiH3diS!5}fj`II1yRw;;i+uKWD5=Pd#jqWX>nuNeOvu4m_1x1_5A(+1t4wCgPXSSLW3(A9xRd9LckR8->H41uz%hzPN%53<+%E z|1QFu=~s)iJCE%Y2#{9!=kYMcA_hU}^z28)Jo-f_Kjz1wphU?XEs;n&INNfYZu4oX z!9*_i^Jq9J`ix~=Ug|fCH8)sQ0Vj+vbaq8)e-2? z7swU+5NgA{VIZ#Gln7=Dt)V#g6PKw9SynpaLGtrai%ZG zCB;XW%GtMh?6m}=oo$Cy)6LZTiK8Ct?S_z7KT82{a^a_c^4vUwh3$nBtt5-rD**?# zc>*G{({>i65s-OWkj<1?aMFOFq&B!qI6ZaL{`_yMbfQs5P8Rz8##Q6kCQ@?ri;(BF zVmn}gbq@>-IvV=()IjixbNtc8ic%g1$vLk_aJyth8KlqHss16ohgp*$7U2EFEon#k z=TR4|yg&0}kAsvpEnjTpru>sl&f7v(xnuKk_${)i@*jZ_YNO`C0y}VB8B|SS3t5=I z=r53@c>bF>7nE2kXexA4G_L)_YIvN;^n zQR|8V_8&JrdrJHKpIhwjZ2+QZF{gkreWAYg@IB{H$HWK7&FPCB2NLJfPx_8mU3>Yn zL+dB0S}f6;&DFXUd%|x%fVE$c8?yYJ+KZ=DiN0ToO)IlP#RApjjfy86|`M z>f!^L_FM+c_m7$e9grXiik-2%ZtHh*L&~4li~b6HjTWw25i$2>R2{?6i+*+-E5L6) zkvxT-C5z4gXDL6}9Y0xP#-{#j699m|qCgq=o^e|0s#G}e_;ju!orH2ubz}=B);9{Y zgG@MfxHTU)q6Rj|4;a#nQ!ukX-qHo;yIHFjl1a{`&9-yXk^xdr#-uEUIEzlWhiEUS zr|L6Tzj5^da4EF=#of*MKQHVEQdsKB$U37b2ytpHJSG$f~j zSwF+eWu!d5^=9)8I){tyo30^c%pT|ePI~R#6T#IU%zTl44{*gRn z|HALPR+mG=+p5CRV4&_1g~B^jzNQ_V-*VUB*80b}WI`4P-4c?B^=-ZDQ9QD}9?Y%{Z)#?!$VI}9d#cGgz zA}OZI?+E!iYUo1D1?2M$*V@j=gM%?|U~@&jw!$BuGAZID?}F-3o^z!*KkE!~zNNi4 zIVzxA1ieBukt=l5-gk-=vo6mF)#`_Og)RMz9LuF}sS&nu!~K=;Vce%{l3(oh3WZ2o z+nqAj=$=;*T9vb-PCr{goer*`)!snn9S1)hHsuH-gFiC5)FyOR>r`lX>csz9ZEPlB z8f@)tiZZlzF0C2?ZB`%0Jp^%h{%Ot-=8EqK7R*~MxiZH(WsoAVjeMFVw0<)RIPH1W zCInNZ<@3-TOTF^tTQc=uRbi|)_>nLuKj=;5=_{JPovx#`$0o;*wz&lYxxV~9ZF9fy z4Ehsy{M(~L*8YYljZ4B^TfRBCy^>7(^3RO?9RK5-euB#e7Rn)WYc|jUQIr*1u(bPE zTlumf&kn~cNBBvi5s~exEeiV2=(^E9ZC?FdFMkExZl?0xUDT+H0_Yb9di=w?Z+-_e zPQ6K}^1ZHIXrwIfx34ypO|GKQwyPV@*t~-g?Ugm(lyyh{a3f|N9hcYJ!5EL~jPFVjV z{URplKvzKTz^7215PYKw>5{mpD2${IA_^&SBJ}L-UM`X)6D)&GE8ZcE*qw863*JZnQLw!DBqfdy2(~n zB;E9DA!bF;zbox&Gs}p)3EKZWQ=9_ypoV8K5diz!*h80u4?M#UHOp|_wCa^31NV-U z$-XEdq=CjPrSJ%M?G9gAQFvu+a;zfbv~m*8;Ga}%wkH6SE{d1*+thykNu=l47PXl6abeS~5 z+m>!$`Jq?5RovISp|$tJOm9su0(c`2zBOR{ttjy$aNe1J+bKpQ7J$|Lv~@h0gy05R zL>q8(C)S*nDps4u!JYC(KkO&aHpIgz=b$TPzLg{Q5;q*cDhU9 zQ4awo^=kRX!z4-_d%jaqY6BPe5e-193U&PMyVUY-RQpivxXI>B&&-_PHe38oN5r2v zNzb4K1MDP*3T3b_qzE*~3;;{7gb~CZq_g6sF7a>oZ#p}PeH>f5&T7BGQhx$~>N2L? zOv@Ue($JSDK0?TK*}8Zbx~R0dCslC{NCroKYIvTMj$&LL>4>>DBh=SU#3dnQ6U{E7 zc5Q#faeRqb0;If?ivN!TT@O&;JDad)wYUW_dB@_3`NJI_Bk*$dDjw_TGeC7AV5iBJ zI~-lCPUqqIpGu2*6gvX7`z8qopL1MIf-3Jz^ga?IrijnC^WRqU2bjwJ8e7-=>G&@B(+g z4HB~5w;s`)bO|bcpjHQshoC*&TfiA!&?_1=x+}fs5?NVn^UFbj-HZfjXo4_G61cGzA}pz}(5d)`tr^Ap;vs>oNzw{Mnz7Tliv|lPRDfv;jrY+IQ03^)8>&$oUymSmj@*O@6Q^dy(E*qlS$0By3=ME|5XEh-p zudxlB#8CxGSyTZ^zO@Da<-G};Ys^z}z8}K{T;XHoX%VgiT$ETz=H~`IxjmH>om@B7 z)#zNYV&TQlPe)<0k?21s-ln52iBEmo&_8EAe^R?&)-;70WK=-MIbGQ70=jig&N)xx z0CLoX(PM(xHtxN@erwh}>b`DcO}iHH)w?LbMQHSX2B)3>!9E_Q8K z31H=Gbvy16J^2_wVk(332^4*?wmM(^=?%(Uw@Dfy7xkOu$7*-Z#}NcwlFU>6!sn-p z69DMKi#K@>Mggc2j=MT!T*Hu9j}WvpYP^j7ds-(kT5KGzp3j9;b4|)Kv=q0Yo4I{W z>cOVX!>KL-i+}_{SLDb)&(b6t`5$S_vQ7(j6sTe>5oThHjfxC7EZjKU?#B5B4$5We zxKfHqQgLzIny6!GHmF?t2&%)$hXETW_04@@Uy5`qOFC%E&#UMQO1ZaK&TPK>?Qk30 z|HTj^Yu6w|d~FQgTn*=X4~=Ph$^tL0BYQjGr5cOyWEWM#AvdUgwB#IgY$3y>pSDD> zCO?k>kyZKQ!YR}M~_%JcY!r#BL}(^N3!HCIyPDXyt2Tu`}iz)&eH=3*p@ z`z&Kw4zP=dH+#Ro7+KPkS7OoWrF%W1GVJIZ&%=+4befstkw zFsoa{m)*__n4X)9){0uO|OmaZCY z4WBLcfo2=0#c2Cg%{HMN;I{7{=W9#c;ECDP*Jr;V?kV1= z0by&afKhp*lfQwMVUkyk<{49;UtHRBNVYae*8l7Cz``*TV}I!JJQD;|@9(`avA`39 zRGNOaElpBvIhPE7rrP6p24i;t_yk8ulq_!}qA)$0@5o`GXGba^XDNJ8mGCZ103y{V zZx%$xvE3eaqx+MY)Z3!nATw+mAy?k1(|8r;lIB>!%I%2azFzYbwJYv zd&tptNJ*x2kO0;Je){T7MX%aYbG|Vkmh>=DN?rrO$7O5|{#~_W-SZy+e$tzJ14@J% zg|jI7&x16;cS(J3rHCAY;u%+icy3rPNM$Q|QhGIwEdADqNdB~YeI+<9BGijO3$gtb z2KigS6~i_{wG8AI#2e-R#Au}h;V(NN2BJU(=L6kmGmdSlU+MNv4Q%IBpW5?gpRRV= zK`aXLgGIL^;a25+p?+b!pT$21$ylEHNiNyObzRIx7N$6W`LU&8Kw*53LKlwHv5vRD zchp%^4&^)uPns_#?$x4FF0PTdivNs#hJ2jMY+|RAR9cQ-G&uaMn#|GFxMU<#Q8|Ow zek<}~n~}36(yBT2@?(Vf!dU2Dg{mq!qFnU0P})vukjde;?4{^0Mu6l(lXET~=eI6h zYywzF$EJ3lxfc0i)7=nYE@iM@#uZ&v*8>9)b83sKkE!hg86UKEReO4F|4R|lJmQmw z%Y8m74oOkTJ=E~lghjbS+u8}{<4EH9KMxVP2}*@gDa)#*YOrgKpO=oCvt0HuIObGK$AIz__joVb!sW{CD$#J@z@<9H7Vfjx*LxO zMY?QjrGQYb!;fB!2<_&V`X=UAM9x!mdS@E$Wn(7(DQ-NP>ImM^^2yth7#g3ZB698u zA(MxA^VLn6&3g6|bDmcnx0QUrdC=F%0rI7n>{P|&`{9nyEE|H86*=indJvj6l# zZD?_TbR~fCZr)r^;oQ(X_Z1okq`IQeGKJPA6sUJ8&Nx0Q$mZ4A((5$myPae|m(Rp^ z_rAMBd)|r29%NX9FkBhj?v;BuY_f z&C_M#of)Va-g0qTJ*9_*i^z6(#eeXh4P0CRI8maC84_|dPPn)>68`D&-UIz(b|;Sr zmLH|?>`$W92{xN>_D18{gN=!=Z*aK$cEI$brv$gvM+TP*H4~1+f$|rd0|y#K>_U8D zF5wV87N#UXbi14&Y%BHYHGM1)n+=1K_E7ejKgs5|dl#N^LJS+aztIJ+vW0nUknrR2 zV+){{uQHuR6ON@=QXGa+IBC@g=QRexRmV-hhq1E0S^DQ ziF&+5*cf7}1`$v9pt(O_YzD59;nMeNHKO-E zs8kc=9u`Il-JRl>x->`TtNM?_D&oo|L%Ms&wVjsMe%9TPV9=wr%aQ%)022Ur>@kp+ zVv(u7HT<&U;N!9NnOC6F5-#*YK@Y^O2%YX|aI|U?*DEc)&bN>egzvlB0d~i1$32K*p zIwM=dBj2nr((^q9VG&Q~z1^57#{u*O)BD>-1eJp?kvL*p#qRfiayXqXhGcy+4m^*=usb6fjmWlvd>h5P|UMM^BD^xj;L z87D>e&T;s)pbgu0kkZkaR*P;#8&2Vo+lES}$tK%?K`=0C>?wn#usEsifb{#PS5Ylm zh5d9*&IC+vwJ>2Y?*T;QO9U@|JwW+Np+&Re-7my%OU zs}?8DiqhcV#Oyt-CHS|1V!l`GG`jz}Zj6IcbPZhn5u&+y+T#PbhC538mVOefR%u;_ zM>?@hsGAc5n*%d5y*t|+_{&;#0k?!LbHR-0s;$?;j{ZP`hLDs{78j4|Rj1F0)0H{t z$zL(3EsC6a+X%(xi8TIeTGMT3VN-abi_PMHh9?io{kVR!nmyMWTIbo_xp{#%;Q97P zP#!;E8JL8D0xZ1RsaSxgQjK?SnY+Kdn+o!GVpMB*y9n5K^U<}Ob!+vkOp7K$xHI2L zsk6ow@XU3)0b1>SXm65V==3SeTYq|kpvu5FF-+=QmOokMydKNvp0?OzJM_6;DhFCl zq1};2zBf%4eDym~1$xM7Irn~x$5?nK zFYJzB#bnraRb>hQg=Ca*-GTmvAN;v2@Sl^Qxt!UM;e(E)Gy5~U zkNSVBye&=)sD|~lIWjy2v38#ti;MA?v}3!Yh#FvQOC0-V&Giw>YYibKIzppi=-cAJ z=o3e%%uHekdeT@^j7(4vMNn`vqfGPm8Zwl2$lk|X4jI}@1YuU^d)`_Z;pAd3LGUTvcWLIb zK!tnP3S4dlh?fh!KQF+7y06K}^CZ;CSY7P8(vmFP2US`nO+)s-)%s5JHdOWDVjM{= zka?2-k5o+U8tvOB7LJR2rl#aML3wwQySSMlw7A*bxr2 zAIJPm{QK35IJjVgnY!)E8?oPd`XV17`Q=RD{bwK2QqZa3xFaBKOJA3Br`AX7g3iBv zMmDEvuj>%+=f-ber4m-vn-iQ_PAAyP))x3bDC5`4Y0H;aCFxViHizDc zJ{>+S#F?eZ?h8}HnLZNtzv}crW=h-9{~=68>1qiq$ZT`iuic~N1)jHG+ovAy^_Rea zn8JsWLnz?$T}kX0tITd;F@cU_`wD7jF0K1R}R6{^bAU@j#eWBYr><1CMzCFLCg|NFH5G0FEB2#K00C9w2}%J9=_%V#}>6%8ZtYeD=(J75QB6DAF1(DgSXJ z7Yr&&q78mn0!Z*PH1gNl-ahJIP+rA$Q-c8(Oz?#01;*LONw)LQmt5pyfUsa7Tj;Q{ z;x*34Pdh&bB$YT;ZXE}?=Ah*6rK+Cry}Vfhyd(DHw}@H_RSq>>Nkkgkx2YE4IUs!T zY?Ipp10J}@-=H97iR(De0rP9t;W@o$R7cf_=Og^WjA)paFCpg(W?U0T`O$NsnmvZ) zjeY$Y?is^(dWmLZ+fa-$Hi?n^T23%s95F?kZ_T}rsD&pUE)SgIf_n{3pE+qfw56gs ze~pH{VHGITnjrk*d7gQ|D=-&?Z0V-M3+fw`PO$A~n+dPQahCV5`Q*yB{@eb{eu#JR z{$ckQPc7dqrpg)CMnOEJe8+K)KoKH11{-y`F_z~Oii_aLf7oZ`ufKrw;h050WKr!495SU*TosLeb=kYO@>)8 zdLU%NX8tH9G;lI@uL@wgC=Q{=r&|xaL+r0i;0Aw!=GXhqVfT;8aA9=*Nkyl>eH`R) zaEhX_e=HT(#Sy97P5s#ASQZGtdgOtuX~LV9gU%257*CE1p-3>1(>>HI7mU-x#MR9) zFZAEJ*BeWU3NsW7xr0?+S-c54>8H00OaI{N%Tz@=Q3Ik45WLhe&ZW!&Kpm?YfYn+f z!H@Qz24%2~Z*-J|;;Y@)PiMd*-A2gQ-;D#ZAQ;#QMQFGPcRX|y>B=dOkMKId8vh?n z-{DW?|NeiU48@> z`dtG_0<$Vdww1tWfH=FA%Wj=p1=9|)9a*0Yg9iQ7=(nah--RLa7Ci493FSuVE;82M z8eQj{X!rT@ERU~anMAZN zjEA}=&8SB_DRF2@TZ-}T`-Q52(8!+b>|})(M>=JiZ8)2M{TB?^+%{>7g*i^GpU_wB zH#cd(=FkV$=j8}A}(sjs-eT` zu&LK2t>BfEUbO!U_RRw}@HAzXwQXX>DJ-3hP#LdZ6-4eKf1;$KD+Eq^)7*>$oF~ zt<#6lsK@G@CMHxdWm&a0(LqGiY}Bvp>F>sdpRlO}y4tyUUrIyFM@ZzL-AZNu&qny} z*1iRG?R_K%`)vj7O@Rrfrw*ozWhD(E^@DV7K_KhJxg!p~UlPG5RUw>-Cg%+^eZe6_ zQxxxkruyups8~8E<0>7HIK=Oi=l!QithXi81gkJtTnX&D}Im1SqN z+>B>nUBV_BdDHm2OZedfD@s>$#6kbXDJval(M#qpYZ8}?%la2yD#N_EiAu8PVZsj< z=QA#VS#y`l(f$c}3;G5JmkTVx_y09GXptpkFnEptQ)oFkW;afCX&UGow>}24jjO`VtgUt~6!%E@P_xZ`Df@vNL zJ$kyMPG|A)9ensC!Qr)Y=96_wIWcFTe0ZSb!9O`;&F`Z`&J>GhpB=y8IyCTAPGnY+>O+-ZzYNux zCj0k3vh5doY$e-O6UytRqdscv+xzUk5YNJhE(8M69LI9q~_ zV*I!=zxL$UYpfsACo_;RjLaC!jXk<1+Y;wx_p_xl1zctiuVP`FdgSu)XuzbT52f~r zm4A0V!a41jl)Hh*fi{oT#5UjkK>8$Hg>R};2G?rNrVl9&=qyjOz0nY!QOq8^ z(>^(bHRPY2*lp7AWIaKb{V8lPDI-RFk$Qng`6xgT@LD*KzQaWj*E3W&j#EZfG8}}8 zX=J{CX*5Ko&hK=PsP@U`p8=PxY{p7|-YYj*-FP6DIAIoB7saIi>M)u07@9YxGZwWT za{SRUN0s9zI@?<6;>4RS+?F2;rD50h+-s@E_@xUT)b&&f{ZGiau2Y;!BDQ)pfzmRWAs4BTr_Ql{68EEC73n<)hEE4KT%Ol2APd9~ zid7k71Q>pbDf9KJGGr=Ag$j`sA&+yB(p22oV?e9UDZ_?~iHw;EUE4M}w|@y~%vDK> z+&!hH_CG%go`@1F2B?~V?e0xOplyp)hC!6L>-l`9muF`$jKO>)co-1Gf{2A0ws)(W z>nAa|lF}$53qZvY$0Pl;se)!rsT+t`XPpYX4S(>LhVD+IAJ(^+nZi4B@fDf)uxF!S z<7O=X3}7?gy@}s{s-A5H#@QVCRA+O4pYn7uUI|R03vynQ3r57m7~neCDw#-GO-Lam z&N)sBxcaB~Lfwv5n>#SAv{|*A)EX<_(pxp2qRp?~@gL9boyQ;7*n=UAj}LK<^FuL+ zK97**7bcT8Pj%vcrX6{Dx!%ZD0zEKRY8+;OpDda`mJuzlx$2+>bu zVc99$UYJZR4En_~pcCO-GisP4VcN1uEOcIDCbCo3geVUBz9A7pP%);ZNFJewQ@_v zkPU(ZA>Aik2%_&tYQBRmtQ5k&6)F4gHWQ?ZW{u{L%Rc6IK(7;!&Be%;qetaX>*r46 zQmz6hMB;ccoBj1>5p{<_VRnOjJ^XOm?)WI zprG>1S^jIi`%c=KZ`6(q>%_u4Cdq4tRc8U(To-ApiwW?#*2pKE&HE55^&-`O3Ko?m zVR~o0We~6S(6QOE|GlpV5f9;IW2cMo?{fVKs2x;Jtc+etf#IZ>Q8tneM4xK9?(d;znM=4wEQ zfZ8lC<}6O=wvw4T1Rp69tC<~${8kllWRrk_QNThC|0_w9;88VvcELp4?@qmD*_t+I111f zzWpg4SH$4aOLEjZte*fZruv&VC)u-=c6;c4!B4$evJbO%AjAgvQ_n$Srb|c$>J?iPW zEN@R(P#jjZgMF5a|3G7gjsctVPx-(Zj(1N=G@zi-q)B+L6b4m2vLkCf)f6;kX;FF= zF8=RXgxJJM+EAp>SBCyXC%mC%W+Anr^adpWmKLJvlS8oFtrE@^jk*brinY5{WK%Dv za3=PNup}le-Jo1{_)>FYW8Fr_1NMQ9^s#`=!NnI&VsybBf>?hy&MuVa{+PATDl;_D z!0JvHD(sl4Wyhy;mg1G9!1-&pXQYW(}L| zba;fvBtE?rs*16qm?WC$K^$1X2}`D@*S}%GOP9onJ>a>;vOwNwp#<%dEz_~Mkh{}d zp9N9y-&awaakp=ypFq?;#=Fq?fwwqLUVwM7Et!iuONCzHXs)Z7EVyr8KIwJjLBA7# zrw#~4X&QsFqp_12A`jSuv82zhSDhkXFf%xYxV&F{Tcvi~q*nC2xQnaUG5N9$PIl;i zNOC*SrFG-m0@C%9>h3To@yI0%h#|@fktvx@EvRhks*CV;nPm8_>n6b68*hss}xoWidDgqgAQ|_m#uMv2Y~z#dcIu-XNf{zG~slzz)*yGl8-Sfh%hiwhrtgFhW9wRgn zdXg;v?2UKDhB?7jDAAmt9;dlRpelAiZQ_A6plm3GNfUYwU3oJpatq-iIm0)uJ(6(H(||`nWPQ z<$_KLj1!jx*MC+>pdjI576vN!$+f2!OMAJQwhTI3An=&nTuzXQ!XM4>EA`FQMXDpV z6Q76&_OEm`*{9gA^ds~>?oQb!>8ln;EDqe8hF>uH+dI&F=kQb#W?1Frl#e`++BhFvlH41HG+AU>>1x9^!j6M{V&3}}MvrEMpWLq!&pe?J&j+UE8 zF)JU5CK=e!??7-=Zj2x#7l!JatcXuenS&C}w@ODJk_^mri^_Sf9x%cI6WcBKIZiBszN>=9M&TTAFRS11&cj!5R zP|yy>xRw)~Of*5R$M3uKyO;IYx&&j?tJ?CJH`LN}MBwcNy&wmmR0}KGv z5c3X4(rAMgij_+ss>VtgzXOcpj66HlUCc&7uoqb5NL0(jdo^$#AgIEJ3&9pjm5 zE*0HbxHr?9`8*=cc&p(!rx1-3gdvD&2Jj%bEmlh0%r_=t&Cs}>WzNc+FeY?sM9Pj} z#RL3mXAEOFsX_vk>^9#%YDar9NSzZ!lQ}@*6%vO=s}a_7T>r@Rfr;J+b*N7*pt9Sk z(?~Cs-OJ-pMl>m9Y%@2uV448 z@6{Ixk<<7^ z+WPw9;^yY`?Cd`-;df#{xSn8xZu?i6`kzw1r@7Qn`->fHxh;vCoU}Xr{^@|AD2bme zh}!y);lh7auA-*tv{4{>qa@dAU?vr()2nkUeud1aL+<6b$1+j(XKj9J9r5D%rq}lS zevi$!zrZ-)NzSM~Vv)u&&)dPV*6RwV>fS`1Ae0_>bBcImUX3lT%9~6)VxLA)rXZ-@ zVa)eu*WJZ1MqU1HjMWi?TBP8AG5R~&g>ACxalQZ)TunSLTj7W&xv##}{GfYkv4Sh1 zPf_%zY%Z*mSl$+6Tt%uZyW{-6yS;F((k#BpBl1~fyKf3-wa*{36=#z;mR59ExgJCi zqGkkeqC!U)zVzW)9Ie%DQEUk)krMFigb<8E(X$93QgTu=MsyS2HhTj}S18};j^GLh z0hZ1z;U3t4>-f4SDn?5WGN2d&DaX9KB@l)hin@8!B8xF?!t|pkVo=kC4{@BHiG<(v zDvYKt$*|#pao#WbXB8x}Xh}ZUK(0vw z_MuU`!_tj^kKrS)^ur6s){&6X2LxB-#e=0^oM0@Rng`@6#%OP!G&kuoBqe%4f)$R# z@s>&Ysrl|Zk~~i+MT${XHxa7KlcTZsNd7XLZ%;R+5M+*cvFhY!?N(d5v8NeqSFuSKOoXM#z3#9N{=n|Ww*Ddg!1-u71Ng$=u9&t8;=aKq z^@JjF?ci9#}TLKMicbl6>^fNDg$}H!NL(tZSx^Wza)C?;^zq>IL4j!lUTV| z>#Yw0vFDetj6r1)oiJU#$IP8)$_=TvssGGQDYYPi1LPlqi8$r6o(d|P0cNS{Kd@I$ zbLCCEzkRJ2kUT6neDE{%G@uRy!S5{b%r?AD;p}Rx6%jL4bW%llU2m@2xh_(j(%`}TNGlPNnvFgI;%MP0lR{98| zI`*=~OEYXNS}ERYlaGW?nv87DoJp-=1bf~yk<>dM!kfR zgq4!GMv`acM@#Lw8Put^sf#3xTPDiz=`UAJ+Nl&{%{#S`&J(4J^3bLgjFQ(%hAG(Qk~-tCLM4i zF)b+3jbm!$?1^+e{xc_}p1H7oZd<;{DUW_>Aoda}bmL)Me^r=N6e^?_*qrOYPQ-Eg zoChRVT}4Zmf?oY_QoC~v$wm-(Z{m)=IigsF@u`GlwIVN#!QoMTeL9{Py%d4d5_0D~1}2qHqkn&;hx^V?T+mpjg${COF7?9II|HSDSOq(s!ZeQL*l$|Sk? zlkqM?px&$FGKG(zqSeri%XMmlV-cx11#*^0mF?!%DuS_^Xdseqh`wd?ipT6W8W-$Cdi)nrZNnZq??l5x+;?=FP|KPJY8nFxo6&!G(R`nq?iK|*$5kZ z9JnOIu)C-1YJWHME2DRZt8an>oF>7p9jg+;1C9tWKgu^Y@CN;c#A!-86f@lXK+pa_ z&wT88gvbXEwwCq&m=|)Wv8}VR)j<99@lob)kM`cae*B2Cu@}j%qc~dXzQy5l5uH19M}2tgrXR+X=t;NDwDF~1~AGnn;M ziWq$KOAtoDNBam%BL9wRdRtiHSd1L%^Pf0kHchOOrg$|>aDcTPmSs2L+UulK)rY8< z8c7B)^#W?qb43(%hIIE8IMI$hQt5rDP>~94z;Uue^%&1pI`=UpQ3^(fvWwT9`)m6& z+WxR+`r-HAT`bbL2R$+rM`*f&I6O9JSu=cp!5DH1j_7qBX@2PWKX6U_uyHY+LBIHB z7n;I)tn8YT(<%1=30eO*9Q?IE{Bk9FO4r!&G|x1a`18%V)5o5&N%Au_kEIFrNHu2Z zlI)uvYv)y3ecSYWbjg?Ye8HyZV~QOnI-=5YyZ6MtGI#LA6FMh|AQg9tWLcKUamJX@ zi3Y4jVnj`(xL>|1O~4(WE-eD$wQ%$sBmG6T4e$2z>%#4~Xe6WU5b&ds4U%(@_$kqh zi|=zWdi3+3%P)#SG&{(T+X5wji`uP8kPMKsY-V&Z7`&ZN_9g+&qGe-QhS1}30Err~ z1veCX^aHM6yFBJuw~wQS``MCy9-{vAnGCdkRk2%)Vbj+*l*4D;D+z$&)qr0HSoRY& zekZ6X3KKA5k!3})-*&?YG!@WoNF|@3WRaK(SMu&nkXP|x$r<)=`gQ2mG-=dtiIj21 zH`C>|)Y{L4;wy#w#HVr*S<97mdt!R@!@5!k?az5$9+lmn9nf?jMTB^Z>)K~46s~Jh z_;b;F_z0a_8<(fr+2Tv=2c~!NwX(mCnC#GvFbrK;E-nC6zKJrS*4@S}egEF(_06W* zU$ws+T_>Hp$+p$(`v6YV>NLJpBXM`Q+DU0yKG?M?uB2lHMJ88)Lcp| z?##o?Wp}2!PV~oUPamKUW)d8W`c3G(o#wId)z)m~g+(O;jku%}663Lu(CPjd1y|9SOSWlFX(cRp>LTYDqf5LoO;l!iwV*x-n&Zv}+Q9<56 z9Ge7!|8B0`82zBY(7<=F@M&hZtgn(X=;LYxBMQAk^9if_!{a-h@H=`L(tB{~7r!&C zJlgS2$6OxurQ;Q!O&wzrq#6naf|#N&7v}T_gLbK=DJsZ;K@RAZK&feJ2x~#D&O4RE z{jF9BLl|ZS7j;P|<}EDy>tQB8#3qM?-1UKb%MMB(wwcl0{<7#>d;R91-RQN1)W2WO z(N`uv!x1}7lx~0-1-|3uxUx6nucd#jdE6hag!gvNv_nTFkL9YJ_}mXi=b)paeFK1Z zA%}FiG&BFu|FAp&3`i90A*;ol;<|KsAX_;;*HAf1%~2h>iAeq<;{54|IXc|#H#~ea z9VQQfyW4-=hrC6^FlIaI#VQ_;60_IV>H%%|oYJdZbGyY!Qc~_aX%(`lAZhs{0zCIc ztKMtRcAsIk$T*)m#ETjGGq^5x9tOMhq8P1y6k3Pkl0r%nZvG*?0sd~fU)`JF>=?NZ z`|_+Y1!So-w-*gHG-<8{Y+usl;8a|2Jmxp_{KMtd3s0jI6?1LKH=mlO3e$k~m{exE+`jofR^`FpUN zr*YS2RWlN*3?JkO7B)=Q`zwwu<=_BI=|mw&T$NT#OQy|I zx{+BDw$f^nBx$qpp|{gA^xQAkOb?e14%8HBc-P+NhR`rv_>^H=?k^j`yBo)@xVJ*p z1_>G0T2%G{;dcWjLeVT84DE$Q+Z#=iJR2O_GZ{#i!C$LPqr{|C#q zpG@Yt`^$d(hs%X*`aCMes^m2NAF4^rSq_wJ{CI?@$V9^Y6G9Z+@Rue;2F3i34N8Nx0ZEm}Y6>-){nIGSxL-?aCop{S=)7h%))mY69d@Klt;c zFVj^Mhut?F8eL{fC={md-Cy$%d1*L;yTKND#Q54cNYGu;&YhtkhM~&BvogukE9ZYf zthIOaT000D8UB#0Qj^Qnl(I;mezzk|_j_Y??8ZiF>PGCB=GQsQE7{e58*3 zA?enLd}F6tFOy{ts|Lqeu)kT0f`52)y$Gcsk(3|8dhDV;XBobQ@fKCtV#H(E_eHYg zMT>ngAU1BU&@~B29mm z&eH4ZBg1x61mMx@Fgv+>AesXVohUY=_;7gAuQY%Xqy->cr6cpHg>eIxp03!s zZCXT}Bz@$h;URTq}P6vKEpmUE>Z9zm{i%zple57QM0W0O=exe zovzf7VN2|#YXb&j@NfoxYT*y^0``dtD*N>g3{7G;sf8LCft01_V5=c;_wgtAMXulm z0w;--VH4znjDsv3@lvjaJo|Z(Nd2aNm#^x(2m^Gd`B2E<2c6|}&$d1%=ip{lRHRtp zw<&0^)GpPsbMDGyQBl%Iyc2iTJkN!w`(~g2Q!F#!F1?OR8;3RN(CakM;*-G;3cVFd z47uN(lCXiAlFHe{#};7}XZEZgSfRrQ&!ZgpNq_D#&Ln^$W$EB5R4KF3J%4LWS-IvV z&@F-&HL-l!R}Iln?cAHlw*MWCtnV4cnfGTP#4qAMw1ZQG4TLTesEJ?1HO4!JZlDlhtmugNq8-r;5RQ-&>MH->#?&b0jGUXHiVH^2(*} zBwaO=gc_XR5rS(QJ(IZ3ed*a#w5$1ls%JI{i&0yU?o`o_Z|C!Y6E$J-*Jn-%w=!4* zcuHDO-S1fCGu%|=m0yng#3)8ERan#~!oulTeu`9&H6UX1L={GT-aVaD`}emV2d%r8 z!!-M{7y8AC-hehyK*Z}+;!{1rJn39_z;8@?2NeP|xVdo`n8jkaz6ewQMSFkXPRgEbyoZkAIV+yEc^$baHA%2xqv`?g7LQnbnS;zz zU&b#vL%~O1j!ygw1=XN{oW1FarRb6*+H^12$+1uDHE4--zxJW^KcQAzT6mM}cO>6| zn7}=!M?&TQiz1+Uxm*N?*w-;^x;ze>f&63ZFt&LCdnrfg!ty0Xv23t52Ui+t&sTj22v<|j+ryv z;MG(j^QJ^A48zoEBitemCs59va{n)P0ZB4G?u;7b>n{rtAWg^GPsRqpt&0Qsv=U8+ zb`XHdVeRN58%5uDckn*MeSfH84(q69QFcK`2e+*+FPt^do|ZKw`%tCJ;j_3Q8n2&n zhgmamsLT3=e&UN!qtRO(e^*M_(V#y`QoVDM=j#{BRXFj$*l2)T5D{ydZXd;xdQ`w+ zb|u#Pg|MEPXjQBC=Y-4J_jGXeuVK~C_6}HT9Ey)dt6rBJc#dqU3}P9tZGx5mO-=HS zct19NQz1wHQ&B|zEu3a7!X2YV@SU=Lvg5WE8XrWw2*K~Z`j z1d+>D$v8MkcIs?04`)bs2}N6##jEhnX|bEWFY>wlnA(C+OB%5Cax1J0d1q;FtZcIX zzRQ8l`}Fz_{&0>PadE!pNNG893AR@9@eCT0>GDjg2j>wwio$f{ZHzg?cr!PJ|wX-Yv*&WGVl)c#gz*0f2cYbmVk zx?bW#yVx?f;Fqk0^Gb#45_dM$GQI|8@#)9B?P2c?)g^Cf#XMuvSs(dER{M7LdPImd zud{EaDnDSxk>oi81fi5SO6^~D(6!8w zeAZYDQLBx!vhQ~B4!MsUByMb?bFvp{mqaEUG5$tZE# z41>Nr78L-FNz%5E{ZaJu^ydtYw;7Ubg*L?{sNj9bb#Aq~;`&D%w@^8`+F#9mf9=!~u&>n1Di^RWrU{ka{PFwn}Jwq`ZxzIJ_Y<40q07#l$$^#WjL1cq}Do6Ti9 zHYD3QgDTsVG-V`=>r!?~X}X;>!!tk-%hCdAKRP^AeqW5C)$5H)U8&#MXit7I?g)Juc&ALp3mF#OUnFAF zEAvVXUVRgmWmWQYinRRH@QdUTVgf5Fs^tlAlnR}TL{DK<;0#B{_-pZ9%r+l6JBI?yEq<&%| zQ*jUE;_g6dw!uG}|KW8IEH|^vy03)$$aciEg0sTqff_X=%p{aKKGdkolxVNhli7ZbFf*_&iNTK{fYbxdQ&bW^xD1v#0J`l zGvb2W-e=vh7YJiPHH%zS9g~Yx(TXj$W~!UQoeq-96KVbz1dd?Ge!d>cZ0ftv5K3{0 zJWPMihqT=b-LZS(1ev7;B6*lAd`{iHUC?^r`uhq?bk10vy9gUu(DRschFFluI_JVF z5WKzCm0YowIJkeV{(xOWG-Wlmx>0B+Rf0s!9!lhLNz{s`^657!Z4Dlpj<{p8C*hBT zC=x$HZlK(vJC_rv-Q9YJO5uq9w{%K-Q=)#q9$mfFN*5mf<}c>m0OZ3@0LyG~nb<7x zDlhR3R;_OOQYB{9no#_nI-5xl#xZ(vx=#>yE~w3&JY~9n^|;$ATrZ{1Lpki{*@bDpiU0Zn>#kO^G~+h?rF-gdsd(JV9PS8!>0 z{~Q+}&$zWxlc&+atr+zKTeQ*3Z$%B4>31HMUg$6^d7tD7#p?pUBKFrhRx2|o-*L2I z3$CWY_3SAWr4v$`rk9)NM)V;oh(o;!FG95Gl#r`ED17`F-adf!-%$Z!?}vV>Y6)Kd zV6ruJ5vy5`R-$wsLMR-Pe7N#0-@sEUh{J{=;{rXU*t9;FHdZ=K)y z*MA&6z8~H<|HL-G(IvLGG~;+L>4CbMHo?Iz(}OR`RMFIBv(8^^@E^xPiOcyWLn-zB zF^wjD4G{Pxxo^t+8C>m9YWT|cpJItN3)-y9h+D^DvqytDa^ln#MN=-_y0{QWOavB! znVf7#xDI*fJAc^reUC14JJ}YAG_%PRGb<&T{J8b-lfbVbCuU7<#!evJp^1wpOEmAV z~GjD#v+Ob_ZaRV}k=bXy~ z3>1iQRby_g_kpCLT66PMe#{+R~C zOMUs%3*dF(0M&m(G{Wj}NtDH@6)U7m(dX)C?_d}xXd+jH-xN`|-jm=Jh!NHy&zdwd zo_^QWSVc275Ty#6g@0d0%rS%psO;AUA=@rE{17(Ps6%8MO`S=TiqZOOK!2)>tgB}v z-cCFZZH&J>c>~k+8NALKrFdcc0J)b67HLt+AFXj56n{*Vtkq9CA=PH3M;67A4!u`= z9X#a9lzbgi>2(3+IGAGa{ONu4Az9(z3R8LtR|u!uGDgJuKE0iHE!I&iYSIpTJI;SS z`>*&v)j6A{;o;%n%Eoeyf0u0Mh8;s5>b;+{8R_A49Lt8ixPxP~mWfjbPD`W%4(ya5 zX%(iinm|zf3($ER%wrH%zLL68)!cG%w21}R5V5{H8UJG2S7zmi8NiFIwq`4);?Afa zBfoKWX}YluK!UH@k2!opwg7(D?ci7GCnMlQ7F@n=R!Z%xS@1IAN@vRuNs!C{v>nun7F=t|Xkw6r%O}WzxA&Y#~pCMJfFZ>(3tuL!V zZJH!GZ-Jj7>V#B{5GK@mR^gQv2ST&lAY32Sh9= zO{`>#{&?>dg??*PR}1qJKbt(yoiRHHp!P>MsRNLZj?CbLgM;)V66_orRgY;C=DTCz z!CK#S_2MK=-`aVhqxZ1vEjLc*5WqUlFYkCu=87Q8Kiz9| zx8Le@N@7{_Aes|=4YI(^_CP(ymk1JZgT)t4WCAmAJY!hDf(sd5Q{44=x~3XF&XzZg z$VoJK3;K>NRkqNYZ0A3NfVC&{p*n3l$(0ja=6BGcZ!cEgQHG9Obd^mDbQJ7QaY06DB;EXX1 z=-|;Ftf2Gs+$a13hDG!T?Us($PA6ta6-Xq}I6B|HyfP+cgkw=QKk#yikgfcgX;94^ zySOLQty~Jj8v!DI5++%zIT~fJy?M!n+XoDf3{=S1pwW!{*})8YyWuBnAa_OD5v1 ziox0k8vSv>vcwn2U4pv35HSC3wDCK3epZ5wcnxR>1-+wsAY&Dbij(p_Zp4K*KgpZC zz_aSn{U(QGiYfa~f<@=fJw&C@XGDE8*x}m0e5yIYWbxfm90}{5hLxML0r+S`tB}C296?+;aU7vsV4;Aym?AcN zFFpQNu;PjzE;7U&z_h^Q2M}Olkw{j?r;iKNwEf2tBzrdWGO0M3rAAXuEob%o3#L<^ zwbn{JC+Mvb!(vd{aN(E1uM1}f(ylxfVDttsgJmw zZvHkDrjP+-$q)3~ET2#9Skj7746Lbq%AWO+dw1?8aBk~21nK#c)4NT4U20Py2Z%JN z&&(8DAVZ&Hvb3KSOiKrgKgCZoTP`i~eHQSjrndh62B?{D7tGcyQ3>doO=^ zD6cT6YB3)xz37_p`<(0Lp`@8bvD*qwOo2&&Hv9hAMK^NZbID~zl$tiBPs(2F0@M`g zkvvQO9vyNJ>vkoV8_qe5dI66SM;d{+suQI3xz+aHthH86;aAH)q__x!Rt?dt((rq* zY|*cEeB?1l?lAj>a)Lcd(rqYg7ODtT7O+(O)xj7e!YGIzky zE@snG6e1R*gDbg-?z{v_-h@M{-U3+}&F>s2I@eA5Cx1+wefNtAj6!85Rg6MHV*6im zKe|$<-uH&tT{)sdie`*t+}h-2D`&~XKNk~(89jsy^fos#6C9NMJ}B@ni@JNvT{&J9 zeSc4wAQ`F$G4fO=7X*RMBxQvL2(_qWB!2lSS@zR-g7DIB{qz4eE)KAON{OX#5}OX1 zyYcEdE>qDC3?74kBAzY&5R%u|@ z_2akqo2!^4rsH(qAY-%wOi}01Rl*;yuu@b*N_Dt>j)q=6pWKoV5dq*gp>e2XlEFq| z&((BMEC0~hh$Tv^5`5)czz%4MKD$J21A|nmf@l`jv-)g>k6%gbxBI*e~DG18H#WH9MrJ z*#0rO#58#k&i?nmJoPcvd{q6klKF&f)5}YoJ`ri(5n!K)n`w*=Tm}1W;p6F(zn$E; zMLPN~hD%@glBKqN%7X(Js`tGfLWKZ>9%+hvK1WNLboLfK2e7H69+FjO!pFd1j|geK zQE626jGO&@ySD*fT=4@1an=Q&Fl4w7pj~tU;EL%%%xh=e!wr3HxJCxk?=!OGTyG&S z?)sg6X4eUki#fi1G7En(dA|U>C$lb>;^532UT=i1<5{hnw@iY^q!|OULEw^^QgG0ZYf6QnQ%ddM zk_DjV?+MBeoivcj@Eq%+q|AsGX-XoFFc79`=w;yqurVyK-75Qo(DJBEA}kHF}WK z17X(HxCEtf0E2rQ47TPzBzEIO(yw5C2k^4-F=T}=pz>8|df^L`&WWtn;UJc-4UBKV zcUvYQUtjZK^0Ldf=R9D$uROH026;|EgHdQIT(-PKnEliJ=>E}d;BFAK?i_j+_2n$T zxc6$S<5>za_Lz9jh_HOQOEwc&cVx}{wVE|OO7F;W=W{XYbEgZ?F`C&Mr8_{tChKJ(~8S|(qt+asPkRF|AfkkA8Q2{DU+mkFjUe0 zL&2Jdh!}lGVBrb0@xUe&5QB8uwPVjJ)|o_CH`QD6-sC&0A-gNs2GPQ?WnFt!#+mz; z8_!G5aNwulQE`l((03*W*zTSOqMh8G9on#p)Z`k|OvQ_06pxXDrgKZYVCZ2r9vKVT z^_P@Yf9m7-4yCDkv*9XP#MnxWOAy#|<2y-sh_@#Y)K;?C%|4K?Y#i3$PUQSLgP z;gJ1^$t|S(+LnhpIj*}nanfI&%5z-@^Wdd%1nn%7zs}zDN*;oqZcW~yFwAp1<`eNb zAm4X196PKl^6cvor6dM2%}30XvX^};nvwaYK<_(h(WaaW%b*Hi@OBg}i*JKnff1hM z=?R6Ox2!~I+4-E?j+&G@<`V;niVdFu&adA~-d!VPa{KJQL2&trq7^&yHz&)b5_b_8 zb$&me+vu+`pv-lbW6`@|$bTJUgxkPFDgHP2V(+z~8kBUEPHXYx#sQ`OJOTu9o+8a7@rY*^D(LDnn(j8YQw4^jk>wJmYY75ssvVl3Wrl4O?lgvRNmNm*sLaff>ExVCb6((ahmdV z;xYSjmxBZ^Tsa1mo^2p!xEOFy?$22G*e%9y>Z-e>|L&Y&hS#lIoo_G{!z;2WuiQ`k zLBPXkkM)nU+Bjx|*ocSQl};0-)zH7kK$_cY{riWd$o9=ZdajOWsdMSGZ8S~*CxcPN zXM{dR_vRwrNs`-2g4`L?Dy~rUP~MHi9t}f^bP*-ZhcQXa2)bA+?hi!5sx+^8l2ds1 zZ#AAgmSRXqjDyS#rkx)j2KH zEZaM+j|rKQNS=xGz9)GEHn|_%U&dL)#}-7u#MggMWThyrnJkq=Edy?(L*0|ROw?A* z60HWi6aMyrD)mNQ`K;^qO8B$(Yp4(mM^!*@oVY@D%Y_FWGDWl{E-+s+{iHuWQJ&Q% z4KPDQl`&zIqeU-lSdR3d@5l)Ri^}lFm~q;hHhvVz3ORK?hRt0N$sg|*@@b&C&msB63Vxuo?AaB%a2 zBZTzFlGnxPj7G;!+29usfwq!bDJe4@YAZm!(t{O~jpWZ;f?2SG;m0m`HujtR=Ke~; z0l~Ua67G4r#E$K>1_xGbOL!NeokMn9KODiZ{wIpm%*1q5a8S@FHacaciJ6IJ#l~nK z`*KONRJ!(bw8D=Wu9)1U!3B;@OgMPVRl*c*aQ69(^`CDlH}g?ycn3t@G|#>b915Q5 zc<%Y(Z}IJK4mj)1;XgO)m!(*=-rlTNP3j6@!<*&8!s~>K0Lfp?(0fsG3#qjS++!sl zwW+jBq07elKzOSvz*3yh<``rUq{inJt5`WALL&fGYT!z;UJaaZMob!QgzOX=&}MyU z`LBI`jVsbW@W%J(Z(8;gcR1Ba9l<|%Yd?JCU(D5vS-KHhOdpMu&7a8{ORqI9fsl zDUsS}=@1bFMkAoK0fHi3GD-o(0%UXz1SH;lfA8P>JbUi@IdPx+oa!jJHLsh@2=BmZcw~r2B#6M)@Ax*_BoCoQ>dPEL z*KP$;2w+|n?g0$bqHPrMI-Ty+9S=cNLa6{@c+%;VJE07(t_x0Qe=x&$;aA~qp}?H` z1_$F(wmy@>&Ic~mR^;B37QKJ-_Yia>h&n+BhHM|%#;vPAjT{F~-sTc!K8+7kGW@IkHja%qgY3mDA zrlc5WKOEOD6cBj^^rWt0g|dja&6O^C^-IIN*^7$f=#ABH0@3+iT=6|N6er< zd2;|c4N|hCh~;yf(iq?=9umNBf@b zY$S=ht*z#caG?fY%glGowhZIp^HG--I421i9X!u4(H9(t6>PiCJb=$@2=7( zT2&xElR*t{C*%U~+N~2KvT<=57xA{|gFPfXP6D9UTY&SDp7xE*D#%A^7O-I=i5^#B zi4@n#SQ5{$`!5VL2?HbzXvme55w8Lg5C9>wFn!?+m_t2G@OBaKsJda@tnT$|-``FT zf0w@QZj55oyp#RCVfXvxNu6_hV@own^<5*=e+W^G$E67L%`%o?7zBv5!{Q+Yhxm=SghpU-isw%{g-`qc!cTt16H$hV)CkUucdtdMMiQx0MiP^C?!N@ka3Yw=NA~$C zw2p~#i(>zCYGjtf7MhE`i8VMEIY5kGHnNHJIqrz(0Cb;K9kRYUH)Iz`({aNXxl0El zhCf$zL0sg~bJteD;v1eE=gr>2&#XjY^0v`i0Dn4e;^xig5wKZ%u8r0Ubz^(--#zdVSiJJQNN^%(&2 z92`2)9?3DCu0@rg^@q2ODmiM zk7u+&B7!u}r`8)kCy8BQ@-A?j{pmwNPj!H(($MUyO)T z1UY}m)LqtMiUYX1(;8k4KSa{g)x!-{3L&QC8Aiq*v#N;3XvYQtpX#rFF{Ce)$mFvUpvHJcz+lYLvZC=h-}qNF$$Gs=Yj?l_WDj0)Z z)%RF}7^_3;P#@_~W#BF)()zyaloQ1f`$DZ9w^ZIR%mDXJQ7(`Hb4~&^K=DCe;LFBa z%$Br%XP3nvFC^**0&nFB%UF?U_)}4yyo?h$Eb1^Nl;%o@w#Hq`40$0_0A7_4uo3a!8C$c^!V!{0J zH&3}4*y&v~rbKv>I?rLgieAEWo*YkZ@mc<$g^3dLogUz*dO$<$(sEDN7QjQufk6*D@pWz+<%ogr_fPyq zdl3=#Ml={_MNE-5&~}^5OdD2v{{e#sUHpYi19Yw#h(SCwaCk>wZJ%?~^6&3}^`-oi zl#{8)z|+|q@tU-s!4!x*zfkIb{6Jgc6@?k`IwD|{m?5dDJ9xS$Vxo})W!kUOhn_mo z?OVZW^(}D;^aut#uWXUvl{EXrJ1URKV`Ov6zy~n>c2(A|o@*WaGD(I1U3c$=10u25 z%LJas?h0|C*Kgy%Os_UcWSmMrR6#-m^~G3k5!;SC(_c~|GZGO`-N#R7eE3zc><$by z)sT|gnBGkq#MF)kR`@28a5uic_(55{USaX9|I&#rao%_JF|D!)zA z8g2h>Cap*hQ{otiufwX3wBojFTF)njd=4D}z~~iWCq9&S#4IP&Rk7Z4r)F1fcyE6l z1ej|*&70yKA$gI@*GbG$G9uks9*a46XBUOPqb+;0!VIG

__Lx3|DXw9wFWbOjfVaZ2TUl3 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 + +## Feature comparison + + +We'll start comparing Scrapy and Crawlee by looking at language and development environments, and then features to make the scraping process easier for developers, like autoscaling, headless browsing, queue management, and more. + + +### Language and development environments: + +Scrapy is written in Python, making it easier for the data science community to integrate it with various tools. While Scrapy offers very detailed documentation, it can take a lot of work to get started with Scrapy. One of the reasons why it is considered not so beginner-friendly[[1]](https://towardsdatascience.com/web-scraping-with-scrapy-theoretical-understanding-f8639a25d9cd)[[2]](https://www.accordbox.com/blog/scrapy-tutorial-1-scrapy-vs-beautiful-soup/#:~:text=Since%20Scrapy%20does%20no%20only,to%20become%20a%20Scrapy%20expert.)[[3]](https://www.udemy.com/tutorial/scrapy-tutorial-web-scraping-with-python/scrapy-vs-beautiful-soup-vs-selenium//1000) is its [complex architecture](https://docs.scrapy.org/en/latest/topics/architecture.html), which consists of various components like spiders, middleware, item pipelines, and settings. These can be challenging for beginners. + +Crawlee is one of the few web scraping and automation libraries that supports JavaScript and TypeScript. Crawlee supports CLI just like Scrapy, but it also provides [pre-built templates](https://github.com/apify/crawlee/tree/master/packages/templates/templates) in TypeScript and JavaScript with support for Playwright and Puppeteer. These templates help beginners to quickly understand the file structure and how it works. + +### Headless browsing and JS rendering + +Scrapy does not support headless browsers natively, but it supports them with its plugin system, similarly it does not support scraping JavaScript rendered websites, but the plugin system makes this possible. One of the best examples is its [Playwright plugin](https://github.com/scrapy-plugins/scrapy-playwright/tree/main). + +Apify Store is a JavaScript rendered website, so we will scrape it in this example using the `scrapy-playwright` integration. + +For installation and to make changes to [`settings.py`], please follow the instructions on the `scrapy-playwright` [repository on GitHub](https://github.com/scrapy-plugins/scrapy-playwright/tree/main?tab=readme-ov-file#installation). + +Then, create a spider with this code to scrape the data: + + +```py title="spider.py" +import scrapy + +class ActorSpider(scrapy.Spider): + name = 'actor_spider' + start_urls = ['https://apify.com/store'] + + def start_requests(self): + for url in self.start_urls: + yield scrapy.Request( + url, + meta={"playwright": True, "playwright_include_page": True}, + callback=self.parse_playwright + ) + + async def parse_playwright(self, response): + page = response.meta['playwright_page'] + await page.wait_for_selector('.ActorStoreItem-title-wrapper') + actor_card = await page.query_selector('.ActorStoreItem-title-wrapper') + + if actor_card: + actor_text = await actor_card.text_content() + yield { + 'actor': actor_text.strip() if actor_text else 'N/A' + } + + await page.close() +``` + + +In Crawlee, you can scrape JavaScript rendered websites using the built-in headless [Puppeteer](https://github.com/puppeteer/puppeteer/) and [Playwright](https://github.com/microsoft/playwright) browsers. It is important to note that, by default, Crawlee scrapes in headless mode. If you don't want headless, then just set `headless: false`. + + + + +```js title="crawler.js" +import { PlaywrightCrawler } from 'crawlee'; + +const crawler = new PlaywrightCrawler({ + async requestHandler({ page }) { + const actorCard = page.locator('.ActorStoreItem-title-wrapper').first(); + const actorText = await actorCard.textContent(); + await crawler.pushData({ + 'actor': actorText + }); + }, +}); + +await crawler.run(['https://apify.com/store']); +``` + + + + +```js title="crawler.js" +import { PuppeteerCrawler } from 'crawlee'; + +const crawler = new PuppeteerCrawler({ + async requestHandler({ page }) { + await page.waitForSelector('.ActorStoreItem-title-wrapper'); + const actorText = await page.$eval('.ActorStoreItem-title-wrapper', (el) => { + return el.textContent; + }); + await crawler.pushData({ + 'actor': actorText + }); + }, +}); + +await crawler.run(['https://apify.com/store']); +``` + + + + +### Autoscaling Support + +Autoscaling refers to the capability of a library to automatically adjusting the number of concurrent tasks (such as browser instances, HTTP requests, etc.) based on the current load and system resources. This feature is particularly useful when handling web scraping and crawling tasks that may require dynamically scaled resources to optimize performance, manage system load, and handle rate limitations efficiently. + +Scrapy does not have built-in autoscaling capabilities, but it can be done using external services like [Scrapyd](https://scrapyd.readthedocs.io/en/latest/) or deployed in a distributed manner with Scrapy Cluster. + +Crawlee has [built-in autoscaling](https://crawlee.dev/api/core/class/AutoscaledPool) with `AutoscaledPool`. It increases the number of requests that are processed concurrently within one crawler. + +### Queue Management + +Scrapy supports both breadth-first and depth-first crawling strategies using a disk-based queuing system. By default, it uses the LIFO queue for the pending requests, which means it is using depth-first order, but if you want to use breadth-first order, you can do it by changing these settings: + +```py title="settings.py" +DEPTH_PRIORITY = 1 +SCHEDULER_DISK_QUEUE = "scrapy.squeues.PickleFifoDiskQueue" +SCHEDULER_MEMORY_QUEUE = "scrapy.squeues.FifoMemoryQueue" +``` + +Crawlee uses breadth-first by default and you can override it on a per-request basis by using the `forefront: true` argument in `addRequest` and its derivatives. If you use `forefront: true` for all requests, it becomes a depth-first process. + +### CLI Support + +Scrapy has a [powerful command-line interface](https://docs.scrapy.org/en/latest/topics/commands.html#command-line-tool) that offers functionalities like starting a project, generating spiders, and controlling the crawling process. + +Scrapy CLI comes with Scrapy. Just run this command, and you are good to go: + +```bash +pip install scrapy +``` + +Crawlee also [includes a CLI tool](https://crawlee.dev/docs/quick-start#installation-with-crawlee-cli) (`crawlee-cli`) that facilitates project setup, crawler creation and execution, streamlining the development process for users familiar with Node.js environments. The command for installation is: + +```bash +npx crawlee create my-crawler +``` + +### Proxy Rotation and Storage Management + +Scrapy handles it via custom middleware. You have to install their [`scrapy-rotating-proxies`](https://pypi.org/project/scrapy-rotating-proxies/) package using pip. + +```bash +pip install scrapy-rotating-proxies +``` + +Then in the `settings.py` file, add `ROTATING_PROXY_LIST` and the middleware to the `DOWNLOADER_MIDDLEWARES` and specify the list of proxy servers. For example: + +```py title="settings.py" +DOWNLOADER_MIDDLEWARES = { + # Lower value means higher priority + 'scrapy.downloadermiddlewares.retry.RetryMiddleware': 90, + 'scrapy_rotating_proxies.middlewares.RotatingProxyMiddleware': 610, + 'scrapy_rotating_proxies.middlewares.BanDetectionMiddleware': 620, +} + +ROTATING_PROXY_LIST = [ + 'proxy1.com:8000', + 'proxy2.com:8031', + # Add more proxies as needed +] +``` + +Now create a spider with the code you want to scrape any site and the `ROTATING_PROXY_LIST` in `settings.py` will manage which proxy to use for each request. Here middleware will treat each proxy initially as valid and then when a request is made, the middleware selects a proxy from the list of available proxies. The selection isn't purely sequential but is influenced by the recent history of proxy performance. The middleware has mechanisms to detect when a proxy might be banned or rendered ineffective. When such conditions are detected, the proxy is temporarily deactivated and put into a cooldown period. After the cooldown period expires, the proxy is reconsidered for use. + +In Crawlee, you can [use your own proxy servers](https://crawlee.dev/docs/guides/proxy-management) or proxy servers acquired from third-party providers. If you already have your proxy URLs, you can start using them like this: + +```js title="crawler.js" +import { ProxyConfiguration } from 'crawlee'; + +const proxyConfiguration = new ProxyConfiguration({ + proxyUrls: [ + 'http://proxy1.example.com', + 'http://proxy2.example.com', + ] +}); +const crawler = new CheerioCrawler({ + proxyConfiguration, + // ... +}); +``` + +Crawlee also has [`SessionPool`](https://crawlee.dev/api/core/class/SessionPool), a built-in allocation system for proxies. It handles the rotation, creation, and persistence of user-like sessions. It creates a pool of session instances that are randomly rotated. + +### Data Storage + +One of the most frequently required features when implementing scrapers is being able to store the scraped data as an "export file". + +Scrapy provides this functionality out of the box with the [`Feed Exports`](https://docs.scrapy.org/en/latest/topics/feed-exports.html), which allows it to generate feeds with the scraped items, using multiple serialization formats and storage backends. It supports `CSV, JSON, JSON Lines, and XML.` + +To do this, you need to modify your `settings.py` file and enter: + +```py title="settings.py" +# To store in CSV format +FEEDS = { + 'data/crawl_data.csv': {'format': 'csv', 'overwrite': True} +} + +# OR to store in JSON format + +FEEDS = { + 'data/crawl_data.json': {'format': 'json', 'overwrite': True} +} +``` + +Crawlee's storage can be divided into two categories: Request Storage (Request Queue and Request List) and Results Storage (Datasets and Key Value Stores). Both are stored locally by default in the `./storage` directory. + +Also, remember that Crawlee, by default, clears its storages before starting a crawler run. This action is taken to prevent old data from interfering with new crawling sessions. + +Let's see how Crawlee stores the result: + +- You can use local storage with dataset + + ```js title="crawler.js" + import { PlaywrightCrawler } from 'crawlee'; + + const crawler = new PlaywrightCrawler({ + requestHandler: async ({ page }) => { + + const title = await page.title(); + const price = await page.textContent('.price'); + + await crawler.pushData({ + url: request.url, + title, + price + }); + } + }) + + await crawler.run(['http://example.com']); + ``` + +- Using Key-Value Store + + ```js title="crawler.js" + import { KeyValueStore } from 'crawlee'; + //... Code to crawl the data + await KeyValueStore.setValue('key', { foo: 'bar' }); + ``` + +### Anti-blocking and fingerprints + +In Scrapy, handling anti-blocking strategies like [IP rotation](https://pypi.org/project/scrapy-rotated-proxy/), [user-agent rotation](https://python.plainenglish.io/rotating-user-agent-with-scrapy-78ca141969fe), custom solutions via middleware, and plugins are needed. + +Crawlee provides HTTP crawling and [browser fingerprints](https://crawlee.dev/docs/guides/avoid-blocking) with zero configuration necessary; fingerprints are enabled by default and available in `PlaywrightCrawler` and `PuppeteerCrawler` but also work with `CheerioCrawler` and the other HTTP Crawlers. + +### Error handling + +Both libraries support error-handling practices like automatic retries, logging, and custom error handling. + +In Scrapy, you can handle errors using middleware and [signals](https://docs.scrapy.org/en/latest/topics/signals.html). There are also [exceptions](https://docs.scrapy.org/en/latest/topics/exceptions.html) like `IgnoreRequest`, which can be raised by Scheduler or any downloader middleware to indicate that the request should be ignored. Similarly, a spider callback can raise' CloseSpider' to close the spider. + +Scrapy has built-in support for retrying failed requests. You can configure the retry policy (e.g., the number of retries, retrying on particular HTTP codes) via settings such as `RETRY_TIMES`, as shown in the example: + +```py title="settings.py" + RETRY_ENABLED = True + RETRY_TIMES = 2 # Number of retry attempts + RETRY_HTTP_CODES = [500, 502, 503, 504, 522, 524] # HTTP error codes to retry +``` + +In Crawlee, you can also set up a custom error handler. For retries, `maxRequestRetries` controls how often Crawlee will retry a request before marking it as failed. To set it up, you just need to add the following line of code in your crawler. + +```js title="crawler.js" +const crawler = new CheerioCrawler({ + maxRequestRetries: 3 // Crawler will retry three times. + // ... +}) +``` + +There is also `noRetry`. If set to `true` then the request will not be automatically tried. + +Crawlee also provides a built-in [logging mechanism](https://crawlee.dev/api/core/class/Log) via `log`, allowing you to log warnings, errors, and other information effectively. + +### Deployment using Docker + +Scrapy can be containerized using Docker, though it typically requires manual setup to create Dockerfiles and configure environments. While Crawlee includes [ready-to-use Docker configurations](https://crawlee.dev/docs/guides/docker-images), making deployment straightforward across various environments without additional configuration. + +## Community + +Both projects are open source. Scrapy benefits from a large and well-established community. It has been around since 2008 and has attracted a lot of attention among developers, particularly those in the Python ecosystem. + +Crawlee started its journey as Apify SDK in 2018. It now has more than [12K stars on GitHub](https://github.com/apify/crawlee), a community of more than 7,000 developers in its [Discord Community](https://apify.com/discord), and is used by the TypeScript and JavaScript community. + +## Conclusion + +Both frameworks can handle a wide range of scraping tasks, and the best choice will depend on specific technical needs like language preference, project requirements, ease of use, etc. + +If you are comfortable with Python and want to work only with it, go with Scrapy. It has very detailed documentation, and it is one of the oldest and most stable libraries in the space. + +But if you want to explore or are comfortable working with TypeScript or JavaScript, our recommendation is Crawlee. With all the valuable features like a single interface for HTTP requests and headless browsing, making it work well with JavaScript rendered websites, autoscaling and fingerprint support, it is the best choice for scraping websites that can be complex, resource intensive, using JavaScript, or even have blocking methods. + +As promised, this is just the first of the many articles comparing Scrapy and Crawlee. With the upcoming articles, you will learn more about every technical detail. + +Meanwhile, if you want to learn more about Crawlee, read our [introduction to Crawlee](https://crawlee.dev/docs/introduction).