From 3e911ef10449b4bf89134412f7939d69e9071534 Mon Sep 17 00:00:00 2001 From: warlegend24 <96477955+warlegend24@users.noreply.github.com> Date: Sat, 21 Oct 2023 13:54:06 +0530 Subject: [PATCH] Added a new project (Plagiarism_checker) Python project to check for plagiarism --- P/019_Plagiarism_Checker.ipynb | 156 +++++++++++++++++++++++++++++++++ P/Arthur.txt | 1 + P/Ben.txt | 1 + P/Clark.txt | 1 + P/README.md | 96 ++++++++++++++++++++ P/output.png | Bin 0 -> 25500 bytes 6 files changed, 255 insertions(+) create mode 100644 P/019_Plagiarism_Checker.ipynb create mode 100644 P/Arthur.txt create mode 100644 P/Ben.txt create mode 100644 P/Clark.txt create mode 100644 P/README.md create mode 100644 P/output.png diff --git a/P/019_Plagiarism_Checker.ipynb b/P/019_Plagiarism_Checker.ipynb new file mode 100644 index 00000000..9f95d77f --- /dev/null +++ b/P/019_Plagiarism_Checker.ipynb @@ -0,0 +1,156 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "All the IPython Notebooks in **Python Mini-Projects** series by Dr. Milaan Parmar are available @ **[GitHub](https://github.com/milaan9/91_Python_Mini_Projects)**\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Python Program to Check Plagiarism " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2021-10-05T13:06:11.749110Z", + "start_time": "2021-10-05T13:06:09.467318Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Similarity data:\n", + " ('Ben.txt', 'Clark.txt', 0.408904884400347)\n", + "Similarity data:\n", + " ('Arthur.txt', 'Clark.txt', 0.5430431121089816)\n", + "Similarity data:\n", + " ('Arthur.txt', 'Ben.txt', 0.4595329317649595)\n" + ] + } + ], + "source": [ + "'''\n", + "Python Program to Check Plagiarism \n", + "'''\n", + "\n", + "# Import necessary modules!\n", + "import os\n", + "from sklearn.feature_extraction.text import TfidfVectorizer\n", + "from sklearn.metrics.pairwise import cosine_similarity\n", + "\n", + "student_files = [doc for doc in os.listdir() if doc.endswith('.txt')]\n", + "student_notes = [open(_file, encoding='utf-8').read()\n", + " for _file in student_files]\n", + "\n", + "\n", + "def vectorize(Text): return TfidfVectorizer().fit_transform(Text).toarray()\n", + "def similarity(doc1, doc2): return cosine_similarity([doc1, doc2])\n", + "\n", + "\n", + "vectors = vectorize(student_notes)\n", + "s_vectors = list(zip(student_files, vectors))\n", + "plagiarism_results = set()\n", + "\n", + "\n", + "def check_plagiarism():\n", + " global s_vectors\n", + " for student_a, text_vector_a in s_vectors:\n", + " new_vectors = s_vectors.copy()\n", + " current_index = new_vectors.index((student_a, text_vector_a))\n", + " del new_vectors[current_index]\n", + " for student_b, text_vector_b in new_vectors:\n", + " sim_score = similarity(text_vector_a, text_vector_b)[0][1]\n", + " student_pair = sorted((student_a, student_b))\n", + " score = (student_pair[0], student_pair[1], sim_score)\n", + " plagiarism_results.add(score)\n", + " return plagiarism_results\n", + "\n", + "\n", + "for data in check_plagiarism():\n", + " print(\"Similarity data:\\n\", data) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "hide_input": false, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.8" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": false + }, + "varInspector": { + "cols": { + "lenName": 16, + "lenType": 16, + "lenVar": 40 + }, + "kernels_config": { + "python": { + "delete_cmd_postfix": "", + "delete_cmd_prefix": "del ", + "library": "var_list.py", + "varRefreshCmd": "print(var_dic_list())" + }, + "r": { + "delete_cmd_postfix": ") ", + "delete_cmd_prefix": "rm(", + "library": "var_list.r", + "varRefreshCmd": "cat(var_dic_list()) " + } + }, + "types_to_exclude": [ + "module", + "function", + "builtin_function_or_method", + "instance", + "_Feature" + ], + "window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/P/Arthur.txt b/P/Arthur.txt new file mode 100644 index 00000000..9fa79b09 --- /dev/null +++ b/P/Arthur.txt @@ -0,0 +1 @@ +Success can mean a variety of different things. Success is, quite simply, the accomplishment of a predetermined goal. To some people it could mean making money, cultivate and develop certain basic qualities, to others it could mean keeping everyone happy, but to me, it means achieving the goals and objective I have set for myself for my life. Besides working on your goals that would lead a person towards success it is very important to push your limit every day, take charge of your life, and keep learning. This experience enables us to think smartly to solve a critical problem and achieve success. It is very important to take care of your mind which could be done by eliminating negative thoughts and negative people from your life. I think in order to call something successful, both the result and the process should be great. Without success, you, the group, your company, your goals, dreams and even entire civilizations cease to survive. \ No newline at end of file diff --git a/P/Ben.txt b/P/Ben.txt new file mode 100644 index 00000000..f86f3729 --- /dev/null +++ b/P/Ben.txt @@ -0,0 +1 @@ +In order to be successful one needs cultivate and develop certain basic qualities. Success is, quite simply, the accomplishment of a predetermined goal. We consciously or subconsciously set goals for ourselves all the time. First of all, you must know aim and objective of your life. Unless you know your destination, you cannot set out on a journey. At first, you must by very clear in your objectives to be achieved. Finally, you should enjoy the overall process rather than the final outcome. There is no shortcut to success. Hard work is the only key to achieving it; it teaches us discipline, dedication and determination. There is no single right way to be successful. What works for you might not work for someone else. \ No newline at end of file diff --git a/P/Clark.txt b/P/Clark.txt new file mode 100644 index 00000000..f754a3c8 --- /dev/null +++ b/P/Clark.txt @@ -0,0 +1 @@ +Success is, quite simply, the accomplishment of a predetermined goal. Success is considered to be a term that describes two things. It also the combination of variety of different things. The first one is achievement of a certain major or minor goal. This could be succeeding in making a delicious dinner, or a more global thing succeeding in a career or job. The second definition of success is more broad and subjective. Success provides confidence, security, a sense of well-being, the ability to contribute at a greater level, hope and leadership. This experience enables us to think smartly to solve a critical problem and achieve success. Without success, you, the group, your company, your goals, dreams and even entire civilizations cease to survive. \ No newline at end of file diff --git a/P/README.md b/P/README.md new file mode 100644 index 00000000..ca83e675 --- /dev/null +++ b/P/README.md @@ -0,0 +1,96 @@ +
+ + + +# Plagiarism Checker + +In this class, you'll learn how to check similarity between text (.txt) documents using cosine similarity + +In order to compute the simlilarity between on two text documents, the textual raw data is transformed into vectors β‘ **arrays of numbers** and then from that we are going to use a basic knowledge vector to compute the the similarity between them. + + +
+
+
Lq5%fKlOnQQn06e#0VjV@VyD4`6I0CQ+RelP)aBn*y^=@qHE$s*4x-&tDA5B-!!N}IuKN&J^ zf2*1w84moOLUv&XUQfJrz+IKJi%OFRX%Q?RIm3&D_z C0XbR`)M9gk~?S zwL$WhespJfo4{q{vth4gO^eQv8j`-5^P&mG;xVjH+qlOqNa@u{VnJiK7bOS0r%9RO zH7$HTRloka-aH?E>lZnLE*a?3elQ$QjXGgG=V8>PTz9FN1nr%Xq}MwHwG|sT`d=%+ zvA-tJcwkfrw8%Ss#bCuln@-%2XBYe)&y(R+qiOIBu5(4lCRjb&&uh7}uWm0P8T(u^ z#puN!+XR5V#lltd3|A?+Ywu)P3zyoi>WpN$^&y$0x{3&UC`|OP ;Izw6NUWesqz;COuml4wG-HOxC5rc|!&zVjJaoW}(GCO6w#!;!% 9VoPhkR4EaXkBjyl;?}me;KimxX2{52E2LgJh#NE6f``D3T_0RN$6~Z?}oIbe;CrRvgd# zgyU?J&QmU~;{J% qEe4`RQSX#q!S5;4EA5lByk(~$c3ly zD>qa`= $|!Qqk`(*3mdv8b0II^Q}*J7x~QdUrc>1{(r;N<(vK+Q+I$5cNVu2eLv_Z zb>jY?a5|CIeLUl-00-(`kh^JaH3my=43z)UufesN;=NtjEa;{&(#AywZ2r0w-|Elr zn!OiV$=)G_qtjU!+Q&H7P=MPQbV4r&Qtziwj=b{=lw`pgxaE1~r~ymaV9jyFWV)3P zzZeQuz4}TKJ?wJrBxb$*$09jYqFo-H4j6wW{O$sc#1qUW_C+VLF y}2P{C6-Ru;b{IM z>VDgY*J^;w-Y*U$PJ;^vURrRE(6=;fjKM{_8D@CXwD~vN9wP?efkRWHAv9`}igRnl z$-GH;^Vx%9BTb$7>&D&PWor5?@(IQQ(~K}&jjT&Q-4^&nZ1T69JSKtYmFH_CYIttc zxnCL6hgp0%LP7dloP&u-8knI$G{+%cWvTJXak%u5_>@*yE6NdKq$C5e8{32Xjsa8# zHGsgG5%Fi-Khqf;G+|Pfan}%yO~nRtglgVC=_{l4iDW#*j_q!$nUh*KHv~8{Q7BQE z06M!7fIvuwJPTvF@CZj2Jplj@|0|^${p>*|kMvsT+Jk|vvEZaP#i7YMuw6qQQfDNo z=SO`W_7m0~wfh~f8DilvdEnsddUVT(9( Y3Df_^0R?~(FU}{DGqYHBz(MktSr|)A%}4@yceOY(u4A(WMK}(zqCyLsTQ&C zFT2vS*S^CF Ceb(( zbzN%U66TOjcwwsWU=!N}p?vvYuLybUa<(Vz`uQE`JuRi&xVTETWEy4o&Q^W GJ)eRr3SP|6IN@2H>j +{{SXH3}A82^0i*qOr}c$F*ke!ZKkDfNbfqQB648^Sp0DsNVNEYev_tV&^UaWS;{8LXKEs5WTAJhRlNy#2-nLeiO_ z3ipqnW@;#z@v@D-_N2l;tG@r{jx#yVagMbzLrjxrdJqNtoRe_2q_5;S4z=I}t?!&m z&DH#Z_*Lh0bft9`-BJUrNBrsXk8GH$tjF(0+sQ|Rp^f{*lmW7q14ec27~*T&cd>@0 zf`b~1=(o~onl-mowT9>u&xU?=$;oiLVaD^Uk5lf#ZV)!ABjXxk$4`dgk_YGhA+RVJ zoKefBmqc-m4aIwc)aD<~ErXS+eI!wJXI3jf|E +IQBdLWXbZijApW`g@jkaM<_#LwJEJj7T} z1BzXhwdzE>>C?bC#r4sVL@QUVO?d1A{UYTAX~KBUNombFtk6n! i ME%DA>KD3u}0g3*2B>4C%pZ?E33;%$sK71fOK2nJ^Nmk?N z))=)~<{@ 8uV^%LxYlq+ %VwNFrQRS==v>(&L0a{ZC95^I*wdx4fspn>CiJ0?xoXYKO{dn=VD;e*%Mp) zVsgZRwtpt9$#9RFfh|bFbaJ^9Xo&t^dH{9!b!tmh;5~NSIZoL;cax3Hnw8XB&My zC3Td>#Sm@{EPvVc`?d(EC1mY`$;yn}1c`2u5Y=(6g0@+jzk_cr+Uh-MgFht2sDAHz z``yIv8C*;}B5XUUG^3bt2Jl1U6rd5fu^g5@aITxK{LmGDF8|Py49&2*PmmWYG~~oa z@7rr~Yag(`q=XjOFH(ZZYcs~fsKp}9P2&z#w*P#C7B#28u0ZWlRUqfGw|n3f7nOKb z{z3Ximh5K6Zb1*R{1()>QtMli#1>eCHzwy6O!SL0k9ADJ87RO1nF`@EEv7(it_Q4& zJG%{aSo9Y~=fq`C?F3?aJ$pI7ueQl>%yFf_rA(~qjNV{Jr_cpc?!6>~4OQ^6?j?QI zfsHJ(;LzP33uTMcN;EELMPff(z>BzZwFZgpd`B@VpTEW>GJ4*g!`!m-hEGcAiT;{V z!RsyKI;c~+y4LKVZqC@-_LM#A{Nnpk=-jvLpOHqxsd2&L^7r(cBA3?)+!;6IRt=hG z54NLLVeth{TmEJ%x9?~jEqiDq!Sev4W4n0XLJLoND<7|%DI}l8#i+#P>Y?%BBJPYN zII$7(fpl&3a|k=9*)M01y9h;iIZQk6BZ-Ld?Hu80+6sa#9J4OS4yF=^FQ-q6~v* zAzYmtJ>O$Ah`-V2jz3HB@>GiHYUE&h39}fChmvmi>DKUk8AfEuf*N--oyOy7U${pi z{ZUFPZ9d9>1AuSkExp7`mWB0+@115{{^dhHprb#+W}(t!My|zL(~b^{qC?sd->`cs zRApd9+ep2O?*FplWfj;FBz0@QP8BO|(ridS7p$>kVrc2RVDU5a>^V6gPyas5ml^Ja zsg5{unb~D{E0%cmV$m*>LAjC1t7ID8;aZ*o(nR@@V-9VU4^K*$o*|cgWQn=aNa&GL z>#UBFy*QGjsw`QDwY>5_!~!8wzmK`n4~5o<3U})dK5Mr&Llz2=F=S}zfd&1{?!5BI zu|K%1?N=e& 0gwctGzVGEakQB-{j 7V*lnQ9)1V+S168GS;A(UQ0T7TAL8f*Lkv5jQtb$dvkl@$!HBIhXHBINvz<- z$4C6nkyB5~L|fTfJz{-}$F-rELG{V#HqLiDhHgY`aLU9q;Ehzf=z;2;ZN@!3H}V&H z44wDXOU8+2$2|nfv~Nif&IKV84&Rlw(jLaXSuH7Rl8;vJ@0rPsYAvPjlXMye-no+! zey2UDwqo$q)93%`zH~eXBaYdU%Lc>njHynW78J>aADA&!ES3?SVSGG`2(?SWtzphN zRME~U{=_A8qi9$!nT6UCJVv3<=FVD-E5G|FA}AkWTx7RlE;6ZlgW{)f4}T|n-6Z|J zDq6z&=fai~J(uOQWTA*VX<0i?Tv`$2-J50zld|?8KR=4Ha=XLu9ft`KTje6G#ABP* zmm+1g_pn;NEdhGm_(87g^+>oQf3~jh@f4aY-cb*_XLScVfDvEVqk}vW;>Mt9#jLY= zAuV$HHoqeoNTXh%o@h}6c<|Sg9Jbjw#o2M lJfMC9 zxE|LIIKli$#J26lZ5KNrAb(X|7$b8F$e_Bg*oiR`ZihQqF6;q>uC}{MR# JrC%<$H-4h=^cGj~9%YGOFqg?zAkv&n zVrKK!@>$*gA5;T(ZBVNwn9|3q2{%yTG#!ofNqsOUZy)BjckmCrN R#pPeS%y!Uuk@Wj?RN7Kx>w>Zq}c2BHs81 zWT_&I{QwzUD{2n?;MJakACJW8p5h>vWQmr9hK3!HgvLd-a1%n@X2fru$NAPB&T*}V zoyyflj9~|39%y!KjBbxWrft+VXOrycWzMKnI*(>zqY|=XWZOr)&C6+qw{n~&DYfpB ztswW7ZfZ5s`6ak_yX;i;4z|9oW `l&YtAGyJ z!)?iMCX36}!`2u**O+lhq$AiwKyoKWd+-M-cQISwvnO1|8pRWu%hg5nR(BgS`wYKT z9{ks8yB`!GZ3@3-nZC)y7L$(OVA+?McT#FB#RlrEzX4V+L@u|Y4Ls;4NDB`BA{c&p zF#hnP0C+Jc=R1{W$6b=^d9+wQ=;a@Cqks%3 $z(4LUdAE6O4z%$pJ>Pl<4=*qwD=^B`Ua}CbraWGpH#c;Y+IhXL*SHmm6l~4i z l63#+drD{m@dc?h#71X0V`FTFHY3>oH9 z%_jx)mm<#b OAQ`1~?(9<9u3+(<%ylD$8niJy6Sus)HEO_A(?$Tzucgioh>u@qeMnZf&1E0+ zRAkjXg6%D81O&r30UrUYF3k`*> E)1NCYbBo2kWU{MTM`P9?Jti%d9=XWf=}ucGsqvU3}t9?=#w~|Hc6gM zYN~8Xr`g5q?8K{&LkhHCU(M554IqsbgNFYDjvTLoN&?KIVPN-0(_~IqIc|+}R>T!% zp5Zrx{mG5dP1_J2S+YSOx?w{jR?`a#x2$fuI=AojzyX$I=3))xN?Bot*V!J;U2H)% z1YXmg0X_*{*xsy;ZiKy3A7w>y#pmk{^#_uMPk>ueV^C9v4Z#8QY;`fTA>Qrui%p^J zt)Z2vtpu<9$TSd0*Y~(LZyd?2_Iug>LpKz257cxxs*lRR*+()01J9kEFGxrbAFS%Y z{#Y O|@lGi^@f5kY8mfj4 z^Mm)vATa(qycMCCpqsVRn80EC(ir*0)5{2Z1jiF<4rW947H9Tt>WyPW<>uPEL(5ir z!?`Kif*ftUiWbh>oPMDv%fRsCdL8OA$1-UqoHfD0(^x#@_&tMpJSWrO)MzfbMD*JW ztBu_}O)q)lHz>byO2_QJWC6(9w-O}9!JAHatq9XB@m{%~bic#eZPSv^4RT?OFYNN& ze{bb8;U@8rWAg-K``-{HpHsX_ZpcVt+!b!h6+d=!k5TJQ 20e$zU|Dp7B?<&YRU&ExqDls@|rVAY_T;ol{%J`-zk$i0^Y6N|K9$?IB+X>g{>@P zSu@Y66Loo;)RsBsY*=I~MskyUNig!^2*=qenZqpfpjsJW<1(aW#8KggC9C{QnD&Rb zIC{FZ!2}YWTYv8Jo0c;1=E8gHf?*MN9Ab!^D-F%Tsr4~qlp|ARn(k;lVN%$dp*v(4 z O^Pb$q--S4}r!K_u8Gm>%}88XmDN2(~-sEAAs(Z-=VUEaXx=yQm?q~8_^;W6|6 zk Yrk2rMfuW$bO#-NS#QirNka6jPhg~WclL7n=F{AQmMu} zyGPkw7~i+UTiWxGWX5rU$J?=j4R-FXR=4kCGE0u?sGZEUjNCLU*8waizY=4o(U1xJ z#>m_y>DylQWXhBEKsjN%3yN{oJwmuZ%=%gaURY)1uJm68SaCB^%j 4njXRXi`iEeNcR90>vM#^Ry6DB34y32N4I{Ve1p<9WC zGp;e{sO;cHcSaJZo`?LIMS(x8r^DnF=#=A+PDdpy05<^#qwCfH5|p?bfURHr50ZwG z5C j0dLh*BgQz6ZzmKc= zt@jAM4i2DWT{{Ih4ZJQWBbU>v4TJa4A_X&tBB2YBngrdwW<+t6Z5f&4$u%B`cp%p{ zNGiSfv9s$-9!>ko(jVQUBQ##_GCWu_b<;YTjX>|XUV6P9+T=6n*62{tEN36Zhx(Nl zYg(hu3>&ViyE#z`O#ZNF#{W46Ej3#Mv&!rMF9R ADyKb1Xjbh|e-1S@L{mxu+iEcbAViMJb_Pm5`OL+0UjC)hd_5NB5<9(K@GgzxKG#=7YI4!2fg zG-LzDq11}$djCSaAu3>@4b;^G`M6S@($o99PL*IdSMAPW`}5J`>2O4_DjlTF{`|N| zm=m@)m?)j%8M|F#9|)3&cq&K@{SP>+csKO5B*p;QO$3JA8tpBu49|n-02$~2nI8^b zBL=@;nA8 v~}Z(kF>qU9jAEG o+j95x7=NGiyDW)`7J)Ew^1f>7Fk 2gg|ZKa>w7LkF~X5R%d4tK8~r^!YiY z|3(VJ|MQ0qwaA~RpHIAh=_vGxpYNZqJ_AYIS iYtzUV+7VkqpSq-<7k6qg1f}9`@~} z4Et@Muae<^w0B?8a5d}#$D>8>Ejmf`UV_081fxfZ=w+g}h+ZQ`5TeBh(YqnKXwf@^ zG0{6g^cKByM!xs`PFd^RoU3#3uC=db&Ds}x?KNv=KmX@9B85t=$Ngo$i)M(6ayI35 z$GE+%2o|~2I!R%js~f(n?rz$EU-e+@KVu4H_#Eb%<2?izz5Pbjg%ce?Xd3u{EQu|$ z)52P<{>9lrZw=#OGeA5uGv#URMM$@tPh;4s`3p6^y1_LT{xI*Se~Aj?A+D&!Uj6IG zSVwOx9CBdHt1+?+!Wehc6`}~IHUR27XyCcz)%gT_9o;?S3;& iI1O!Wr<-r;2GvgQ zTm#f0LtTTqT$XOXyL0g@x+ZkUd9Z^)!QSm-q%Xd!gRtg~ys6K0;sV#R&EEIs;r|I% zx3{FDG`=pbc-x8()IqV-E KU^g+P!*s^wX`}o>TS02n zvNFV|nZGtM!At9^c>p{dCUM#|nnA8Xk!3gF?em+IxJ L8l)H&H=k|G zrbD2$FlEa2s~gick1T%Ahp>n%;}%~JLVaT#$aczG07eM^9t*wy+w8+|tTl+}8L9W- z3aQi-QI+sSx%1*PZ1JuHy1~KDRa&Z@cw0={--(5tK+L~0lOL1~Z>`sj^Z}F@fyG2& z38Npi$nnAjyqzo?8T=&ph*pwZ8jQjHm{9^_SQD&g9k?8#O1~o)kkR&+es)`JbG+zUazn(@zmPt7#||2vPZ&K1eH$U&z8kBz0s@cCyjD zHuv+B5M_v4Ij!y1>!u`I>PaJyK`Qw_^d8J}GjN&L6@5FX5&dX-MB`uG$Z!r2cDmw* zCs`NkxQvoKQc=YNqU+OTNY~clISZsqcp9$KlHsR2GZtdmk;@aBO9iC1t7n1xr~evx zLssXaa>=tjr)S)Eh$6L?#CN`}WNirbw^^{N40Z{+`r9`z#71mjd^f89i3&$tQQ=6@ zQnGZc;*DYxJ3xOt&px0^^o!{$72jGGR?Vt&c)OD(y>(Z)oO9Kw{c$7_stM^2GreU~ zJ`f=u*?$LuL1({Mho*`KFnlG1hblYvM5 d0NtJtC=xw!G zAgle~kf=CYT`uMYSqgSM4F)9&96!?3l hWEe+4^%M;O~8~>{tLa;@cy8+k^ zdNjYx5(g9G_}n-hIz^RwaBVVFM{wHX+i)I$c~E2OjEWxTU-kPzUrObS80uc|&I^oD zb!fl4-Bqh4XnD<#9z&BzQyFd8d}DVYBAxnCRM%}`UGbha>7HSWI C#fdbEQ2?0W+63&%fY{kVz1?_F$&he?Wf&XiEWti)zM-SE#DV@BGRfZuN{0c z*oqIHWVKX1xnU~pXU_d<-7HbLpcL(#^aEkgS$)@V97g$Gn@; y25{?W|uB&R=~!<$;Bhq^;; ze>{f?3-KIe#H2{uV${ o=f{V 5kVsTMlC>LC7nR_Qe_e%OdYFVJJsc__4tL^@E7MtZOaKBDJ+-8E@!WjTIB zQn%o;(3(U7+64qXhN&M3COJl71gM!H6VryG2->2PgU##E<39Al5k-aVO3NWE<=5RT z+j%jgQ%}z1w{Oj|>`TR2cNMG13govhyv~r9Yy-2>zfJC49UhZ6UVA+kzBnS7mA**9 zp$1>UzbnnbFl)OW0UhL{X}6dH10ZcvtiS{%%)pj&2FNAjYW {yMNR7)efz+`~V^Zhq^Fe@nEQ*|Ln&_i7qCSC?S^FfkC&_ikrtnq3#+ZeZd^ z`Q8CqpU}kP&mkbIaz47CnFHFIliLLPyUjmkp$2@om!YmVx v0^_-1zi zQ}GI`Q`u}>Z(PKe3V(=`1idzY2>`19LRj8{c5%?>MUTUU=T>atmCqt?CgeV_{*idZ z`lVndVh**4TZ~;95-;0Jo8>V#&Ep;%9}+N$5Q(Nq#IiZUdViW75bAmu>)Fh%FSb^( zVa3W6BQM#&l`-;UZntmk 4u~F_?P~EfS4OFz4sHjXZkuGd`z#~(r371#?l@*>b-^hL? zseYf5!)FgpJ{RWA%134E^O;e1q1^6cZU}y>O2&v2>T}wOVS@A3=Y%&Of5{KGQaqWB zogTy;zhfd!Be^h4 vQw7#PJ|9BPP|sOM&cA C998;X4f@KOc8@HQmOQw|q&MX8hkB z$XkbcY@PiygOy&@V0LxG?qMj>V>r}kTf2f&TwRHnNEzN!YUTbcaSvJgGuL9veX3I< zXRaR~+yBC)QtDG$DX)^7O6Jd8j)%`>HnkWzH&pd{T?0xlGLkO$v?K{YYg?6i;i~*x zmZ7XnE%_d-j=_(np(S-16f1c~oUMX(D`Q&iYgtm121l&2gD?hio){G|ymAku?Vg^D z+{D^Y#G;#hMkx9#eu}HE?%De=VoI_#e)|4)$E`XM0y-aQJV1sf)cajpPkPC;9vC{0 z2Jh#WR}5*9uNNO7;@rQ?Vc}HF$O!8#$(Qd)X266k8PT#6LJKIg9z*V`a616g%Fq$d z9-&=ahQUQ;@kl>+x>ncA(IWti|L5mAL;iJ*-A_g(CO H~%1gZJM**yo8tPwe7t z*!5x77*?}HMNqlqu~h8?y~%Z!34TgR-t{a~(;cB^VfneAsW5;%z6xF{iFQC24fK5@ zF#WTpNRu|WZ*^Cz$j3;XzKp0zG18Vkx36>rtT8GuWbyvUK%b57;aD^b$eYiFx1lf> zdLj+ux14&XOUxIr1F$!yqR+mTCgIm};i4>oe{lC1U9GIxb$#uL1v7XSMwS|eaAT;U za~c=sWfZ5Cnwp=EpvPkG`Z}CNxFP>Y6}=HQ5}VNnKqIq>N>&Cfe6UeSsikeRvu|R5 zEWR@dy{^+B0r0Abv!m{pj3t}!==H^_xBL1rt2*^?FP}@%tdsT>M7aQyXm5$o8Vljo zp<`S;t^6=Z^-|PpN1tJW43*Y;s;I=|j2WkL(Y^t1R|uDvxg&arb6M~=Jb;&@T#mRJ zd5qy?Md3u_i7nHl@l;_28N=%7Q`N}zR06u% u88{y<%u{DIi6rlH`}>{}%_qH&G3$I6XVb6gtjR~s#M&=Typr{VQ5Lu|LCi=K zmD?t#A?7H&tI(5+8*=KnN{StcNBaBnx}M~mIrM~Dr>}WbF_?bvrvxZPCt`{KpU8`Z z3>C$&4Yx`N(L8N1ey2||X-OYX;>|C{yFd1ZcTpVUPxuhh-JV`TJdUw#e*bQ9_M6m! zW!A`GG5u9#nLA*zm^4XZ^xM%!;1zly*bf@-gy!VX4=_J`Z)`=*-2D@E7ILZy7&52I zs+BMi96$FirgTI8bCe1;`#>@$j=f`en68#Y-6h(?gXV0{(ISjl*_!t0du-Z0w5VAh z2Q`=^*NVj|i&|7H${|*5`4j6@tKhQlyj0Ln_n;J;{I?PxnzAGRsu)I+?<$7a oLFF7yj `SN>x-hHcik0xl(}l>qPz2W` z)5F{MnLy4QOS_J=-scrILTWyWbV||{`tL;}{9_oXvYoEb7Iya*=O5fy$gljXIUp<& z^!ZhzqrasXX&a0rqr?gJ`j|CUv*e137iOx;>J#ZG*+hel9VG&`x>i*j^ZL Rrq#GiXMoEjLOWBGXy1veGY5K2ZG>g=Ok)5CwaRr}8?Y zdiKQ(6>;lHZ$F17RhaXS`~Bdwh;8G1=9_P?sRTHB&gi3d&GC{`DCiLQrfok|%tvO; z-A-BciCbULZXP)`KOcZ#H@987I4U5~6#lbMxKL!^etP=dHqc%`n+d9#Hr}JKkn3~$ zl6+c;(gNnJInz^3{t-=A$KrRG&U1!sfMOVRyIn%E6335v=krYz )V?*Mzw%jN &Xg5 zJ#cgm?Fn}fr2#S6-fS_LK8V5OEy!`395Wf+pwWwt+xf7;?*5j&;aq~NIcq@1CW=3P zd!#ar7*=n##xJt-sd3wOpk2FpcfA9i&ubC|((di5(vMCyx1*)eAE!E%x(#ia{vels{n>D *r+>~<$if_)hpDk-5N~{^Sl>wm~U &ME%6X0By%;F zbYH;ZoUV)4 qe|k&?|}zoJ&_;NA0fNHEqrb#>bT1ZFwZ@=3SMJ2 zi3ViBCPWQp^up>bGYy|h;t7vG->)->UG>z-2ZBW1i9>;H@VLZL0NbTMqg@0!EGAdg z2cM 3 z4qUCYC#^EO7`3 XrtyX2j`UjQAyHC7eZgs*UdbsMVFJ#A+*qw4(|E$nkhcpo4344WFO z>TnKa{$i3TtMH#6e#cvsS(fOO=P;WI(G3i&cRL>ib!(5{418`Yo_ns8|C)zv%8m2c zHwj+txY-X^Ue4cst*Epqo8`vYORvM|3 W3V-%!tXwUWa^ zPdR`fUBH}}p6U~+Qt{bWLE^;E(P|gJwGJ-loXW{jI6#v55FB9SLFX^}yjuIQ8K55& z8CRgmz{wH9&^Ju>qH5cwavPY5qY+@f^pFAxRk1l%kB)*03NO+|K>hQ+N#X97LJkck zN7&x%;7@zQ6il9V^(#KoaS{k9*cVEm6P;hbb01PHY8!R+X5Jgi6v{HJILt+GO;`ps zQMmXyB@Kubb(tEkLc791Qf4f?MTe-xJjo3qzniJ=j+TBUHd@`1I2x?dTb#KAG|=%9 z&j|M97_{W(Wb6G8>iUnwt2ZQ0KS-2Uvqk3}fUO4Dz%YLD1a?N@QmbEsG2H#W+g0AE zEj%%Qe`|G+@eOVUBQSQ)gQfb|_2r+1HH$N9qmH?k5DUqg&oYz{o*_hQ(FE#e9hu=F z`kB+^IZ%`88 ~azRi3BPiJ+jxdYF>f&yp^bci|5~aRuTTiji&-W`Gn8VCYKCF3!;R> zfo~)!k+7}BUp(>O;ixWuU9XnTCycr0)%`hFn$0=3(Jiw@ri)DM19wReC&5Z;Sv_HU zs?7Oq`RW^*Ngn=mZ;Y>9%;Q0*a_ebMifx);rboB%P>SYc2mH-DF`baUD00S@#vqWa z z?ZVy|oi7Py4Q$zodyeIeX&hY^DSi)@G@Q$iL z9leF`Apc%Q )_Y;-|LIad{>R(zX5hj9rx(j^CT=gx#P=ot hwYccYeD5YuAs78v?cK&D>K`@kDJy6^E0r^c{0AWCK>Yv! literal 0 HcmV?d00001