From 1927ef6e6532827b752170afef5ad1126dcfc1a0 Mon Sep 17 00:00:00 2001 From: Nemmo Date: Thu, 4 Feb 2016 10:11:13 +0600 Subject: [PATCH] FileController upload action tests --- .gitignore | 2 + phpunit.xml.dist | 2 +- src/Module.php | 3 +- src/controllers/FileController.php | 23 +++--- src/models/UploadForm.php | 5 +- tests/FileControllerTest.php | 117 +++++++++++++++++++++++++++++ tests/ModuleTest.php | 4 +- tests/bootstrap.php | 18 +++-- tests/files/file.bmp | Bin 0 -> 11078 bytes tests/files/file.gif | Bin 0 -> 4294 bytes tests/files/file.jpg | Bin 0 -> 4279 bytes tests/files/file.mp3 | Bin 0 -> 15932 bytes tests/files/{yii.png => file.png} | Bin tests/files/file.txt | 1 + tests/files/file.wav | Bin 0 -> 63128 bytes tests/files/file.zip | Bin 0 -> 2079 bytes 16 files changed, 156 insertions(+), 19 deletions(-) create mode 100644 tests/FileControllerTest.php create mode 100644 tests/files/file.bmp create mode 100644 tests/files/file.gif create mode 100644 tests/files/file.jpg create mode 100644 tests/files/file.mp3 rename tests/files/{yii.png => file.png} (100%) create mode 100644 tests/files/file.txt create mode 100644 tests/files/file.wav create mode 100644 tests/files/file.zip diff --git a/.gitignore b/.gitignore index 2ebb444..65bc83a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ .idea/ build/ vendor/ +tests/uploads/ +tests/data/db.sqlite \ No newline at end of file diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 8ab62f5..73675e2 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -10,7 +10,7 @@ processIsolation="false" stopOnFailure="false"> - + ./tests diff --git a/src/Module.php b/src/Module.php index ef88073..2b73481 100644 --- a/src/Module.php +++ b/src/Module.php @@ -4,6 +4,7 @@ use nemmo\attachments\models\File; use yii\base\Exception; +use yii\helpers\ArrayHelper; use yii\helpers\FileHelper; use yii\i18n\PhpMessageSource; @@ -27,7 +28,7 @@ public function init() throw new Exception('Setup {storePath} and {tempPath} in module properties'); } - $this->rules = array_replace(['maxFiles' => 3], $this->rules); + $this->rules = ArrayHelper::merge(['maxFiles' => 3], $this->rules); $this->defaultRoute = 'file'; $this->registerTranslations(); } diff --git a/src/controllers/FileController.php b/src/controllers/FileController.php index d049a20..39dd6eb 100644 --- a/src/controllers/FileController.php +++ b/src/controllers/FileController.php @@ -5,9 +5,11 @@ use nemmo\attachments\models\File; use nemmo\attachments\models\UploadForm; use nemmo\attachments\ModuleTrait; +use Yii; use yii\helpers\FileHelper; use yii\helpers\Url; use yii\web\Controller; +use yii\web\Response; use yii\web\UploadedFile; class FileController extends Controller @@ -19,8 +21,8 @@ public function actionUpload() $model = new UploadForm(); $model->file = UploadedFile::getInstances($model, 'file'); - if ($model->rules()[0]['maxFiles'] == 1) { - $model->file = UploadedFile::getInstances($model, 'file')[0]; + if ($model->rules()[0]['maxFiles'] == 1 && sizeof($model->file) == 1) { + $model->file = $model->file[0]; } if ($model->file && $model->validate()) { @@ -34,12 +36,15 @@ public function actionUpload() } else { $path = $this->getModule()->getUserDirPath() . DIRECTORY_SEPARATOR . $model->file->name; $model->file->saveAs($path); + $result['uploadedFiles'][] = $model->file->name; } - return json_encode($result); + Yii::$app->response->format = Response::FORMAT_JSON; + return $result; } else { - return json_encode([ + Yii::$app->response->format = Response::FORMAT_JSON; + return [ 'error' => $model->getErrors('file') - ]); + ]; } } @@ -48,14 +53,14 @@ public function actionDownload($id) $file = File::findOne(['id' => $id]); $filePath = $this->getModule()->getFilesDirPath($file->hash) . DIRECTORY_SEPARATOR . $file->hash . '.' . $file->type; - return \Yii::$app->response->sendFile($filePath, "$file->name.$file->type"); + return Yii::$app->response->sendFile($filePath, "$file->name.$file->type"); } public function actionDelete($id) { $this->getModule()->detachFile($id); - if (\Yii::$app->request->isAjax) { + if (Yii::$app->request->isAjax) { return json_encode([]); } else { return $this->redirect(Url::previous()); @@ -66,7 +71,7 @@ public function actionDownloadTemp($filename) { $filePath = $this->getModule()->getUserDirPath() . DIRECTORY_SEPARATOR . $filename; - return \Yii::$app->response->sendFile($filePath, $filename); + return Yii::$app->response->sendFile($filePath, $filename); } public function actionDeleteTemp($filename) @@ -78,7 +83,7 @@ public function actionDeleteTemp($filename) rmdir($userTempDir); } - if (\Yii::$app->request->isAjax) { + if (Yii::$app->request->isAjax) { return json_encode([]); } else { return $this->redirect(Url::previous()); diff --git a/src/models/UploadForm.php b/src/models/UploadForm.php index 79d5437..64dffcf 100644 --- a/src/models/UploadForm.php +++ b/src/models/UploadForm.php @@ -4,6 +4,7 @@ use nemmo\attachments\ModuleTrait; use yii\base\Model; +use yii\helpers\ArrayHelper; use yii\web\UploadedFile; /** @@ -17,7 +18,7 @@ class UploadForm extends Model use ModuleTrait; /** - * @var UploadedFile|Null file attribute + * @var UploadedFile[]|UploadedFile file attribute */ public $file; @@ -27,7 +28,7 @@ class UploadForm extends Model public function rules() { return [ - array_replace([['file'], 'file'], $this->getModule()->rules) + ArrayHelper::merge(['file', 'file'], $this->getModule()->rules) ]; } } \ No newline at end of file diff --git a/tests/FileControllerTest.php b/tests/FileControllerTest.php new file mode 100644 index 0000000..77b76bb --- /dev/null +++ b/tests/FileControllerTest.php @@ -0,0 +1,117 @@ +generateFiles($types); + $output = Yii::$app->runAction('attachments/file/upload'); + $this->assertArrayHasKey('uploadedFiles', $output); + $this->assertTrue(in_array('file.png', $output['uploadedFiles'])); + $this->checkFilesExist($types); + } + + public function testUpload2() + { + $types = ['png', 'txt', 'jpg', 'zip']; + $this->generateFiles($types); + $output = Yii::$app->runAction('attachments/file/upload'); + $this->assertArrayHasKey('error', $output); + } + + public function testUpload3() + { + Yii::$app->setModule('attachments', [ + 'class' => Module::className(), + 'rules' => [ + 'maxFiles' => 1 + ] + ]); + $types = ['png', 'zip']; + $this->generateFiles($types); + $output = Yii::$app->runAction('attachments/file/upload'); + $this->assertArrayHasKey('error', $output); + } + + public function testUpload4() + { + Yii::$app->setModule('attachments', [ + 'class' => Module::className(), + 'rules' => [ + 'maxFiles' => 1 + ] + ]); + $types = ['png']; + $this->generateFiles($types); + $output = Yii::$app->runAction('attachments/file/upload'); + $this->assertArrayHasKey('uploadedFiles', $output); + $this->assertTrue(in_array('file.png', $output['uploadedFiles'])); + $this->checkFilesExist($types); + } + + public function testUpload5() + { + Yii::$app->setModule('attachments', [ + 'class' => Module::className(), + 'rules' => [ + 'maxFiles' => 3, + 'mimeTypes' => ['image/png', 'image/jpeg'] + ] + ]); + $types = ['png', 'jpg', 'zip']; + $this->generateFiles($types); + $output = Yii::$app->runAction('attachments/file/upload'); + var_dump($output); + $this->assertArrayHasKey('error', $output); + } + + public function generateFiles($types) + { + $_FILES = []; + foreach ($types as $index => $type) { + $file = "file.$type"; + $path = Yii::getAlias("@tests/files/$file"); + $_FILES["UploadForm[file][$index]"] = [ + 'name' => $file, + 'type' => mime_content_type($path), + 'size' => filesize($path), + 'tmp_name' => $path, + 'error' => 0 + ]; + } + } + + public function checkFilesExist($types) + { + foreach ($types as $type) { + $filePath = Yii::getAlias('@tests/uploads/temp/' . Yii::$app->session->id . '/file.' . $type); + $this->assertTrue(file_exists($filePath)); + } + } +} diff --git a/tests/ModuleTest.php b/tests/ModuleTest.php index a1214df..6e8047f 100644 --- a/tests/ModuleTest.php +++ b/tests/ModuleTest.php @@ -37,7 +37,9 @@ public function testInitException() public function testInit() { - Yii::$app->language = 'ru'; + Yii::$app->setModule('attachments', [ + 'class' => Module::className() + ]); /** @var Module $module */ $module = Yii::$app->getModule('attachments'); $this->assertEquals([ diff --git a/tests/bootstrap.php b/tests/bootstrap.php index fde655e..815dc81 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -6,10 +6,13 @@ * Time: 9:46 PM */ -namespace tests; +namespace yii\web; use Yii; +/** + * Turn on all error reports + */ error_reporting(E_ALL | E_STRICT); defined('YII_DEBUG') or define('YII_DEBUG', true); @@ -20,7 +23,9 @@ Yii::setAlias('@tests', __DIR__); -// Overwrite +/** + * Overwrite functions for fake uploads + */ function is_uploaded_file($filename) { return file_exists($filename); @@ -31,10 +36,13 @@ function move_uploaded_file($filename, $destination) return copy($filename, $destination); } +/** + * Run yii web application + */ new \yii\web\Application([ 'id' => 'unit', - 'basePath' => __DIR__, - 'vendorPath' => __DIR__ . '/../vendor', + 'basePath' => Yii::getAlias('@tests'), + 'vendorPath' => Yii::getAlias('@tests/../vendor'), 'modules' => [ 'attachments' => [ 'class' => \nemmo\attachments\Module::className(), @@ -48,7 +56,7 @@ function move_uploaded_file($filename, $destination) ], 'db' => [ 'class' => \yii\db\Connection::className(), - 'dsn' => 'sqlite:' . __DIR__ . '/data/db.sqlite' + 'dsn' => 'sqlite:' . Yii::getAlias('@tests/data/db.sqlite') ] ] ]); \ No newline at end of file diff --git a/tests/files/file.bmp b/tests/files/file.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e148d137a003c3c9fd6ea9d10de1db85197a346f GIT binary patch literal 11078 zcmeI0zi%VC6~`GMz|1s3s&kp?5+ME6gA~`LQ2;Nn0=!cMc4NTJ+E*U`4NJ{nPjH$; zTv_h4EK=n^P>^CyN_Em=4~Rt-DU{D6Ir2yv`Nud11c@nshC>edzI>05W7)s^{a3$L zu6+4(rGCTR9|J#AvFrckua)}CFFdYeebGwsqqO!FS8kOtMw!1G_2XZ!lu9$mfd^>; z21=ze1u1Zo<)EPe1Eo^Af)p~Kk!vWxKpAvX>I`zwP=J9_DQ;DfLIyc#D8N9;A{C^N zK@J)UFikM+xP=JBbr$UiZXOM%20t}QsO-xFiK@J)UFi^S_(q&4WK@J)UFi~OK&&S22* zM6N56{-_hL`qJ55a^K}4jZUAT-0*-}%=ZT}l*^tHG`c(WYDV#YM?$ zxQSbSpkaM+QE?jmfnPo`3VskkS?RuVuVI@s;%-L@%XAuU2(qqmuhH@C{TfxQwlv=Q z{qV6G^u1Z9Q7xaK1wZ<3fA&d`QI*DeKk9pK-Bz!y1&wOxvWnGX`{6aXF7epL-6-xX zIU^ko%Ai9|hQ=RccgbOws^O`{cWWi(Y**55PgzR1vDhK)2Xc>)>*FlAFuTUmp9CLH z37;FvlGv`dai0z=$7WBFB*zCEM{;Z<7SBMb<>KbpSkCf_?2?PSlS>@Sy-ajx&_9x% z-Qx3VxBodke$V#LAl|a*7nR2}R?B|Z9rYKeEZwPpfq~bluMzm4i9nJhck@N^)A^J9 zCLZl1*uCkK=1wjzr;nOz9MHQQOCaWr59xH_!Hpyd8a8o`hic!njea!Tjy|xV z$&`KXA#wRFnxq*ElIqijp$8gX17BojW0||uMPV$lva}eP^qf@Vgq_Z{#<2x|7Uyelse`aWWcp$#pB2!}JPr!K6C_P z?y1WwI~hw<>E53w+kQwWP;e5H$?jQ6dgG7|(}_50C*R9b5?^gw+taQ~Oo;SWNhXt^ zF`ImF8qQt1o4nqdTs1#j;ze*{wtE`InD=frktJB%5kGuY8F{2mdbsV&53`vMeQnBr zL}L{MCNo#IcVv%7aHqDI2XE(I#7oTXw#M#g5HiMy#*^N1!JKGJgTzj-2z>bE#9D}? zZKrWJT`RC5TfZY}8dH}^UL%=Jck^Q_1RKrSy~g~G4XMkBF~3Li>D2l0!<1MhvxXep zFuK)Xf|NO*J2W7D3~VlDNNZ)~gU>m4@4_xifBkwI25H zjSCDjC?c_tzn5ykO7PA%S%{pTHX1(s5~Y8NL~P@s|D((=E#bHM#vK~sSE&4>r(Kh| zIDtfDN26iQk@)^QMY0gJ`F!p)eDyTzVbnqt7BPVuZHhe0%EN>0r^Of-)^dE^l2}o>zp&T+58t>o#~+7MA{!H{(U5(wZAxvv zC8%hGs`lW)Ta0~_aw{4!_iK^HY3#h@akAHCUtgbnEd>=ch!z@7Vl=$iIEs5M?SFtNu`eY^+m3OaYZ130eor`wUgH8k&d*yrV(pc9A*B{9r|~hkK@y+eh(_Dgve!pmVXYCO zb$d$`hu#kn;HPDN9U`}gfMP7c3t`*H7yhME?R4e@7nCREZEttE;SFTTRib1r>DaW7pnnJtaq1Rn~2EiDQVj_QZ-Zi xZ{@XhdV1=oj{XEb6KD5uY1%T(W=_OMD1Ofqn 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 M8Sy`PL)!HJ08~%#l>h($ literal 0 HcmV?d00001 diff --git a/tests/files/file.jpg b/tests/files/file.jpg new file mode 100644 index 0000000000000000000000000000000000000000..628ad97075264f399663b52399a3d888648c08b5 GIT binary patch literal 4279 zcmbW42T)Vn)__k45L!gKAP}V^O_~&eSm;QX&_zTAq)AQCK&~PLk)kM|C`AxZP$JTM z6A%%R3rL3~fJl=>S|A~L;lBI7H}lW@Gyi+*>@{nhIcuL;-`;E1K8G>JzypUZO)X3T z5C{ZZW?le;0NgS``CkVBYir;H000~SJ4gdyVS0j0MSwv78`FZAdIJpp%O3cE{o#N5 z2RHV704vilU2Xw;{(t)iaT+Jpwe(Nw>TBp7(>STGuC1@F$&5_M2Y`w+#w2haU;%*+ z#@_;F10M)GD=U}{!VZBPCKPzVG4xv5HFPH(1CyOl7s07vzUX2 z1Hy3-@t+B!4dCMdt^!xVASr-_4+Q1|F+Kt?W~OY+l{#3gzXiksW@Te%ro_d~45&WL zOdkwpVJ6GQ%3K0a4D&g_%E!ikT>UJ&fW0?FDpXM8&ZCzc(&sALg&YP+GMZPy?s9So ziyRRZla-TKP&}cfeM(1HPyf8JiK&^ng{9*~Cxo+$tDDc&YuA1K{BMLuL`ES|(YNC6 z#V24B?S;*!^INe(dV*`PBRQ&!ORw@1tYm z69nSi{KAjLpG(W+-y54-+dGuqy#p=~0RAV|zsUX<7ax<0g}Dc;kOM9d3zDf|K32Bl z>g@by?IGTw0#X`xI0VlZl^MUy9H?3{in3hXhKSe{m2%Ke`(Taq{Kh_wv}wlrmIMJ zz4-^HCwM)BjiiOHIX`cIs)zBg&vc_?s`C?{@DsDnZ4Mb06Wd9_eT}QtZq3?8i3KfY zBn(YBj-ZpYo-P_OE4E}`&j7q4OF9N$Zy8X!QL4QJb;v*-aR|J7i z6?(2O2dv5O4?SZ5eq0Ofz9=4#`jaDticz*+jp3DAgycz;G^5kJx~gmbJ8P62Cqd^p z`esfSZoVs-a*S2jXB;FRW_|=(e(f27bOd?7%PLce9Fx90 zkn_$>Fn>|!<+`Br;(FUUMWHpNNsnwKOs>h#?!jt{B9tqSFW7{E zdJIN?vN{xfw2}!dPX#L}e!6_?a6sH~qJdn9jnm0mkMe#)vDM8Gvt{qN?xByxgrPzS z6G7*uC^kX+GkyS z;NouSo)b$O){|eTvrtMwuE~oY0WZt&2lw)>P9S%+a0}tTb=oC``A!B3rVT^I2qp34#{4=krSKuT z+z6XWF>sE=PXp#63;RmDSW$h-jjtLu0uMH<;r*~dz49O{KC5hg$9q{;TBGxW+v}^f zR1*f!u|!&`8vd??;d42rSqgma4%&X0C- zCA<OR_-*Srf7i53+?v}akl?>Be=FsUW;!dQ`-!f}f z_i#3|$ny)+$j;+nboHJURdIP}1yh+7=UXpZ?5Uw^Vd!E;eQ!IgfWvC@a@fAR@!n

b;RUjC9D60Z8DC%N^%1-6}A=NJq18*TiberJTaE zKR(1^b9%YOt>{DbP7)uc$R4Ps=iE;x5~PxEco}C~uT0i{n#sK84iQ1*n6XwzMY$o3 zkozwUbc$&Lbsq*N5ed=NP8tOoYv~HZTfzA(Q{e8X+Mteih9!`R_)1!j}Q(JY4PV)QTe*2S|PE;(k1 zgs)NYpS2zdK1#Y8e)pp9_a^u@p8O))w{v~G`C}?{`#D&kG2PM)lM<6)o8Is>!(VH7 zDkHnK^XQJ*;}?sTNoA&rC2S%QYh()*E#EP^7I`r_A}yr_Hn=&>#f^h{nKf*0*7kGu z4(J`30FGV$)qhJCeU@rRdAAD3zs}=+%bF~VdRsT((Wf2L>LHrTXJ2&Aa%NMlVB_}k zIz?jly2|&mODe5VQ6sx5RR}MXy@}AgWZOZNI{#3kiCa_6JW&W9YAN}# z-ib@HzDYKH>pB(hB%W#bhY&TC0kHnq&t0d3V+Xd^%iF%sNRy>g&h0^t+%}#}%n#Yl z2y>B4UOnxcNpG7anY4mqdnWpE_qV9qGn9#v|HH{{ zbV6t~6eIAh8&`^N;ht{BP4wNqwM9b*^AT>1DaHhdk|%mYg4bI1wHQEx(nc1Y+k$99 z;$1T&!Q5KBgI<|MQ&+MG(tOjCjq_B+{@4`f-aHZllZXMTaQ7O#5?XYcH_P67Xzg9N z<#BCG$@y$`xwP~z1!&bTLS?e#41@;}Q7IO5_UjHJsj<@9Q%z+6bKkGDK7#n8FyM6W zxTn_YY;KPt17I5?TQ`@i`V?GppE|FlBPmtwH=oj}oOJm`0&65IQiuR2*|!Qp;RN5+ z)X9qNW~s5Q6>1}ljC47 z{xchAE`4NgaBh|&7lLi|x4j2r3#9qKUTL^qMrt*$iuV~RNVc`q_T zl}mVeQP=wg*G?$~Jt<+@EN-9}!r{6%ofq^3A7J+`F~_syG|oy!(B1@vtzq_CRZP2S zQz$V=rw7h%pqQT~=IKi5ywsZJI7E{#GkLW<@g!<5aN||zw1u*g7}jppV0fzHA*U`Y zcv)X*(NJW2pq2znTp*nxseR;}qhMb8H((!Zr8qhc{qW*(8wmc*srut~P3E$3s;Hak zJxhy}L{;-Xv>|hogln3bNuD#cqyZu%9xYEkH1F;wd2D#r`mjfEP3DrMi*!RkqSMRx zso*r-?lb*BjD!ig0zwn~Wo@IzVOv5Ip%ljWkQJYykA{8lS1)f(Os3W};{zg3Dp~Th zhm{Q(Af~)X_WN9m7PS@F_Ded?i4p^es%X^~4)Zm5HDY^aTJ^e|Eqry>*IYK~JUpi| z@WJc}pnmgOn3rHIh$1}~$Y(}mev?sde=J~A?g|R1%Cecn4CtHO&@zi}@yVTh=eZ%4Jj+Z)>--!<#o$TdNb})ao<68oeP%WWe z@)PqM?RLqt`R>}n=_dQ5qFSnJx#fj6phAze&5WW^+1G<_EDh)Ag`cgW7RcKOq$!V# zK1HkU$I}m^g~?Y|T0|((gdAy?^G|;ftD(yBBiz2;3;-##ytUE1NE6iWb7?+Bhf>1H z+(g!iV5~Q8<$mG$>m|kszo$If!Mi(ryQ6aau+P}&PBnu&2$~)h--B{W~yTyO8 zem&DG{W^8})GJF16=`p2=VN!a_OApo3lk6`%vK>gbHcmws(n{?-z_x+byP7wtCu1#V9*KzzbD@rZZ)g>lna~e*>-rdaMHXbh5 ztus3q#NH z{~9FbLLN!iRVt9*-g&C&?V>2O2QvZr;HeDY&V6W2JXxs?#?_*3Rz?ZvaYHl{kHST6 zgn6#yN`0vP&{8!Wu-(}EELX5eM!M;C$C_xzoRSAwB#mZLN*|K8p~#Y5izpk{Lc9ru zNFVg!tM__2_G_CYLtcJvoa~@*TE&r9L}7zFHz5mQjLf*T-C4KSKY)0E8k|LimDS(Z{wfro&6aPOy5dVjT HF~d4A7z-`9Pwg*V1RfW4t$ zZ)2jy`rOZY+no&y@iKRhRP{U?4F7WnZsOzP?HPIzVD4lxSl<9ZXcz#1zu)zHrfb6u z2Tb9H=K4%~MY-(4hgM7h#=BoG2TV^g6MRq7iYl^-s2piJ(YF{S*a%7FDIP^eZ=8VD zXY9)#yyQ5@VL_4`{`+TRZCKg46Rb1u?o^!vCB>248RvunDA`kBcYY{-OBfS$h4(No zkEPP}-H{HAUy^`8F|Q7rh~KFt=Gi}B;8?dW$4F2%)d+SFSf9^Pr+ZqH$^6Zv8gxDc zkZ=x8AaTDY&f9R51H*^oWn%-8fy(}aOeXU)4mXDb05&j~1i;~fyb!*Wi-vqe@es!j z^YRHw&o!U@B}LrDim!wcG&t|@byG!Rj_>R0+aE6zg<~*6kvJW7FbJ*z9k9q?xC_BW z50IXa)bJ!2B({Pr#!!dbOi;lrDKi$L^0jb( O0g8gD_Neij*iM+rep34e3Vhjw1 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

3hDx0@T~+V#y|9SzctmhiQJZqC`exMq@fE01<>R zUVFa&^F----_YqH6_HZ?*5#wN4LQwoit2A`IQ9oP;}0#{y23g&Ca~8>ej}48MHA+D ze|$A7*!(m8e`a8h5Saw9o~-}tEb^@Ff5zWw2KERsN&gV~J2Cn9Yx#%Jzt6|tZ|@&M ze?KPwentNf`uF+x`|bTh=>K&LjOJ=f4{wd2>rh?fdl{3um4EsfBGW+`Mv*s H27vzs6aE^6 literal 0 HcmV?d00001 diff --git a/tests/files/yii.png b/tests/files/file.png similarity index 100% rename from tests/files/yii.png rename to tests/files/file.png diff --git a/tests/files/file.txt b/tests/files/file.txt new file mode 100644 index 0000000..6c8db5d --- /dev/null +++ b/tests/files/file.txt @@ -0,0 +1 @@ +file 1 \ No newline at end of file diff --git a/tests/files/file.wav b/tests/files/file.wav new file mode 100644 index 0000000000000000000000000000000000000000..f224049f97bfb1f4b042b44383ee4232e1143e67 GIT binary patch literal 63128 zcmZU+SGSeLzV2J$?E@515d=(_6-87ORLr7)0TodU>u$HU+qpXDZhwe#dA`IlU;r^7 zil`tUDhdW984v^$0*VTwzg2a9&%fS27<2Eonybw=RpuDIdR0CDC)JV%7A*Mx{&DW9 zd!C&CfBirI>!LHAbDsaZ?1C`?o9VT|HuFOAOAQ1jCXlVI5STP7nLjB^?q)? zJ3i1ZZk|a?!b9aAe`}r^LwQTb5=T&h_{UJvh< z58amVb=nhuN{7NfCHWzDdOkZ&Yp-aoOE-nP@`CVae$qeT7o~ff+uIxCHThD1o}1{# zxmbq%U+%ZEH|)yW{Ksycd)uvaFO+5BwfweU?>;GC_&sHx``sTaeb@NY$|QGzzdT

~x*b~-KeTq=LL-^2cPckiqA6aQg&C$01^`WNzw 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

L!rg(0$b03|HApRMgVZ>V~mN)p5yW`wrje zPdStDN#OqK94@|Q2`zb@<~NVDOJT`D?-`#&xkmR<#enijkl)>h7Azi+$<};(%g_~Z zId`1IATJdQr<(G+WVhkSNtiqo$jr+tONJHA79|W$0%ueYKk45!zgtr`29qsFBBD$6u5OuZNsAdLp%f^0hfo(%h)zIa1w#Z)*P4SayDIx z`v~QIqx(F3lfHwq_(O^!Sr629reZh=4<{ic5#Y!Rd#;^3GT9oE$er3QB#}2Y@Ap^r zR zsT&?|QY3X#69DqcmTt1G>PF-~s(lhPOn?E^Cy_~k2G}HV5_Pf->*+Y)KJqV+>3NHU z2=`H!000A$AQ>Quiry^+%BemTc{VX^DIi_!{n3D*=<~=st-NT}tzjyh&0w+?%AZH;{DG zo`aLH$#zUUvz^krh@{;0CvNWDlkWGA2?OGwxmSv!@>00jKoYoYPLv}Buk7%S-Zp$3 z?}JrWM7IK@v<{OGD>y zvHJ)lfpP@~#65Vd=68i8G}(?u5^&_k0}4rKKEky-ku3NnxTbJ_RW?apSv%D_PD1w) zEKZ95cw<&2Ztkc6r2ZZ#Q!UMv#8bSSt*eNnXPttmP92y$4%4Q#Z!e>;}3N965K8rEWUM<=ij} z=L>3kAO)HWEe40_eu0yKBiEkmd=mWm+H+t)PkuKYil!*y*{G+Q<#+KHk|j)!N4!bg zr(i(SY^yg3B$0oKKPJFSVUhjSd&Q#Vv_-G}{Od*t@nrr@0dk@*^ZH zKoWe`HM`N}cPl61-~r?A^aZ)Lb!0clOQB409~I^!QoW{2;XRXPOY&MxAi9spwzG01 zub*N^!;x1-QTLIugn>QR9KyY8oP>~sbg7JH%Xbd+PM^sRFQ3HGARZ75sL8hSfDt5N ztpw(k4TH&cvN#D%wxrDtrf=i+v_<({^X-w}&2KjE^*8oD?{5czAB=RkNNwjnBEMVc zljz^l&`MxQH@vc)+Fp4;)D2Q`$2;^6CxI^2Ib3ufnNQ-gllff|0C;6|krOm_r`+9e@vnxl=8h`<5Lo&x@MenG;s2lLN%ba*XyN{TU_EmKQjb&UuD;fsW zWUE#J9JuCi2_Ol4qgTk~T*l*T<5a8Or0{hMN8Vr4d%ZQsWh4R6`>4Mar#-&CZn7nL zjiPvovV{G)y?fgM1~eq$NPz}83HkP_qDa%ncg;8LXSlssIsZ!fZ_{kw6PttzZ+ceM*}`8*Zt%2|FFuRY$Rj+0=|1-wb($oWi1yt3f!b@;a6BsyIRHc37SUsE@8 zl)N5fH}d=uZ;~7?r{T?H<+|*~U+r)Yhs)5!{<+Pi(xsHT z0j;Xvh&`w5h8!;ZHmsaK*(X6>N*ykixbM-El|zk`SGMCM0-S`k z5`f-OQ!Zw&Yd&JnMfxO^06?c6$?rBVwIB&OF2SM!{I{X8a@g4b9J}`vKx77ycnH`{BAQ3|F}}1 z%FLrnb(1Z5Dg5TB8}jXS=-uuk++VOsoSJYF%wpR~!5wV>0Og~$x2H>&YVb**DQiAj zjNbLQFkrYX-GCqdVmU6WZ%;fRilQM2X2Vr{%hcgQmXP_V@_=yU^6k|tAtb?^y+7<}zwCh|BAf*2F4!b=8CFjBQTQ?Am96<*lmL)~Fd*u{Jp2Za zE4$(7Hn8MHFd+Qm%jjO!R1(A?k)wpb>S$T|<}0d2te09N!*}ykC3!=$|45TGlbo*1S~hlc?yO z6sXj8S9w4tTc`QRFraiP%M#wvBfqQE4Z9tGI_*2AZUm47E)G^M8IlNeid7^522`H} zJfQMYoo^3^i}F&m2Iy3?m8+Zt(&2E^(#V{bgJv>CLT*JyK0g%<>$I7Xh z3isDJa$IJ-vc^eNZ_)!o65=G}O)6*NV|S!cD|%@?t*bfmuhM&0ZBLIrR2DD zebVLHbGy>Ep^t|@XjZ2cFxfOySpongAvVbzE+C1MoCNm~onlfq0uC3qK#C$f;N>tD z^hw~&9L-7Kl})5>K$b7?r^6G^bXqtGSf9m%`>4xHS?VVL+Z^s6 z=#c`2f7nP%PM5syvV`~~P(F;4054kV28Z;O=*c$=0}lEm&}>QFD7yg{qWK72YT&pG z+oULhc#M-sh9vMNeXabiJCy&9I9%N6H35*XbvM^05H%%MPQtvh(rnM-^P*F%{He)S z7;rGzrWbHDm{&G_(*L5jyJgRz56UYm%@z!ZE7p(%voh!%48OoQ@)2E%-AOyCDT?Nm zb=FQAMzR|ug{3HRAK|e+f!A6*ARM_Im(?qqxsT{*xF2n%>$p@a0Ss=ZOQC$%%)F&Q zGpCx`NlB8KE(NzRqHb8fkvUuvY*MC`K)RGtpi9P(nF>X5piA{u^!lf0cj=B%1PajZx3b8dS%rFqAVd!d%Q_%Cq)zbhol?o29A6I{06$z{Gj$7I0-&$ICA`wtQFGn1^3rc z6gN^g5p@IZ4D=qzZm5+2p9DN$p~I!U4)+#{Vwacthy3orn%}LCOMDWhD3-MaB!O=a z42V*pl|$XY2SFR0I0<7~N!_H!I5m~JnFTg9T}r7N=CmW?0hPMRo7lfyudEUPLJ~M? zDh5=R5SO#E8%!0PY9xbTlkn4%0Lb?;eV|KKBvF)^$D8DTbxgLXsDoZvYo;1>im8vjEEM8fM!zDh_Upn+;AD6QSNi;K)e0yNPrU8>5lV%HNWcl4LONcI|>;~s2 zKJvIPk=@8}B`Y(WJiuPX-RXT@swi}W_7sufe z*9!w$^17-UBb{RKMzb9~erhM}QlO)oKn5;n)Q#FsS{*KG0`ae+3ZqMrIo)OVk*yp} zOZX(1k7xuw>9~|vHj)BWQ=-36Y*O_}Frysc_BDq~21%rsydeoM49KZge#k%5P<_0i znF^-0LlW}sahieN)8dBvNLfNS1#5$oU4C~1u9tyV_8$+D zkS?Xvjb#b%QHP6XvbDBsFrcy?*zsc2hf&nYj(8AlUHyPGWM zZ|oq;Zg|tBNM6e;JO89tR-Ix6T?)nmudK~SxSVS{sXE1^D5_W1DRlz|B%K8(q0|jN zYvTdsaA{_=w3E`IN_K+|W2qaaC@Q;Am~5pek_gkviIboW&b=GnPzsb=|E)gihI|s9 z><0eS6Hv~l^v`TGAJGIt->Y;f`6Q~M$jXsayC_a&hJurD$4RjrYzzZ(ui@LH-v~B| z{vCgeTdgyExShNeno0b-2_{F&}V$nKwx*htm`!As*0HPHMZ* zJ1f_5#a^gd}typ|*norEZWExx8Eu@ya&zoDVn&nwJbo7)MSUob}3n1d;_w$eYB< zp>FuIl6XKSTX7N*PNMhp@S{Wb_wQ<~Q!I~UH#k+yCsA7o!n?KSTu1^Qfz(Yx-EgSw ztVGuaCtV69V=mr^$|gx|zX!F$94-!~)iU!qF7v^tRswiHOI~xTsZ*@xcZDS2LJpIy zSMu8KqjDv=`0#IeLplje6;s#bvf7kZhuAZd01!iyM^oq z-mP!pZeWv?-^E96D_8p@IMp8E^IZyJ14)41*mH7RMtpl<@;}uCB92^5i321d$0es4 zoP;9#&dI>SNss_ooEFmlesgnuf+IKd&V7U~HPUnLJ9Wc9$NpgDO3iMN z-|g5WIPzjhqE5D?K&=gqhI;NJG+VtbzARkdVah zxWdWr#_{bWSO?2Xi6ggG0#=S)Vh$Iw0k(39$@V`x#bDgKCXmXJtFV7BsdApM+L_v(|XPCj#pj^ zezN9w7oJ?XavPeRxtxV0xC#1r9t{J+@1VAO+DWTV0(a}Wn%`A36>}=byZR(*TXvdl zZwrh#E@?ZOJ-ClJ)tW?p*Bma)MG5&*d0 zZRK!#=sv=mq|}W^Z6~F&C&-($q3bt#j(lF%aVaEGbt(0n(~^TOMPAC(_KGA1_tB`8 z6Ou6Wj`mcMg!v>K2>>}Rt2YTBtz`*uXPUa<4M_}o&cT-A$k}sv1P49|Rt_HUNPRJ- z=6Crym&7XFbNjfJ;$?li+-uugv_(7gHSQedvM{lZM8( zz%P$3tO?V1utI>mIV zY2|9iC8^To*>tJ&ZbNpX*-n;<>;`;c_3eQHt;0q6T^ugzlW0lZnEPu41JX{4PeR!Z zaT1PGjh|C_slk0@x>VZV9O@q%O8u%R!ja1-A$7xgWk~?E_t8p3em9WcHO&@If_E8c zC4hP0#T0I!0Y?sc_v&!5wrq8Z4Rk4*C@ghTZWoeJ&$&1Wu>4IhAXkV7%%pDGmbY7e z?-WJ#%A#&`dkzdJwO!sM_p92nJxw5uHGzne$hYDnf2g*TO5OO+CXo7KO6@sUcBAgO z%1Lk^b-ENP#SyX?c#}X0Q-vh(A&Qzei@0!bv8R`Oj-%;gLxQLg6o7v8!dX@}Y#;Uq@Ab;GGvJH-Z$ z%j$5!SJJAP%1{2^d(J^?gSKqi;OM-z6ezyEt__Yg!nX&0=+q5sO8h^1&O3*T+Om0D z07cQ-vYBi<4Ctp>=Q4Y)&?yGCkx#;0&V&0%ilXkLuv6-WbgAssCqd89#p;!<>W00$ zVVs0~5|O6F>P=EJRr#YFz;SGB5+@n&ZVVhQye@>=?#=BWQfei5EdE#j zu^y=#dSTq!+-Gn3t zoP;{X+>HarrM$AFT#X}#lb{ip^9G*;tlBcQ!I5b(BmqZ$sCKyUtv?%Q9z3ACDRk-v zt}-xSrdO7;uIoAH^_te>lK|zh=kPRF$K^8c`>Qa5G*h+P@V?LnSKCR;sdBhTmx2ez zaY;)VF6XMY!>V*W=QyK!bX=lKwX7T%a0~a5=~6-xOpNd6kI0Xc-^I6mG#w9c66mII z64oaHlBh4HgvWT{WE7HMN=28#8-&9pe+L(CJRnX>CR;SyRbBGh9G7B~29C?Yizxwz zOXVce0|BqBe0%(Ff+W-{3kFmIfb53yyJ{ze&o?BYc2d2&0fPmSsHq!VJk^`jwPn*@ zOwV~-)ZR-MHM*1>E`DM~5;Qu{DVBGF%B0zLx>P{jpjRIB9`H%%RKxjT-XwKglCehJ zP@e=nAhk~dZ&JRd8Dt63rL=O&ZqSt8t(@N75St{23$6@KH91_!AQ(qZ0swE4T+Z=6 zbeJdFCwq_9W-8+(l$keO%E7cMFGc2omE+YBdd}sz^yGH~O(05M_kSKb+OM1hsT*23 z#3rdJ(J&yNvUDk$K;m?goJ_WQF{Syp#Vb2N64jfec2ZN@X{fKdl(iB#PQf$WRI*l_ zY9tBRb4r1d4K^g97gN*(k|(HFmN$1g-`-&5#7WSD*7eGgAn$t4<+x0RlN&QCLN6*%VdNn12TtE^7jvVEG3Ot}Sfp{j{ z-ea`-*ksF;Fe{i(qD-I#+*b^Uf7h~vdNmK-y7NhJW`HD4zL$n_+B+8EgT}lo0(xqyr7&!taTXS6El^x}{ zyx>0^mzKJzj!T%<7x_-WNw^QfW;(xjshzZXWu3K?GRK1fH6JN2rJi#+E}4($@e?P} zn%YituCO;LSQLSHGz=6p?yc{2K>3^ zBfTwPNWzibpxFR6DXdcJro1FJDbrBzx8oHwbz^`em?(?~45n_tezE83ePoWyswl!H zap&6GYw8rkBcj(E%;j7;a*xZo*nQOb_TVIV1p}XiIC8N`!J4Tw*~;NEs!yUOuj!LW zANSUyv9Cl?#J6W1mm>}rz2N0(1g=P;;Qo>~srHyuD^w;aT0`%P^E z5e9_opi_*FOFCTSl~sP1SCT;Q*5NYE-rX=H!MCjT8+B|FzF$r?HPoZKaUYev+zz03 zyh#I}1iDmpT;c-SM_K}JlGJv*vLl>??jzh^oi63)kT9g@Tq#ibB&2Rs^sf7;&`d@5 z4qn+VzxxF}ar^L{{nZXPu|2h+S60~#T<$n7)d-B@WeEV(c3U|zc5o6*f4H1c6u%8$ z<1yHf-hua0hYRmE*>! zy3{-B6jSO3Jn(z6o^$1;x_38jYVYVRXh9NXDf6uoNNvk7qewIA{Y=w5e#Sv07DYETWzwXg@ty~ zL6%UQ!~jWfAB`Xhn`}YvFczk6&`MzH2LE>LxMa_{?!}bKNx(d!wu@=yR%GR9gR@gj zNTPBQ=KjJfTYJvcOcjP&>lEW&_*Om%v{bDeSwe6X=-tsLfx`t|3N7e3n$TF3^r@ku z_pVQZPq_0*Ff(0M-xe55w%T)K<887fOGti~J!f87ni4H}&54R{kB&=psp^%*ora?L zAL<6W6x`$BK0=pb4kW)TbpxFG7P>VlP-`XFka0QJ`-toY7*Og4y0_E~*d&@z9%-I} z&3;(uUGMLbPS<3MHwpd}42Yh-yWK`l?*|?>Dd`0--n!w8BLU!d(_Pvj3EsNl9VpLR zH=K>!M>g4#-zD>QXFEsDRIy9lz|_OEvgSBkNZ!}`$a>D@xU^Hvbg4osf!eaG!=-W( z`1ZhnWFh2m(W%Cs!{y9dH>6!k>eP);697W*Bh6Gyq+mcAMo~9F2F{&QISI#PTXiXO zxQJ=(dSxp|j@O7j3F%V0kK|2~;}XS$S6r)CR$0Qxe594DNWvVKc$4ZYt__+ksRfXP z-U3z6x$?V%`^f!jjlkRbAN4-yztwxS1xer=!7EEb_A7alDo1W9&=FlqeG+N{8N3DB zBflH$)jYl6HDHr!0zi8XMUnf+S_#(YkDD)tclBr|Eq^xci8%JO6BB#qr%Tan@g|Ys zfs>GLPp=fwUdCjLj!6>;NjI_^5hMXS`BnQ#@5A;T^&2rCt*BmEFI{TyNnOgJwl|md zukPL0avupvXyropVhZYpy_h17T+LK!CuPr}wxjmFA%_cnE1kL_mop7hN5b*8(9cI3 zoU$98x?w%%&hoqM+}^A{sT)V9m^m&_vPn#~wdY)utzK~*g#izd04S*bWH)#{Q;ti# zN!2T>w?L~dRecilNpwC5wPiEelHc`k65YESoi3#pQ%D4kyuYj08~(#93zATuL`{LR zYs@PfXvPEgjaS~+f zv~pxOaDjj%0**^g1D$H7Zoq%psU}^DZe#Mh=KkuuvL22c1^m{LSM!)`h2H5&flZ=i z6eJf zj!RQF=oNV_Xg)HRvr?e)?J=3j>;{fTl5TqIMs3*%bpux!>PF?rD<>f&(LB)N+fzgRAa%ohWWBN^ zueals-Goj{@;VwPK~pK-q_n;HzJFlo@bEu9*Rpcvm1RDvshf%ut|gbE)E$( z5;!>ZdV?VeRQ)Y_do3Tp3H=W*o8!2Iv$vk}5y$1Io^$lI$^(i`8pg$A`CU$OI0^1! zFrd7$T`Pg{fS@ka4V*zF-D>K_vKtGt`6TofD9CNL^1J=>SOXlF$?{UYeSLb)Gd!TY zvZ3S1bKP^hVUu`wgHFYWCx-h-eG+;(Su0n_@A9YD_YRqCl>$}rIwZZABBr&joLV3H z-iBbhlsYbPe`R%w;g!0uWwNF743~4|$jNzu0hQlXQzEC@DZDFZshj4K3y*-%O`;@^}Tq&7MC+G8^1zZHu>H9)(xi}NP<-$FGZ`4 z?jyXic#~k0)JouRIg3p~VYE&$^_=&|_I%5HB!>&=U%C|ck=P`>NpR#iMznUTs6GkqqlGnj-TC$`c`c4S>QqyYpEcC0mB7JC)E85PBs%m?&-tL8v~m*a zHv&_G-boR{N%%*UyoLvyskUr?w%T_PZJBJHm{!yc>u_1gyI?N}z3V=*)XiS4obDqg zwX^sxRhRQ^dND=qq!}I%7ktfbObc)lJtkZFSO3WDIe5UX=X{`U@Tq7%>b$a=Y~9G) zYf6EF&$Q=kvMqO)TY`8%I0>b0oV}Q0ZE)M0&+*2tttrr8O^GDbV3X7*0pnyZrtt5` zE35kmP9mJVkF1@PZwkIW5@|Hlw{Q}2T>721=d4qVQ>`kB!hkTXBi$YVG9D20j&Dzst@d19IaAv^ zBoR^DQLykPoy=~a+go0$A_)h2k8(MWAc;}g4ZSTu3RKw*dW=~)JfnDJ)lRDR9bOeN zhYOs9DT?AG`2Ox8ZXEgD ze3+EycfD`=bc*G*v=UTB(U1f$7m>PQWe+Fw?P=v;qO5b7_evk&&%`TByN`SlU4B=o z8@NauE=qx_-w4gtvKztPgU6vw6A0fxe0!RYgx*Q>*;}AO5)KT=1VieEhGe|5gVasw zR*n}nY6=wet`sPaJ#}1a&z;O}RBsYJ=cd`}m7?l!k=kyYL`0X;WQ%hNU5Ylij+0QQ zSZ$`_R5O>eIC3%!TOH~Kt|V_JD=he1skOYb%?b%(QgnIl&r9ig}Nz_-xxsS}7 zgkPQeh&zzvHQ5m++d&hEdd|C6f-b*{V^j$M%kNg71j(YV4NfUgw;CR09Ko123{w$OWhdrfWG>9l~Nh=UMLf|KB@{0V7CkOa8rdFF9rlj>xP z3QY>s*d)zImuBN!`ZSmh+T_jhqzR!%}3 zIs0fVZc5Y*VL;G2shipcCyty1fVrH*IdWX$Ks%{RiD@-OQTLHGC8A3?yt2Im!-snR zBzQpGN1z+|$jzH1b%S@hABt)OzOlvOf=iB9TuHccABiJpvW1gSLp{6<`CX4sBICF; zPGYoI7A+WVXQp&1IWDu3Zi`^<@JY1fcjZm;tQ6_1@=}Q=5Ve!SNLuPf^HEw~J6zIpxESda^Qarm zPMp8Lpm5hcXMGa*_Ug;YYN+Qv!d1q~)zpoUM193oDNr~G-ntn$F7Zjw;esm#j$Ef& z^(F}e8b@wOLcYCxKj`F{umluuZ-M%&@u!0U-6@!c#gQMBPr|Wsy7rx^7a}U8XYcvk*DXJ-(i3OPmR`2+N~V(k=o#-Zul2zBZ89{ zU_dn`mg-G9+h33_Yi8=@MhXfa%Qp}APK$VN-G+igxX2PCY6Np)**?LK8dPs=u{)yzC)d2?Ge2LMH?I5 zqzncGm*M_$_#|{6aev&cq?_0zxNe#fD-W0s=` zaU9VpR^Pf&3RL-BXBbdE31L9#Qmh=lJ-wKMCNl6z&;*iJHZQiQ?d<9Bmf3TLL7PRIadnQ*d*p7AqjLHQ#WX}?wUYoxB*EBy_0zEe0vp1 zh$9DGqaVrP!b=Xf^kxlDAG)YNMNJ^;ITt4(hl}nbapbgsz$SJ1U0zJd-!=3}L|$*; zR5J_+8+ASN+y9|%)Rj}`vV0P_KS2`eli)t;bg8aSqU&%`QzGs!Q#UG-z;Owir2D9A z%hsN&shd%p1j+Rud0~x}Qxk|~H!LqTf+XtO0_1l&2PdKhUuJnJ^X*k{Qc|z1ki_K` zN$?se^HJ?N&tF!xU77h}*$w$5(za$-i^HX635DLndF>^J$NMmq$uh>^0bqp7^!`y z>p5qq*vio>JCU9#)QyTH@-CV{?CrIa9hbrKQW=h1*$usQLkk(4ME}yEYx=aoflFYM z=oGX3?#X7V0Ve?>MYAO-U%W*-zqw;inrb%O@^m$~uHx99Om&`(64L_VyZb2M9_cWcWgX?=H4BQTS# zoocpn9(9A&J%zjLIH>_v&fb9ny~DY`QtI1lYn9*SZJo-ITNB8LqcfPvR-Iy|C>lqOAHecbVv}GR zyABt=FI~_1NhATkOs{P9%HpV6#awQjM8}cSDHdph>#~I8cWa+Sd72kjh2C%GL}Id~ z-$;87PJ+8enr-KB@oxq=iDo%@+xOIQsZ%ZT-XSkfN|!>j4X7JE94-+gAxCMH9`orfz7kdkDp6 zpeS|;0AavErx-qRW0PPGIMqm7d?*Y!;Kd86T;KtjY?T77ZE)@O$YhIVi&s{TOL63&e^NKq;R3egm7;VHuM`a&muLQm;}Rqx z3-3_}t$LgP)6 z6gI?YtHc#;C;ZulCH!H7=+ z#lTihzCB)G5PCm>PnEYonSaP`sG+{G$+msEd8~F^>OKO;$(uBmMjbc_`XW#_(4aOp z@6ngksT;L(x%wp3mTf7}PTk3|fH{_FuoN9cNK@w>s zOd(B+E>*J|ei`h6tsH(Zd=jK^^>Q+kt#K0gB-BvfsqO4Jz2d5#b0GjipIvbvl>5-^d$8i6~9OSv`JTQ|Cogd|{9EH9-50N4v8fy?=) z07stTB>Ekaa4@aBCr!s?K$kLg!#D{c33V=`@{zjHE3W>(P}{+PLK5m+=I_G;(qMp3 z0*@_7f|HT^NUyjC)D88@ijx4jfF#h1!GJ;%=wy0ZfcuD*BLNVs4Nhu1FQdlluQ+PKfB|)*F(ffOo6g1i^lF}Iww<~Gn=}nY zth$_WxXAr=l9Q-SAov8{$D^ZG0?SJckc8TI%;k(%7ERSUTmpR(WFxwj8}vz3MNt?~ z9hck})&#=J@eUL@KztH#-NuotSGGB)y(rR30At&|m;#!RZ;wV`=~C^~h~u)b=i0*{ z5IA!DO&ja0d0jJ=y;7vNK-Ia-i!JC4|(oV{KN)rh0_MA&chH(;d zT*66!0mVsZvV{+&5m;VX60%>Sy5ew&f0I<|krF)H_MF<_m~3$m;c!u}EErIZOT4nm zOX)sx_F@X_gW8Ud>>XUP=u#tZfwJfH9y~7g5l+Hg1|NmvvIPV3eRxtn34a$lO6Qfe zEFme-^!uPs0+jj=y>&QT%qIbo;J1)hmh478p-wS;Jaw`qbwdvd4j0-3crnE>*{187 z>HQ0PQ~Rg)#DeBfgibXaY=egS>bNwA3sZ&qjYb?UHraN%)F8iW ziX!iBL`}BV23H-IXtu^CY31a&RF5C;7UPqUZ;$L5uehqAo<^}J@qnQyl6JSrR$f`9 zZbJ1*ki4e38ONn10IUfFO&@gwk7xH{N`RASCU!g^ujcVu6%LomCduJ~Z_ixL&R+0} z)=rvmxYWs(q#KS)W0RPV@M@!O43LCgOc4gGYP;>ZCCxMRf8mn|)#VJ52vRrddxzb9 zRNLTC+N~*3oP?)O0=_~iP-Oti#2F0R!2M=IQ?9LyLy-?UftzjONl79#FnLUK>2w z;ey&ux>kFxI$Su_wgaNIU zU>%LXuhn-qIMoaT1{{|tVsH}jNst3S&)TxPhI;uV=nPsg$ZpUjWazy%Q_211K@#MR z)|lgxJtqtp%_os<<)lklmhhY|d0ics-CH-+w^v_IZqDq(kr(!y)D88@Hk>nG))aCNW8nmIJ$?NrKd>W$G5_ z@NS?OW0Iha$n1tN3F#zAs%Nv6PJ;c&lZ3UhU=ne1GcO_2yA+prPn1kGrok2RZqRq- zNrJslI`Us&5~$SnKBGO5#Yn#h!V-kI!Ne#Ulvl)<RziJq>1F|_W8ovBw^(FA(#dGcj<{fzgt;d-M}bD z@5ab(=skj^fNc-Iloc-GY@g)~BI7c73C(U;;X;Gg946uYC}9%d?({%ul921h{@uU< zl?I3F1~<5qK=ScD3YD{FKxJH-m*TBO{e|0=NkT4A>Gtr9sat?FI3-hw-GJLZR_uno z8(*VXKr0*G4Rs5I3sky2p-Jdec#pgv;g?dzrSpxFHi;SVj{K%bgLAIzap?AfQN+K? zU%hi~2GnNDy}6^c3$*{F`lk5-AF59-JDDDr3)JH38PMsZN3BoIv! za)BzHRMY#wB+xE+SKm#*}deB+qbdb$fF|jd!CUm4N+-84!K36fUss zIa*n#!Tq&;2tV3JdX7CwWN)J*PbUYOr1yyFojxMJM_}aS$|f}FiteK7oH0{OU7*bT zJ~_0q+K-$kAqPPBboC;hd3!gy{nfOk#dSD_bZId1K}hQ?=N$j;b?p`PCC&2sbh@B< zkHky$`%3F1z^y@(#s)7OX`xMmmm;qmodh|`%5VW`rC$RyXjs4joULZHVHXXv zV=BRYYK1`UBG$xd2P7i=3}!eX!^s^0u$@fV-A&?;$~9z`%{+?TGQD#&RSIckR&!c5 zvs$=g_*r;*SK2|brv>ZiwRbVAsh1F4<%OssuBn)^tM#3mD&@T9=T5&=N;}}&n4Mgt zwh6D($ti)6&TA)Laa*D)^OTJ*^(>N?oRVXs#?@A%yee{l>b`3+Wez_ z()q9Vs}-WyAMt~IOxa`Bira+dwLK#py(`CApj)k5 zoD0EaKQey=^G7-m>MxSyIl00f#WC$bN=^`5rfel8N{uYM4m~95FBlm&RgxfN>^-IL zp#Fl9Mg7IgBMlL3d%jWn^x=u&ndtKnqlmwZx(Q9$ykyq2j+x6n9>wOrC)XVM)r4j+ zTu;aH-y()czNRs6FGG!7JlbxmH#YQ3^*hv74oi&l+KE@>8x?4Xc=0cA@5c4ce|2t> zRAp?;>|Mig<)WsV4ATP>^2qV^;YiD#%iwHD$>E!e^c}0p#_Y`CkK6^?U0SWeX@j?Y z0PAROuCF8E@X~g9nOY(8ETaQ}cMPOe8lv)PIt8}1p5DzUqQ5|2q<4!9CmfIrB~A_p9PgY|W!$Xv65`>9KLSCU?MI&86M`!)nCV?yFj*^O2LO#|Mq0D= z?24ptlW2TdYECxx9{dsS5hv$-qbKwp#ondqoviB*ly(3E3&kSTM<*94Inoe;w3-Xf zXZ=z_aN$8<{y<1RcPhcFXhNR^6W$zc<-XP4?!exoIT=ms!t$7ISxK9a9BHY&0T!RW zL#3XwF{d2A8g+@0R&xH|Ri1>{b~LT>@AAz#@d_Le+zr-*ZzHt{&G)v`Y~q{>ZOmd6 zNj#Jua0n$z{xN;>Z?v3TC;sS<)wbr(71(>$_mvIk}Af zU2Zj;1?**^2V|0PgBR@$nk3ZVMUxrYB>AQ2k0Ym|`XX{=(K{YFc*<6idYj|dna?l87?i8L~f*2Z9+OZ?lSN?P4BauiiF^zeoc5Cx0=$jXOl!ya;6-=(%5@A z(#9z}kCdFvp$8O#8+#XuK{*TTYtlC-^;fuK*kR-@O?wv%ntSuffNCJM#&97YHu->GCKtc?wOc z#*^!KkCZ1t+92-{9=Zqd(%~#%lJz7ZtRs9)V*ZBnN*cT-*EjJV*`tUK;bLwjSbXIs zar;F6>qlfOTm7X;LWx&B-2ya0GD*x@Au``;o+R`hiTP8Wg!V4yCfO6hq@j&DqjQIo z>&RS&GZPB|+fM$)yh%dSd*)nOyeU38T5HMMgV~8x0`%#H_bxdLl;xZs-e+>8MgFVu z_F|HNJ))&Z35;k+-pQ>`&pA1CD@W8McHoX-KZ;HovfyZiU>BX~(_>>E@j7p|DY+Mh z*)t%Cmw4u5?-Ccx3@9ba46k#N{MwNVrlXn8YmgB1>0s{zc$s?%<&XwP1Fu8C zzKx%B>X*`cq?`(RtizFZn!JSMr3YvGhxYCYXF)KEa8}HK=r4v+oGmFiasX(Ousa5Q zx^gN8{8D)4(O-~^O23qtzrqfH!rjy`f28C%@rrH%-sFME1^C%Tk;GdYvo#Zfv&~femhAZ%z&iAg1rw+60jzyk$W?L z^*b$_Ee?D!f9gAQ+Cjm4REi7!Pu_MZZ;#3J05m%9Yj*%s6@d9$_yAzH#B#e-h;&lI{@RehNyo% zd!b;Gm~1=r$H}%fv`O}a6xJqnL$M%7jm)-}TTyeoA?-9s)!s~L{gu2`7bd$M=ZNI-i_SAGmdNdp#*R!T~!b31RQ*7ErD% z`RT&Qjn^^l!Pyq5k(nceCM5(nF^XbMtRv6aY^w{KUx7=ZM&|FjejbZ2h0ELwh&u*! zl2n2LOakt63+THs39$FK+TFDNqQ5|61L`v@nd5A8=^6CRnZ@s~C@*R4ERbJH%1EW; z;9YvRL_;J@0=AvpB$5s3x~WKD#Gh_$l4d}3N3`43=QfvAIMPB#-b-JUc=%G;BYlXhld@95L# z&46;p_?yGwhp$P=y(5}5aI3X6v1D+;B;BzerRiNK2MeL(-VA*@Dcq~cxhBiG0KwHH zk#+r#)!yb`)dyrP;*gFRkolbqmwuMOC~Z=~BvBvH98>Zhscp4gOSpt>gr0O=@JO_gQM2b1L9N$L8eO zBvF3fd|5NSE458|d-=BRJ|=B2iB4$;yRx|%Q0;cifCHOtc~$dUGRoB6pv0?4gENAg zEwQR>I;SId_Savs2aEgLEj2AgWS21mYLbW?KYoM89;l1hk8q?Fph@+bhFgvIbfvI& zSo~wyC-u$Q*CZA~4gjYTfJx+_Ny<$c`=y+nIooW7CW*6k)=J=jsGRj4@mhgN&523#(@hB?CkE9T0K=v-)qmoHtzJ>@Lxzi3ppAHvB z&pf8_Rf1$!v#l{vz*u5e=vV7lSKPL@lM7JSispbSt?hSw1emtD0Hj& z_11;bmS2eiUvZU)q?hHj6oFlk!-&9T`^n?zfxRb}V_*^fw& z()4~VcsLp&+@JR-J9D^MSlZ{DOWa>oXmhY z-I&OQ1KJ^t&z8JBoO5^4fQj>3?$XH4MCoZgU@(79?07@H8zr4IsFBHXCT+yd0ydE^ zl)?>*pD=R%yfbe*?RHG>^deXf*qs$PATBzSz;eRGSM*rM|ASsP2L`x zEm{m1#n1y*Xp=}InbMl+Ny6TCl6wo7ziJD}Gq;*B33UsU;hCRPe;JdgtRrvfx?vYx zjjshv0v3q(2yKZqMCzmw^QVSmqe;qe;pCD>F{#SHWvxVE4uP}PW(!BTCYmaRCV}fp z;UfJ7v6VfYG-5aAd`+6((R2Pav&va%2jYTJN6BZ4`YRfa>FA`v3ol_x-vMcLZW2Bs z7)9o~195U<{$L%REYT3v_cvnk|5m=(zESUPKCZuR&TFzW`R2gL&2G30lr~Lq zwj26;vRhGgS`UaGYUF|gBmbmG%pdMrrQ|s6K$|W4bf$M$Qa0Plm_$dzaeHAE>;?`1 zc@&kKM8+XApgi;9f`v&aa~ZUcb~{ZHY7;Vx52F|-CzZ3bNgx=r_Xy^XldEs1Cl^dY zlY~w#-Xk{KlHjDD$X@u|NUJlKtwfQ+NKv-7%L zp|k_B_y(p0ZZJOuzx1wc;#iO%k*89eEUI zlSB^No{!%4P4Xx@@d}kQK4v`5pMB*lc5Z=L)QU zYWCKjHSg2li$j{M(?|P_*{0%=_OBIsK;{cZTAh?g zb|#J?FbSPpeiF?~INfMA!6DtlOVO~QTa9lHZ%lGtia|JJzJts6tw;ByeiQVXqt4?Jf1Wht8h0it;7$fa~ z7li~y^cT500O&(;zESs5{){$Te!gN9z1ect>6=4U##xkbgR&mfI?MFFzd&*5xu51UR7$+x8BBM=+9H&q6 zNbcPsMv<8nG)eoBzB%SuF!Jg^+a=u|Y&&l|Uc!P&qF&F-aXW4vV-jR;=sm(&pyb}< zj(NLyx!qAe(ZWmNmtvCOb$S`k%m>}SN@hUmB;q~F@e+oH$ePx~OM&Ssq5hQUyq@oE z=gWncLbIIr1Tv&+wSQ4q~^?8Xc9=P+Z#ZW>@2uajG{du(k2buDkLS! zAuSD2a-_KxV$5;|SNJ;LkD?zO5WHd3NqCYF+b(v48;AHETqBzD6( z@`rOx@8l+l-C)vk+ChE*7oYOTt#ILO$7c&ud*^gry;f|yTl3Bz&MHrC$xR{=7zcp7 z?WiFVyTMDevEJ0cZuC2bm&q1=zoMl``;lfqX^2p`oKHs@-yFJWW8`eMX$I70i~oRH zLS?Nm1L{_rwF#j#oMkzWlLWt$(F4V;*1>M{tC#`VY}I)!RT=6k*p1ApGW2q6wlv~> zIigAMwD3})D${#}>jpGQsxolBY?wq!4lYvMF<^hzNyK~9J3F(JCj?%qO(!Qc@&LPm z*8MRx9IIP^{m3)mK(_$s@xc~_i@b!r9BFg_6ewJLaYNMw336)W~)iU>MwfqC-dLnn+skFcjF#;H~MGt?fIkKCKQ3- zfZ;6AegwvgKAnGyg<{*K+f!;=PopH7*7dl9ahGbd3h=OyUw8Wpg?SzPWUAZ!q(L1M1}ZKw6Chl2b9m zB>JPO6PnX%HroP55sX6}0P@VMiG>_LIj@J%1EO$I)(Vb?`Hr+Lc=G3*1)c$emn!ku z4ls(EB;-hg-B{C!QM{V$C$;8T$=T;}$B@wSDGm)3E@`v%B*9k_3H8i?1G!0jMM`bs zo1n5Fcc%#0%3qZBU8fY~0pT+$?w8wVWw4xOKFeY)PG zF_nNBQ0^GK?fv@b7En`VZZyfcvRQus_cQDUX*eLQ&bZ_~idKmH#r(~7*W{DwSM~nZ zlZ2BJt&`|*0HAJWlE5W>3*QOZnW2;Dm?Zcgi)KJ2Ft$6{{_)H! z?Et;wkzLY}r}u~sfan}J zlZ1S><+AQfl!{hd;;p!c-dWFp!pOVj)oIPr>Zm?V60i&~iaI&vk%RaM2LzL7pP#&O zh?65bc|SbUP%hw9m;vV|33=O@;H}$}HYv2Sa=M9^s=jVMuFy%qZlshPvF#btd-vL? zm8}kkwU>ko)Knt#iYhW?sK0$r$7&i6|vf%@yEk(c5P zn9^7$Msb-^a(LZG9r+*fyStl9c&UQiq?9Ym^bVsKI&yaah?h!=%hU=Hw;Jr=Ay)ha zDUbYIzOO6Awp(#291xv^vYcU5oOlJzbEy2GOO2A+Y|(Qt1GZbLKeytgUX?Z}JoD1+ zfk~2=C$*ED&-P8}rqX?t;a{E^Oe)DOym)FpkgnYI+ zjACJjbaopa3p(A}8^=}%_H-*e`{%KnaYToY)PtvS|jC zLz-_+-2!TbK$&7*N;4qIhene|hjjP6ruPDebV0X31~1it18R~;?~&P!M@b&UivVlSpW!^BT|mwB28k{e|Npv`LSJP9hX8`Pg@8c7u~!R4i>zsh2kw={+LL zT5LNi=kO>x4KB1vOcE`etxgWzadJq59KcIS;o@7384yp%_#UMh5Hv}gE$jwohx6L% zFD8jG$B*%yNn-ene4}^R-u_W;Zyu>Pw+~cI68wI=R5D2vC|u0hqD_*wy=AkVUN%`B zz9!h~#7m*mIj1D;fE*IojqG6YUB@H=3KJ@4_9L+D_~wKr?J7TMzph{u*^iw4l_zgI zoDmqgw6c-Dlau9)-W4!d_a66DXU&T+a)w}*}#ZBoU_(TNAUA#GAlDuEr+oA^Rz><0heXoWB)LDq^f ziFP&Iz1|}xiQ>i%-JUS=0!*Ux3}|-4UPAJUrIn=zs)+2&@XTv^r&|C;q8tE6PdK@P zBzY??Z)IY&PQq-v8AW+Fv>&;_OZi6c@kWdt04Ofy-B9W&?ou}=lj)z~$w1)}?RKcW zm?ZFRgkQ>xqA&@2=J_^o=~!{8*_mcH+EdFF9t{XO6Ctmen5_SOa%@wd4 zRo0=n%$Ow5Exg7ID5MoeF@F$MGCGOujdFMUafNpycR$fJncN9;x>odmy0r!kveq((_p&iHJl+Zz=wW0tdY z60zB$>SlT$@V56%62)ev9rPq#$uo~`Zyz(W(Im88IMUh+BmWh}-a2Vz3$(Ii97?x0 znc46eoPj_}ElLR*`ekq|z zyq8ZGOcDcrsrFCxQ!VUq$Ghywur?G(H!ph?p0xwoCP1GJ2wNu3gbg#*HFpp}J}%0QDe zNkmGHbP^;aKLMKba-Px-+?-t61&Vh=4glC+rgwQa#7n{1rtD0;N9fNw{t6}uSS=T#gTp0(k&L3_ot+uFy{|YO=f8?=*U2#l zrb%MNB!+|BmUXchRs_XmO6-`2Nsxq}Wlp4;qW(F)cIrdMG*8B!?HptE-m-?jg*k<9Ra8ly8rBd6NBr@|-C76WR z4Pg?@-f*_rzJkQ7D)ka-k|0k+ywq*{UCB@9>tm9T3$&$QYB*wmZ9nwWf`3mxo9t=a z0pR>spPVoW{seDn28^@=O%mJyOcJr#qW;1KIxtCeH))a(nnZI?WI1QqLB2UKiQKoE zc&Qv0D2bnHDMBkNGzmASb>zWr$Y+c4*pmd9#0LJy-(1qlp2!ZxB=JjcJIp=0J@}*l zH_N$*%~nn~JEY~^;5~9PSiefQnpDobvB69IfL`ADMoMi%CoM)bPJ%36w+UsR6~@THRwLiY&g+B&a&q!+fL`DNRsO3m ziQXwW>Lnx-m`NhM8_a-m0CHQBwmigg_F~Jq|`Pg_e$Xsx;wF^DBdHX zNjf?FyJTJ(O@eVG#}AC$jA9=C-NbIN&zapokMUY`3n<5rUK~!YI-VI2c0-J!FbQ$C zVmCm;R*pIeP4AUmH)h-4BZyRcT@X39+h2aFB?GMCXw z%)U8v5~T0&%>}zb>qm{w<^b+3H%h{HG6UM%z7f~Wi+dxIjl< zN;4q3y_+KODwFHx1SO21>NiHtd*qW#scksj3TcyIH)t99Sl=9;!|?Btk~7cSj{2*d zbKRWRozBVP0!0rfww*~ripyDYFF0W6Bv7z9g`4mF0Nnx=ifi{k4Hv-;#3Zqvoaoy~ zJGh!@h^9*MQsQjGzZ>rnI!OC>Q4nn*H)%UuFxn*C>7kPto!3gqp-l)kJCj7Y7Bp#w zNk}V;j-2Uzrj^~p899}J7jE;s#4B_XC@#OP{?j%^ascqfdXkU>0OoIPb|($LX4}ai zhEdeX={;gza&oUQiD+A;wE%^S66$%ag#*$pfYOl;fPRVc_Q+H*yFp6M-9EXSl?K;d zT(4+OE9sXaeJ5+JO=8aDJ<8}Mbi?ueYEDL{M4!hn+iY1O(j<}5yAer=Y_=Qbc&X;x z$(hp=t0l^E#xDg%&aDu;M+>-XEY$o=3}%jl%ZZRbyS++aMEymcL}u@Xkk&$; z`L*2|+RByTGGjOJ?-FWJp-rmLNhpt>#k`OP2`pcVbPR6DDyUlfzTc&r_ z8%X?Ab|#!HIteC;YO$TyKl6rxNp$a(H~{n>sVA4LGHaF=8;o@HYug=kVwZ2IBvEmdm?LP z9d9!;p#4&I0HEVy1{^orl7?e?H+Imt_Helw?hiCc-2%+syhka4(cTSory0;ql{2lZHrt%(-R%vaNm7;3 zPlMtzKergOoKZO|B?nH+-<(}HXj zD;FrJ&(9rgLLHby_PUZllprOio6#gW0MZO7b_1r6q{N>5SJW(5R@b$^FT~m2B}}4N z71^1S6Q@Zhf&VaVwy4wi=A=e0w~?VqZW3Gcd(DUSm-u%Nf?rs1$-mR`fqWykH!x*~ z^BS$M-=pyFvb8%21oo7S%krgGoiu9NVq+F2q4x-^lukEmlVCSMz&Sa(y3oqjH#WDC zCINz*p>QcL?>M;`BC?~%NO%q2<@ z6{C0)m;@&$7ifBqP`IQSQ2DP)N|X|Xy$e0u-wP%Qeg{bc0h2Jh;ml<^X_$Or6xG+H zy(=&Y>GoRQqcI6YZ2Rz$(y|jKu?;loAy4mS+cPGKBD6^pa>#zsONa++!*G`qufQbu z=fQ6Dph;=7{Td`{cZ&l6Z6WF}zGZSMtd*r-3ZMQL>X#yst}6NF#BS(4f^CPhC6(Zw z`qt_7lhxCeXspg;8v&CbM!9K!5W5jBQ1?J7he(X#_RRiWl;ETiu&0`rA}JC7ZpI|R z*PuLdWWWF0;9cz zhruwMD0Tzw!YVRcNVV49CAPf)O{!2_lAR1jo*KN^Y)dc+P4Ds&(rhyO<~##}v?gtm z^I!87d1z&Ck`e`F+0ERXPGBVGd0C)Iy?7}c08ZcGSAFicq8R3ke5)($S-jD?*e^)iN>bw{45>=L3yrw#ThyO z;#>b7Hb}a?g=nsi$8~l#iiS%`9=aCw?e%Ps4_l5O}`hMRW!gKf?R9>@gJ@ zmm|9+sAEn*-*Gx<%5t{ObGScG#VfLuId~B|p9QGkhN^20RR@OsWKZp7+Wwp`_d}S2 zkMJpc!B2i4`EvhZikY(EOO#VHUmlLbeKB0aQgX>oMuT%QsP0nGmBqOG4<9DDyI6S8 zQMUadvV9KlGW>w%a38w;ufc)#;m`V^`;msqgZZ>*n{EPpQI}nb4}5~+Zy|f;k>~@L z^heR@a0JTc!%v*hs+}kOWeaocL;=@290d5H~ eK7sZx3pBO`|0(?+{x7mT_+LZ@XDCG&SN|9J2pq2f literal 0 HcmV?d00001 diff --git a/tests/files/file.zip b/tests/files/file.zip new file mode 100644 index 0000000000000000000000000000000000000000..693c6ca33081e340f4738e2f5bd6a8661c2e641a GIT binary patch literal 2079 zcmZ{mdpr~BAIDd6pO`jnm^0?mjW&s}EVU$aO($JkW-_T<=F*{N8s)l-By%jcVmYFO zB;t^bj304a%TF%F%yL<>sQGbTuTy@1oag;|J)h_M`Fx+}-|yp$m)Zgb0044;r87rt zB`F6brLq8k&F*yv03i8a_BA2~1PhrBj4>N<3w-Bop}t-CIZ`doF8Ask9S?OKpCra@v!t;vg?Dk=tFm6DqP`K!^dg)wxg7hY&78sZ9jX5UBsj4 z`gzK?$bF{oqP`2wyeu@mqGk?w5msJ$ScPD$R{4`DBAx;1b=(B@m|aD_@|8O$QkFf; zXQQKnS)sH-nslPbNbRQY*ntDWgwQ<$pjO2R>4nXaG>oIU(u78AoEnJt@-4l=ng~;B*?3NgegeAYQZNi|{ zDK!^?wWb=Qt7ln0`A$;F&E1@WC-(Fq^M$$XKky4MQ5^vNC?{|K>9v7eo^(M&wow}oYH^AVPvqTqmi+7vO67xHo z?G43i=O2hFV;f?Af^|CnBU*0~h28uotc+ncb%;*J{Zp?i)}$Q4&~UlFGwfmTo0SGt z_ObAS&6e`3=EsSqpYvVAC`qoYF)+JTDaiU#W`E*afuVaT|Ipq_kF4~tu5%Fwf&+SP z9-G7r{Z^ysaotu8(s60}*;)Rg1tim{hV(%XZgIwg(2%6Nbr;-(vsHEA#L_*j{X&TL z2^&a>XU3;zV=n~2baqNt_z7A;Jhg^jFm}d9HWPyETDk2~NU{**m+-6piVCSh3B`zF z$%Dsx?w{=t4sUULjS@F0DWfXo>wQRJS3eSJdaO4o$|BGBO=05PN}b=E)>J3W51c>Q zPIh_3^@%0>!rV(dk3ELs8Q?ztoEXdSIU*20zmtKUKmdM|a^!(Mb7Aof;aO@r*s{QERGLs#9Gg7q@&S*9X=coPQ z9{HIvWrx0@Z+=iM2hS)KbZ-js=NMK_&c|hwPi0pOo%f*1bPRq&iKd@V%{<&DJ?&r? zb#lf>H`y_Kve^=$mKoA~R)KsWfNGO0SSD-0% z9J!>ltvVBQha$}hS{fe4a0y}wIQ45zku;4c`^LIIPI#sAu>*BWz^-shqqfjUiUP08 zD*0`PHD~}djLxIpAS++L(106ZlFA3`4C{zUU@YS3E;1pWVy|UE@W;w2>>Wtb^U<7e zdpqfeOll%uvj>Xp$zM1r%Yin3kpM@Tiq`q|aO5~hoxw&CdsfBa39U74$}J69JuYui z+>^R2E0%R3fCln@esGS8de)<@aD-I1HEZ5tHbsF52RT-EQ=wJwaqOsu z9FG}@y(Q@mY^%;gzDmexnu|qMMeMs5=&@uCJmD$NYR<9A)AUg@lqX!K9D9V;DNFGd_e?#h4p;AiAalMB&hDDtllB*Gskh|KZ(LL7$#VeM9$7=D*WYp$B8mnBA&jDRI97JuN{OV1p zWB5Zs0WcL9ybtevnnrDi7O|R8T3Kjg`bzu#(>h&{MJI0%qcd?dOWWYqO5^*7Y@9%{ z=pgz?f-gv+E42#gwT*do3HpaCvUKdr>B*VKaqUpeMgp!P%U1=*E_@+7{;8}op-)++ zT)y$iIi+U^o5AA3l`7I*a=NiICx0FRkl3l=8%lZwix|0EakAX+3DeCkf1Hj8=nH}3 z(CQ|Bv$H8g=fdelOskT1-ROI2aJ8DR3{D^b`bhId=~(E(A>N9M+iNi+sfk$G=kypM9D%@7>{uT^(DLc75 zy4mIa!~To?{oikS$zXKwxWWDm>e9H>zOrAmLaFThv-oBwUy~i5uTFe4e9)_Y7Z(f; z%hi`HRnxXRHJz8&f2yQcJ%i~QFWUfLyl8_(Z*7>EyUP}La?1Spu^jAmu^DH?8NX>W j81U~yeQmC