From 82a04cb0a20fa58e7407b9642a72c2c98571a46e Mon Sep 17 00:00:00 2001 From: Yana <––ƒ––iputilin201@gmail.com> Date: Tue, 10 Dec 2024 20:58:09 +0400 Subject: [PATCH] nikolaeva_yana_lab_5 --- nikolaeva_yana_lab_5/README.md | 62 +++++++++++++++++++++++++++++++ nikolaeva_yana_lab_5/img.png | Bin 0 -> 32787 bytes nikolaeva_yana_lab_5/main.py | 66 +++++++++++++++++++++++++++++++++ 3 files changed, 128 insertions(+) create mode 100644 nikolaeva_yana_lab_5/README.md create mode 100644 nikolaeva_yana_lab_5/img.png create mode 100644 nikolaeva_yana_lab_5/main.py diff --git a/nikolaeva_yana_lab_5/README.md b/nikolaeva_yana_lab_5/README.md new file mode 100644 index 0000000..92b0243 --- /dev/null +++ b/nikolaeva_yana_lab_5/README.md @@ -0,0 +1,62 @@ +# Лабораторная работа: Умножение матриц + +## Описание + +**Цель работы** – реализовать последовательный и параллельный алгоритмы умножения матриц, а также сравнить их производительность на больших квадратных матрицах. + +### Задачи: +1. Реализовать последовательный алгоритм умножения матриц. +2. Реализовать параллельный алгоритм, позволяющий задавать количество потоков вручную. +3. Провести тесты на матрицах размером 100x100, 300x300 и 500x500. +4. Сделать выводы о влиянии размеров матриц и количества потоков на производительность алгоритмов. + +## Теоретическое обоснование + +Умножение матриц — вычислительно сложная операция с асимптотической сложностью O(N³) для матриц размером N×N. +Для ускорения вычислений используется параллелизация, где каждая часть вычислений выполняется в отдельном потоке. +Однако эффективность параллельного подхода зависит от размеров задачи и числа потоков. + +## Реализация + +1. **Последовательный алгоритм**: + - Выполняет вычисления поэлементно для каждой строки первой матрицы и каждого столбца второй. + - Этот алгоритм не использует дополнительные ресурсы, кроме одного потока, и подходит для небольших задач. + +2. **Параллельный алгоритм**: + - Делит строки первой матрицы на группы, каждая из которых обрабатывается в отдельном потоке. + - Реализован с использованием модуля `multiprocessing` для управления потоками. + - Число потоков задается вручную для возможности анализа производительности. + +## Результаты тестирования + +### Условия тестирования +- Размеры матриц: 100x100, 300x300, 500x500. +- Количество потоков: 1 (последовательное выполнение), 2, 4. +- Диапазон значений элементов матриц: от 0 до 200. + + +## Выводы + +1. **Последовательный алгоритм**: + - Подходит для матриц небольшого размера (100x100), где накладные расходы на параллелизацию превышают выигрыши от многопоточности. + +2. **Параллельный алгоритм**: + - Значительно ускоряет умножение матриц с увеличением их размера. + - Для матриц 500x500 ускорение в 2–2.5 раза при переходе от 1 потока к 4 потокам. + +3. **Влияние числа потоков**: + - Оптимальное число потоков зависит от размера задачи и доступных ресурсов. + - Слишком большое количество потоков может привести к росту накладных расходов. + +4. **Закономерности**: + - Накладные расходы на управление потоками минимальны для больших задач. + - Параллельные алгоритмы демонстрируют преимущество на задачах с высокой вычислительной сложностью. + +## Заключение + +Лабораторная работа подтвердила, что параллельные алгоритмы значительно эффективнее на больших данных. +Однако для небольших задач последовательный алгоритм остается предпочтительным из-за отсутствия накладных расходов. +В реальных приложениях важно учитывать баланс между размером задачи и доступными вычислительными ресурсами. + +## Видео +https://cloud.mail.ru/public/fykM/jy3KEZBZM diff --git a/nikolaeva_yana_lab_5/img.png b/nikolaeva_yana_lab_5/img.png new file mode 100644 index 0000000000000000000000000000000000000000..40dc5d9bea8bcca1dbdc3be5aa44ba85432905e3 GIT binary patch literal 32787 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

sa z$W)-GdQ$5?J^*9c<@4_+1<>6F2Ig1Ai~okX2K~oiHX*1Ub-dXfV{n~vIQ;^K4HFYL zNlvTOUgYMwpbTY#RNah-lk1lTq0@--SFZMs2k*=P`;T{qST!$B&n$lZ63w_`SI8zR zlV^Py=R$=?9{Bdv`*uNV>pl+*==bVJ^it`g%bl!M30UqqgM&04M9;3f)X>>S3{_qE z1mKx7)XGCMkM{ef$qWi#nZ@b$W>vQ8GP@)<8T-x}6-R-vHvL+sK^S$^->t|F4BXZSMd=i~V+vKD&q#ECHsltIJ5ftq;$J$)yy z+r`g5>`>C+7@g`)4X`)weIKqbPP$XZzveyyJnz|&C8ATHsrtjM`TDQM=!-3uwkM^3Lcjd|YXe8_c#9g+@ zlB+U%H(Jq#{$_#2c%s_w=hp~Igr+O*NluioV^htp^8IVvc_frmGFi~9jJQg*2takF z*U+6Yq`n>`0UVC)#l05mis*a^>l=W#Y2FPDn~QV;0C>u?HNuu}O|@6frMRVz~*o3)ah9EE`>As3%`%d-wj;M>uWm~h$!u#I4{Rs2Ua#DH1ZvX(Bp zl(pThyrl|UPD5}%o;5Z!x23sRqcbM2V|%XMUygyK``b;FSYq-T+Pz4&ssp@+=`-Nl zN1aa!8hX`1-j+&09H@3+kUF&+mv~-g7#1<%cu;^Tv8j!|LVe0=V8%@|fD! zwsW~|HUH_nhSH62%SuMiqSi2pCwLkKOrF73US}f(X zvu6FL!jp0>^Ew8lz}0gThWUtMWmr8(bV1jCIYo>P9gp$bz#UIM?vpdIq}A2^gq0$1 z=EKXNT31nFQlTrjM-TTe%miD9jgX0UNyAz7sHtT5$rn2hok1~+lfo{kkY@Y&pgnr7 zO2|6?%=RWUROF=0c|1$Jrx9Az_ainZW#dH2^<4T>1)mJ z7AJ}#)j&Q*mUPT!sG-5H`9l{dB|^5oJo&;~g)b2aHP(^|N#f~MDh#xt0`9GlP`^ABr@&(SaC-Ig;Y(hR={!Cs_&>{%;HWKrSANGI z$dW7esrw}{(|!q}Sd7i&BBb26rL z`q(ntZb+#IiUMb_p&+m!9O~$!l;W}0z<840MZX!WvCd@)p&Zq{4!QITo~~U}dVh6{ zrboX1h2s*2wSuKM#g&D3VHeZ7;KB1fJ>(}y2rPWaa2K}~fCf7xQ0RdA)yV*x(!&xSR> zXCcoEyx0Xv64kI^rP^0*&&S*T?32{TYnWmzw$6ea{3Q!r(Ku(2wXdBc=butLxeD0T z3{`RpvlV9@RIU^!E8S~q;Fc^3nds!z)`nSfe^jZ46wOS>(D^B_+9L%-oa9RWi+}_o zg$CSSYCU8!`?ufQ(}pYj+?KbRBylqVgb3pqHJJY0#oFIpk3vv$Sh49aY89&wV0{vC zWI0qJk@S&w>S1P`&+Jf060x{Fx>%p6{)6_$#;zFG!wmBw!=5`cDqV?(=N*HNC4J6? z(XJxo{8e^3>6aM(^Omk>*P7p0Z2Hr@kD}9rww%J3ofp<=OaReKi>24CXvIc>et71e zB8yA@bUTI)xOS6fMAWa?aqE7FhDClfe~K^$osNem&%?=sLc>n?6pDWp_&h9Fjvvp| z)}AzY`SZa-lRZABGa}PQGy9AJZtK*A^iq8X-3!)NVskfCHd!L~;|+C#Hr^`5%rrfM zVyyNh^Glp(Wf2tMa za~lpWyu9K!H_@oCqyMHWsyU)Fj8TXe@i$9Kah0_IJZMI+lkB(ppITBh;g6P-+dr#q zPwOe3Z)50*8nW+?AM%JkVIqIg!o5XT?C3_Euw7{Q&@q|PzMay-8(*W5Fe_6J|6p`1 zI)xMN^L3yVibSE!6Ud+DiQ6hEX5iv9t8dAf;i+%ZGV0ERC4CC6s3@DbKrYQxZRFM0 zyO2(6|18Q7Gnk80C<1SQ9piGlYE8i+N%r+{U97OTMj|;mq2_|QQ1YptYo>?B)*C(n z(%s98^!GGz1;z2ya#==nVT491c5k!R7x1B&`@@wr;xaV*_P5a64h7MJBUE$y|3^P_ z{&+~2{i*;%(3GL<0@k{$Tl2gR)Q@B#;ju_vHE?fjaso`x54x>u zJV*-_kLyuKuDv`xLVbmes<537waeWN-aM zy=6qMIcm$|mG1%&f@H>i_4S#~&Mer9bpV>zd&+2>T;=j}sGIYki_+<-?{l@PJjQmwdLp!96Q2+e%s3R0&;X z<6}Xrg~N@tgK+H~oVTBTQBNevB`^`f224C}y3nDhIRDKy2HxlDehK69{&GXYYyK~C zoIVw-tFvo1<=tgXIfjVs6L`-kgXe8;&(<`}aQ-zafzNBa#+2djW?!$Q9=s64?+c+>@%f>dGAyH(x>RyjNKsNe zs+Az9IjQi?YrXE``g%s+_uHpe14bqEeJocuSQ90q5x3(S>V?tp7<p30t49hp zvu^JHud;5a^{FA&2vN`O!Il2Nkc*wc?_I^QZ##F@vZXihJpG`t8HOd{Ki!;ny`H{o zHo-qhhIDJxKt-MIujRT*o+Y0R-^ z&h~Q16o72)k=dg!?9+L-@8HH3~i_0-L(k57mQOaRR|erE z<=|<$UDc^kSteD;yM@QmCF`Z)?^g(d79K89dDGAwbAlfl!_5o8N*xU;oN*JEGC!vA zx~aOB&smADdCPU0&e&K9CS6cYIZ%F=h+M&iE{POuU4mYQ-jR3u!W6sI^c(%SL{RR5 z?)zHM*&m-s-3Q~9PWCKRBsG)l4b4~8dFgg&#sjqO(AQIGwX5i{2Qlnq{MPr89Yw)W*v@GML`_E+=dv*WE@R9RZW%k!> z<$H0-|HI@PDrav&$ls8?2sd=u_m-^<5&bFr2y!}!Y1odJl!Z<4sY$QPsGI&z~)7FnYk(ikj;>UDb z-WYeSk2)QFYvDH<`R!i+WnHD~21XV%pD93&V?*ETbyLC_p?b}Gn=hH7@I5rQ zX788L?XqN^j6r)Cn$lJTy&0`)5=bB5P9g*5C+z2&aTDg2)ug7 zuMzqMa?TKV?UY2MovO>^+2iU0lmG@Fii*~D9%U_R)Lp+VQ6j~LX0GSP`)kE#uZApC zb6-Kz&KR$ZFYgePDv_W6N5!0ej3G*~RW=kE`s&>o-7W^SK>hoyhuAe#4(I7zXhAOE z6*@GXc3Og;!p+p@3h5G>#}mPwB+1!iuq9?WAsmKhAQzmPqCH);-PA)uOB}0ptYn&# zPLt3BzPvN9QCYw+Vf}v}h@mHhc^Szm1aB0ld>E}uwhBi^49H!|n4znwqD0i9}GimYi%y*zY(*`wNsO=v$r{d!l zd~Yq3-FIWS8@vS9lqt$tTpTXs{+IAJoyWr;hym-KWZm*tr7++B;xdOd_b7#}OuPQZ zFN(1U+lAF< zEd`qB<5BaKD-DeN3J#(X=!&^86nOuWOdLE_EKH*b+{pr!bJ}AsKMM8Hp zjNE?b{am&-+t|`-2G?}jH)iihbM39czq^M^%uAXFW{`=D^{38WbguD8FcLhJaVdU5 zJGAEURzH^B1)FL9pGSa?m4rcJU<$?Y(^z{(GfU~hidBSB5-VshmrL8eNaCgcYyjy&pjw0q_ zmC@VGD&8cQW&6nL;stx5SHsFVRLnV6yEW;%jK>TakL{B7`EJtR4fYWV_F^(Jqe#ju}PD1dYkc=gC9z@aC9HK@(Jq zrQ4Vf)p;8nn&dY&zG08m5r!x+d=tIo1`I9Mzj_=(YUxh_Nl|{I8R?Bn{x#W4^IH4% z78%%5NFfdA51FH^bOMST#~pv25}7WB4Xf58~0$u4{}=eeg~va*w(O0RPgPr4dB8+ z%qj=3$Bwz)Aj-0wclfH1WA!XOZ`@z%xcg#AzPM@W?NRKTI{>G?$AEIv1=MM^*}b_X zkF)>Sp?Vs0kRL(V1I@;K5P&Al)|t$&1DRKR4c3>@P65QVy1%x4qu?_SUCxi4ok)LI zo9k98prW$d&yEVHLL7S5_(vc_qF{4Hc!zA=vUenz6u#v zV=K2OBA=hQ9d6=Byu#kWlf?+I$|e)%^Yn4Bc|v!t)3Zx2i$nm`?vu{eYiA?T@d0j! zF$|eX7}iN5UL72bK@25bW%5E&lvpS2XvOy6PgcKFV%@k0||cA zPEn{8yFuK-y$b&(&Pu()WB4Nr^Fu4opLgBq_O0axNWAC3sI#~}m`7CqCIkO~w-Tkq zPI@oV5D=xE?f1%`c8g_mov-boVesWqI4;K)lfYMRSnB$+9tz@urXyo2h$N?8-@-kC z-n*kQ2%0h^Py!SoQf3GkFA_c6!zIEj6Zdz-e%`?D&;4FxJV)2Q?GFzoCGlxo>bX6r zulGD|^52`$U3y=N*t8LPGm}?YQLEm%A36jqQZuHi$OEHcKM6^*u=h`-2@1g0z@)3* zgTvnlS_=BhRW)1r<@P2#*;3WeFWVauXl%( zN%q~nBL*-P7;MPd8N22ijHx9dJLLSk+s+_BFiH9Nq(QNl98gJd0jLh9w3&-TdsAvB zu)9pBz&nmKt!=F^^N3W+gd-OJrjV+e0N}2dL;t_-&N~{exZU?6M2sMa7M%ncL83$t zA)aR44rCrUNeAU}y+o-Ci4-o+4v530j2_;^xdUq=d4p zPR`N;?PO|T=IuNm?dUs~xh7<-*vQl2UQ=5hZ>yy?BYa4H@iV91< zL&y^T1@rR33;y)&*56Jw`c3@mBB1v#v&n}uq(^7u0v=k?%1VQwpG~gcMX@pc8VN$= zw1tlPf2_H@o(@ItG5#8?d!H|w_3=JCTdDdZOpDW)A=?~x!{VjvfAspFkhlFiQ}>ms z)+MNmS9I|H%Y8TBg)G!R6uNPIm4+<6l`=1$u; zAl2ltd*@qf^sgzd;c6{zvX<(*$rByjr@I6Y|Byuq>;r}nIrjDb-z)ZF1xSg56|MK2 zB=b}HzF`Vsaq3cDrGee-;;!dOwf5$k*N}1}IVzyF*-+a+N0c6jC5zdrvYaIQl7KiKcL1sV?JPP#BL#fGO{Zi=u9l#ei zX%^tdgc$*z=)alW{KTz-W2J9kUkHA~!sKRIp~h8X7x-UFc`RR9K@diuoi?Mh&$Q>9 z(eSoqgWxX=M@4yKGiPlom5s#1$$8BXop^s-*s_%W9bf6Hx@GT&;WNGUVYz1;^b`!+ zp)5~<+#p&$e7F>$hxi)@5D zGrN70Q)9Y3$mOYajJ=QWzv)=U<82_FvVTV_^%-$-jVUF@z(oofs?8%e)!gb9Ni|1RB?aGh1rEa4dsb$xom`1~L4 zh61$yP}O@pN;p^*dpz(ppSEL7H9Z@eut*TlEr#g#eZAdFeB+uIe{q>dOScTVxm)%i z^-2lX@RuL8GWSJ})~vZhWSCEa9lCD1AjfY`k2o^;H@zONY}6hK(CgPGnM=Liy-qfF zz<);dVuO3WM}my*fTC37z8-L{D@gpds+COK%+DooahABbU&i#x-vLF_K5qjX-p5pY zdrZwogc__xgh>qob<%%L^QNZ%jP`=M6wP}wE{K}{uS@e@^~rhN2K4+A&&8#-|L{0@ z-RgX%R#Pbv4^AIH)3~U)BcTUeZ$z0~;1Z&c{;{A!-bBoB$J7oKZ;3wzF9P7}mtwr1%tDw#?i&L2fL)^87HE1vi1a*T-Dixg`P|R_y zYAE6VI9@`*WkS`2PAd{HJJ?5QuMHA>(rzT7OE_*QFX=8GK>94@y)noz~g zc2FB?ym{3o!9@xs=?|BQ=7dwli#>|F$Xn#4r|;QWQch*Hvk?Pr9+c`b6X9lnVX8O_vY7I0u=*$}Q6HypDavw$5F_*w+p*nqz(bI}cD!k=0?!Uz@VpScxE7 zIN{SA<3}dFE~L$%h0U>yf!Rn2KOntKZqhnNIkPN+Yn2-{1=>fU6DX z%;it@9rIFLo;Bio3eIotHFXmMI|bdP@vp&~dpW;tbF6#pf4KOpKV1CVKS=uj!Qo*f z=z-jhTAhtWYVr6hU>YdUGp))Bm&r#kRS&sBslcd|Mf*=@RxjsEtG9UtK14N|!HXX1>NhL}t$-W&|87dSg zKR35au)#NdP9SJwQZKACb#%RZp{SWH#Eo*Fngu}bN)d;Ia@BVgz1qM@IWl~&V36vI zZPNq}8z%>42(ojdGNyPM=jeNARW&hV!Fj{D=k*c+w;NeVgkZede8m~Xs{=PrLt6L8 zJcK&z#N?^AmcHFwrvr9H<7H)R3K87`-sNxE>ntGy0lv87*+c6FX2}AKw&zF-B%b}; zZz&yN?J}@0Ip7oOB$dxotvo=imH{}XPVr%igMJ-*awuI5mqFQj@RKjPq3qMr6szT& zOWOLb9I@78P*;y7uwnz2z1SZhjEqjNbFv{Jif3_xoZ5a@FzRFB>JVc1AEw`!0 z^|~htE$1_W|H?%&hU3b38!Kc}M*B4M&E5g;8iHz2=l)CnLaQ)t5~i#MB1Oe?Yit1* zo*BZJ6A>wn)DSQ|KYzzTru@}oh44{pPq+0Z5z%HkYk`+M$L$B-p8`$mLe>!gcycSG zBP5}8K&*NVbLhy_RIguuIO-i?YkWw%+JCGy&5jNBlOE+Sxtblx|F|8RtGSB|BOWf| zA000EF3(1>`uWUc)lcJD9AO1KKFH6g8~vduvfkR9F*UeogoKCHsnZRbT{#ddN}rOR z`%9CCo6lfGqkmC9l~ zg9d_!)gk_+gR4HWsWG4-anYtpefywsJ}Q!wS;J4iFwE?&=ey;VaT8>F>DqvfKH$vx zSWYGfnJ-^6oCQI}fD03YYfgyhmZ0bEERC=p`_;$;Ic|{6ad0kwnS3;kuf$=*-d|}n z8yGD8jB0NGIY*Y?d=D1A`{m%pj~kq;q*zeV&crHBSg)>8tyHxtqX$M+?(VMEME%1n zjWo);if`Vxm2R5k?$T3G4O-zHiMDXzpxh7?G7v_8A4t#`Q!v@?p_^8IO3-9~Ws%O4 zf*GzPIBwP*Ulr5oAKnNzCOzCqE0oF>`4U%R$x-GyeN}iTXIXqh@N|r$OPL*H7a!ak zXJ%%-xxPEmo2}lFBTGuaKns2kgSQfe@%S(doNB$GK`vHMHI)Jo9^hJ_MFw@%jmhxX zw_yd~3J{o?Y4}{{scm_daGg*?EzEXej4X74oP9h~;IYYh^vo36X)#71W$Cq#C;^7H z83J9lc0>{w*mtf z@9Xe|vu@Q7BlVwXt(I17j+|d3N?6vyj3CpdCj;vQ2m@*p+*Gdho zt`}IbmRRM(uwA0hbyUG^fONP0KDA7Q5j{sg09k3S8NV%fn|AIUfh zsT4c2Ky;i7>5&UGVvN&SUxA|gW14rp(?#sVzclQJ{-|oT#toqSE+;6ksQ!W4@ViZK%bB=w6Xg@zXG10_MZsTpcSou@&Mqp11R@m| zpUQTg@8jpo9FDNKVp-RTju3~DV0^y86qEojQT{mnlK3R0@K<7OfBnP3Ov!{Q{Pks( z)JD!@uwuzXf=E_c^|X7vD)j$3ra%}jWq zgw0kX9BW^tzfd-t&6FNX`porETarFPsPUF%%b?EBo;@|F5zrp1vK}6Nu}sWND24q} z-O^>#&XMvxcgq<{Q=$O((LGC^5l+ruTK?O?2>KffpXiW&1EAZ_cIi|bOrFMk<>*bZ zw4Xz89pCcyXI9k9G8OD1=?>Vf^6jn0tK&(JjiY4W2NLy1O!BW)QKi<;-%2`hxYE6U zVP*SEQv70BgD42u_uv(Oo>fZ)yVJA&l^T({#)`GKEN?EeIhc|6s$7Fh?F%DPCKgjo zg#7~6U|t*Js7Ju;OP`ZvY=ITbjlABdZ{7-hBgC2<<(ffD4h$3QO(<-0%T;Uz1(n-5 zRqjx---#)l+_$qPr=dEnHG7qu>s!#fQZ1A?CP5#zi#BpL&@3zT(wdg60s8Ska!czt z=~~h#(I8V}lOPJ<9qNyli5b#ftn1zrtS}2WPkT2V-mCg~r4qZp`&UoDZ)GI>{_5S! z?&G(Qu&JgncHXg>6GAEI5gi@2%Dk6=K82z6sBHFVbs$^cg1h~3y!nYS+)>Y1WUsQQ>}llIKnpylX$CF^9or{Cur$uP_btL&9e zI*8ypFM;MBfD6h>wasn1Y*;e#>0Y_bS|wq+srYiamtO&*cAuw?EUt}w6bFP}9)gbAHbYsprA4g5!Q5|W4x*cCHEMS z*XAfQ=G_zIp&&4O2fLf3FL6<~h9mo)Hy2)=Yx4*IH|4_-d}*|H;yjaE{UP`HRh@31 z1!m;;U*ewfXo-Pyr4H#~+GKiVTaCzPLAd2UCeBwAQ>tVY(7qS#R(bjE%hTGApD$!T zXRTjt11HjRK`ai9I?`)7&M87Ij9d8BNe{!<4N)5160+Oh9=PyN`>SRhCea6#pSHom zdKPVy)@mt3)%|WM!p~Qk$}i5&?=RW(3}}BNFJ`D;A6`G02=7)Uc_3%1DNxpAe!q8L zR|TBQt#|yjO|kIE;sg<)S_3Z)g8MHU8W|?_%POBsS6h23OYEdS5Jv}7+{qMm->D*p zEcGIbi~5h(>>XM(o5Wo+_I0fwMWMWnIHj z%)?z%Z+y&j!s-OCsveAzyfGT}O(-VejVFvoDRIEU$uH#ob#t2AIpp0}r3uV#9DR_Q zF03Ur!Qab+Z0I5{Kc0uQ9(mcl^ZUMl99ISi!+uAh2+4vmb^i9XN87Qxw~Lt(zk3iX_LYqRef^KX5DAcI`!eLhq z-@fkMfy>!5N1KzK?jK`Zwbvbv_`NfZ-lI8Dc|ex^WdGvJ&X%}8XEZ;jl0aF z{jTDjw6qzq>3S?&c9Cz7^qf9Ic2vj5uo5QrvYLoUQsmk6Y#(#dFf?6zd^m+`!4uo; z(~@;6(6RSEI*pQr&z|Njh4I&|bOG^pgJ7|>_iT8v(7%#E1FThKp4$@eWV58Di>L2< z;X6X?9i#v}OREr7@Qy8XLC{xAk}7X24VQ|tP$mmk#R!MMV}6>=)NV2vvi!;3C{5>V zNojF(r{Vg5IN+c)RblbvJ_f;N-K(Znqm-Q@=|@rs$;Kk6)M5JYza=E~=JA){KQYC7 z-}dL_v%fI~|NQIj@0{|H<9AN!Uj;gYC1S^)PQ+D3=wTH2e=>?v)xi|tb-^)iNYeYA zP>O7Tgkt}_YhjM84>Kevt9)a&axl{V2E^!%8-@GBvC*!1gx6I*i(o_(F-3RoU4Ol?k%`oPI#`=ecO(T4Zc&m_d7#(K7U2z;+u`<#SSA%A`!)tm6iRhwG@- zu*>U_)2#qXoVM(7hwAhB`keGtACsH<{x+T3Lz<0`cQ+GtoiYQzhgCFD6Y|J4r6@8- zT(h6}wH;-%TtWsvP2}qV*ZNQXnL7t+5Wn*e_GyFo@4SRnee&>LNOvKH`fR0QK<=iP z4~~LZx&0i(du#mHIm~R$dvi4o0{=t-rEa1f{ZBz8XQtsmMT6S=_XEPxm4Gu%h(;ejQ=V0tUdBNJtYJbABM{up{n+U7Di_3<083k&MmuN z`a+cqh?g7vpL5-Y7P~ePNxz=@iUu_TrXWT)OSZ&HbYLPxPBE#)&_Y%}i#AW%c#^a` zEKLh{Zwi3A{t;bb%TSzs-scq3KY7@i6~it&4Qu@%hs#L9N6c56P}RBMf?y5!^-~#a z^ge0P!dzZvJ_cVZ?yj{P|3tX3(fDoD_{s|ce0(JVwh1x6lbCR0UP8&fOmZjrBY$H@ zQi^l0shR02wnw8P*#rmTFDd%w0q!ei(29T3eK;}BVKef|@1#a8pL<-IrZ5WDvTK4V zQ1*zP@TI81s{;%3vC!Pk=>0|JeqkkzQ)I^aK-}9Yz-|h}A?5{%ujjs3YZH?vyvbv$ zgYBPMco?TRhf~a5v)^QWg(fmoHYK^leBv%mrkldd(52f5$$-pNaYpyo7@aR?dOx|% zE$$3JZsEa954M1YMq)(P)8uPwJ_RlgFm+*lpnh-mHA}s~p5HLel}~@A5l9{Cmhb`uQj1Y_KQ%4?@nDc^Y3}jpl&{LWex2Nt_#)H2P2< zh1S6k40I~r>*iP~)GZRCU_>4UDCNnQtIe~78yS++ui4Q);F122`ngS_&UD!67uY}1 z%DWT_w@7qw+lWTDOQ(~kc(NdI$o5t;M!V-{qJKqfm2O&3`a48LlYGe@>$t8{%I3Eo z9yjb}_Mc+;wePibmPR&DlG^jUn>5hw%ZZgIXF}rZHLuiXnAK;e#r$qn0g26`KW8(Ayh!MfVh~>9JF>n0>b$&Mu6!Cu zMY$9(y~&wG#Oa5ywwx2V zPL(}1xJNL)7q=!Y&qe3LhpjAf z6RLjyO;*|gF>p|nK!n5Bb5c`2+IbQ^ph)Szm^EQ@I`&7K8Ph*az7~LF9O(mJ;e$$o z4Wc=Z&|KEYTnv|aGgTNB6JdPj$C3S6ZsnZbSYz~>KY~ArneT+D3Q><<{XFm=R@qFf zm3s<{1RKtwI^CY#EjiB46_9%0Y_L~9B#C9=LSsJbBR*znYLhwUN{ILKTF7$v>hY)2 zhZePuvpoTm?8w8Y(d;S~M}(dqK?{xyt2M4{1C0ibgA6urTzcJ7O_$)bP{TyV*4rF8 ze=0fEh`V3?F3WNE-QmB_tVrV{s?ZqpfDb{*Jsx?ww$6SycW5rjp%bJ<@W@e_`0%(X zR1sWHxAqi(-^)XLbW)2=d7!4gyTa{n%s}q6_50f;~XD6;z=WA(fQ$z63;?qc@^{XkYnA@#R#(> ztkprf@t+g3>C@!*B!)OOb!5AI0-WY-)_gQn;U4m0Pd^&cm&pVJ4+L9OP}H^Iu2R0@ zFPdkUKH5)o??g_&;%EBKDo8LT`RaTAdE>h&0tF5?6RP^2^G5n6crq1Lhr;^qH1I%v zaI)DxM_vetnD2a}*peFdVzR$C^@TAX6)`)tfuUC%l_sx*!_M1aP>(##cL>FX3~$XST_WC$oP?=#tH+aRBs7E`JcHqrGqOt z@ySU_6=!ynvqVVBXQ!m7d$tHHs{e+ zuA5&=Bww7sd~(=XaPww=OqTaNrNnx<-&Pdf3{GxlnBk6wy*HZSZET-0F5z()RmR1P z1YLjfjfj@k{1(D#i%15ANQ*NxA=I|9JuqE0>+es=UfV5f10$FpFAtKL@px8VluV|I zu}bZC7;ovtRt#GcJ9>Q5tQc+4C5*g`pxDV-zy#?4gIOzNB{RAS$q5P2TuQYAP5N%A z8{QSF3eJ;3KZ3fsAIAk)i@C?)E-YhUD|O97zR%C~OnI+{X1UEP;A09qed~uw`#&Jd zCnBw7`!nRuw)qgmN5@=7`PcE~dkvet6y+9S(qhHQAO1uw!g_Y_RfJb@lFs-l6X9wD zRoJDJ<%l9X$VJ_CzCyr0l{`)vm%%YiMnG8|^LE<;%O;vD!aE{NR(n~ylVsVI&ZQ;a zGiBZn!ng8GJju7AfHp%tD_u&8m+hQpvTF*(492iz>T?XcSM21I45{wD>e+8E`Ww4k zG|~bU7L|!gg0s6qDaaaXY;svbJs9u<{;FisroOkp;^5X7 zhTXL#CeG!aBc4fA#rLF`qnjjyMZ`YTlC zJiNdd&%rlseO+Thui43U3!8TNiCx#hNrtYCz7~>W<7_vUaawci7cm#a^=q0lza(ZI z%FJNWY7Z#9Zusyd5&T615PZ$5h2o81k;f{i4P6rsTgBV(qgbidN|S)kqCJ}(V~ta} z@KXPhG{zFd768JrIzQonnt^Z?x-fxYFP3eBpV zyrTJFi$2@KQs-PDLo?*y=@6NhBl8Nzp^$2aiHGjNz%pMX0lh!DpO!)|1ZET-Il{$I z!r69tJ*G3melYE`$Tb8?>an_6lS@uBV~k@!qksBYFrepTvlOpKnW9c4F5P6Hz_NP8 zqvnR1n(&4w*rUw6k%#CV0m^CUslmmO;4?sD1~8MD|3Zwrjep)>mC>l;)*zEISUyjm z6;NpdFD~@I(E^j`c98CaLg&`C)*rksq5@t%B>+-ZbAoLA)>*b^MFK?pb6Y2sbivNl zB~FraV-s5hAKGblo-t(D>Lj^VyHDoIMxD*wz@?w}&DkUUCGl;V!RgQUn_I-%X{VRw;lIk_UOsbYEb)0Q?Nt3LrV^aP z7*WJ%^Oe?GX5qXX3%^IDFHNyuZ$M`eP`8s3`?ArGm0SmTv{fLjoH-QX0~1M!8}|U$ z8?jWop%yAQEi3hlrkYXaZ)naOOj)kgFyxVFd4mJK8Ux^ukS!rpd{gJdx_p4;Q}o@n z?=i$?Sz7N$UK!96C7KeybArSTrc>p@8{C;h6a+rB+hqk86a%G)M{n4_?Se7?2BBxORxU_2r z2;};5zwz2wH+?M$y9ex_Aq8Dqa}c0@ve!WVOa;PBVE%Y)QF@9X%JD~%9exlo4wVc2 zNP%3)-%bRvcE!Sd=!XRdLjpWPrbT{?M`1j7S>m0Rb+y4H0U=w?Fxw4;hKzdi;*w}U zbj&BWycspIq>==gvM{;iQX!{mtViUQO_|p|)-qA#Ye{ijKs%wP|D^GC*Awfmp?J6D zZ|1AJx4cyKlO@H)Bg(q^4y&c!nv=Z}Z#zx#I#$7hfyGCSN>qsPxF^?(kv*wTnuB99VfLK0#2p49asI=vL| zt;*r;bR?#oTt69rA7VBgC5@J6x>GmVVnQF=Z<9$uWR z|Hu5tItgKL1H)eJl@RB;y$(Cq+5+qO?EIh=+71DYJyK2yH^macQK7Rbc#Y=E-ASwA z7_?Xnm_NU?BAeNn6?vYLky1NaT@E5#4hM=cY`DHp3orG%ls$LM)GuKV0F$;gSos7z z!-!VCKf&r=zcE}joJ^YxjF$vOV zu(k}V*&ol~3zwVpRo16tu8Q0$;#SkU1z#F3rA?Un38cp@oNHL|N6;S8U-c{q>Js8o z?HB*-Gi+LCodOJkVtEy>ZJ}ulX~luHq%iqZFqp6xEjs#4>G$>n_vM|o0s%A`p_jV% zfEqR`VB1KQ9_H=JBz*!5)X$(rU#=gI(x=fb4=))A-vtm^RG>~@IJ7Pr?LEdMHCKHM6H5UG)7K5dh{6jW^gXfEv!8T!leJb zvRPm@(zu6Y!6ve?70&dY9g}z%py|K8w37D8$)DeJFT{@`u66kp+(F=RS+JDfO|RG~ zZq;FO9@=09Xe0LDin8isFNkW@A>;2Rp4VBsN-hB-9CYRG?&;43Aq>tUAPKQ*51VlB=gjbrZZ|2FpZ~6x4g-!=9xsaDhzS9S+ zw#faTyJUvLIMY+&qZEGi<(pTFCs~!fyCx{R3;^-rmG1l4{wg1Ct32OFRzBq*fQ#sT zU**`(t)0*}i=S_i@(MX|e|mAdF2``FnaS;+8IX+XU6M1Opd;<1c|G?26IJ?mHh0C| zwNB*F<)4fo%YT?r&95!dwGMu8^gpRD+XxX+^xKX<)7ZCs-NSv;mzHwkzGHxl?b$AN zPc)N8%+We8EA39weZ|>uF7YijK5w;V**Ol_uEdN;ml^cjt>GhURhkYpUR$JP%hcK& ze6L95Ru7qTtL{a+w@X@wZyWSEnb8T^kpa4QBKzerk8D(t&&Om!*#Z4FjB~YP!X(!k(x4= z`;muGPStHJp_b7sKCt#+zuEM0QDYPxEAls(K|iqmwmTJBQ)&EI8I+Lctbb7lRh0-3 zdxp^~#>6@zSyPZ}*)IK@BWGZ7kaOp9ZSuIjK$A51e6NV12T6*$$XGnIPPbFibJ285@z`j>G4zm9y9<>N6Izl0g! zj#Q~(W5`)rg?Y)Tf%P9_k3m5XSSh&FPhMBHFFdo%znHCx==bZ$GMn-5i#O$5*ZYr(Q;8oG z#eYh0T`AD}SP~-n80E51O9Pz24$i@unP&a?NtGrGR=4{i_?j8&u`@>+tso)?aCKeM zmK^r3f3S&USr^3lq_90d0cDOy;b^pI*&eX5soXJySl7*S4p?VP{9rO>N-lUHp0RBG zR>?F2rtqQUS;EQ-*x~Us&)5@65@(l2X^d2>_4`V^noF2s^lyL)AYHm54q2N7lnge~A0gU&7$y?fb1g{zS6w>uiZ=6iJ}oDn*C%P+y!FFs=DXAO@YSL2X)ws+-P|cRj8d65 z7tv-jDs`~8BJfImu*Ttey1S_-cg_bl_v&z$P0QxzFG4xfWm(FEsLH7!k~CC_G$XgyA*r*TR_D9o3+6!$Oco~ZCU3u6_9_`pdUg*Xn{HVg<+-e; zxS*Ef*6F#^9;JzEn-8cU6x2W|^c@`1IXypX;m_+Cy=dOim~roM`j2O^q^W=9O`a-X zswZ^We!4vEg}F{1X55!8TBV8dNV#mU3ZA`5eykn)UX$q^ZBaYm(~0NC}hRG zAVKjEyjF*%#gbBF?}4on6jUkH#^xL?`)5>FJO9=LK=dBlpC@a0RFYWZW-SM|DOf9B z_P``?u^H-W#cI^6hE`*)%&&{?g1v0?U|FcG21|wOX5p6FiNaaz2PK*u$&))??1#s(PI}SvIGgmNu8I zlz$zR zdnlf$H<`-vRRc-Hj+Vag(u>NRC$D!=DVd9?G%w7)zv6q`?#;#brxWZ^H(JlF9M^6+ z_9ePPx=`J6PN}L#FL6hyEyNeAnSpR+n)af|Z_7xg32E5)S$Vgk1MfI(D4m5Sg;+}Y zgzWkJOry5D?nP!N+M}SY^_2cXCffM|dmWFXDC