From 6d0f5d2bec2aee1cfc97ad33a09b0eceaa206a71 Mon Sep 17 00:00:00 2001 From: Andreas Moik Date: Wed, 27 Jul 2016 17:18:38 +0200 Subject: [PATCH] Dokumentenakt --- content/dokumentenakt.pdf.php | 218 +++++++++++++++++++++++++++++ include/dokument_export.class.php | 29 +++- include/pdf.class.php | 107 ++++++++++++++ system/dbupdate_3.2.php | 33 +++++ system/vorlage_zip/Bewerberakt.odt | Bin 0 -> 9434 bytes system/xsl/Bewerberakt.xsl | 14 ++ 6 files changed, 400 insertions(+), 1 deletion(-) create mode 100755 content/dokumentenakt.pdf.php create mode 100644 include/pdf.class.php create mode 100644 system/vorlage_zip/Bewerberakt.odt create mode 100644 system/xsl/Bewerberakt.xsl diff --git a/content/dokumentenakt.pdf.php b/content/dokumentenakt.pdf.php new file mode 100755 index 000000000..1b0077c74 --- /dev/null +++ b/content/dokumentenakt.pdf.php @@ -0,0 +1,218 @@ +. + */ + + +require_once(dirname(__FILE__).'/../config/vilesci.config.inc.php'); +require_once(dirname(__FILE__).'/../include/pdf.class.php'); +require_once(dirname(__FILE__).'/../include/dokument_export.class.php'); +require_once(dirname(__FILE__).'/../include/phrasen.class.php'); +require_once(dirname(__FILE__).'/../include/prestudent.class.php'); +require_once(dirname(__FILE__).'/../include/dms.class.php'); + +$sprache = getSprache(); +$p=new phrasen($sprache); + +$db = new basis_db(); + +$user = get_uid(); + +if(!isset($_GET["prestudent_ids"]) || !isset($_GET["vorlage_kurzbz"])) + die($p->t('anwesenheitsliste/fehlerhafteParameteruebergabe')); + +$prestudent_ids = explode(";", $_GET["prestudent_ids"]); + +if(count($prestudent_ids) < 1) + die($p->t('anwesenheitsliste/fehlerhafteParameteruebergabe')); + + + +/* + * Temporaeren Ordner fuer die erstellung der Dokumente generieren + */ +$tmpDir = sys_get_temp_dir() . "/dokumentenakt_" . uniqid(); + +if (!file_exists($tmpDir)) + mkdir($tmpDir, 0777, true); + +/* + * converter classes + */ +$pdf = new pdf(); +$docExp = new dokument_export(); + + +/* + * Create Documents + */ +$allDocs = array(); +foreach($prestudent_ids as $pid) +{ + $prestudent = new prestudent(); + if(!$prestudent->load($pid)) + cleanUpAndDie($p->t('tools/studentWurdeNichtGefunden')."(".$pid.")", $tmpDir); + + /* + * Deckblatt + */ + $filename = $tmpDir . "/".uniqid(); + $doc = new dokument_export('Bewerberakt'); + $doc->addDataArray(array('vorname' => $prestudent->vorname, 'nachname' => $prestudent->nachname),'bewerberakt'); + + if(!$doc->create('pdf')) + die($doc->errormsg); + $doc->temp_filename = $filename; + $doc->output(false); + //$doc->close(); + $allDocs[] = $filename; + + + /* + * Get all Documents + */ + $query= ' + SELECT + titel, dms_id, inhalt + FROM + public.tbl_dokumentstudiengang + JOIN public.tbl_prestudent USING(studiengang_kz) + JOIN public.tbl_akte USING(person_id,dokument_kurzbz) + WHERE + onlinebewerbung + AND prestudent_id='.$db->db_add_param($pid, FHC_INTEGER).'; + '; + + $result = $db->db_query($query); + while($row = $db->db_fetch_object($result)) + { + + + $filename = ""; + if($row->dms_id != null) + { + $dms = new dms(); + $dms->load($row->dms_id); + + $filename = DMS_PATH . $dms->filename; + } + else if($row->inhalt != null) + { + $filename = $tmpDir . "/".uniqid(); + $fileData = base64_decode($row->inhalt); + file_put_contents($filename, $fileData); + } + + + if($filename == "") + continue; + + + /* + * Determine the filetype + * and convert, if nessecary + */ + $explodedTitle = explode(".", $row->titel); + $type = $explodedTitle[count($explodedTitle)-1]; + if($type == "jpg" || $type = "jpeg") + { + $fullFilename = $tmpDir . "/".uniqid() . ".pdf"; + if(!$pdf->jpegToPdf($filename, $fullFilename)) + cleanUpAndDie($pdf->errormsg, $tmpDir); + } + else if($type == "odt" || $type == "doc" || $type == "docx") + { + $fullFilename = $tmpDir . "/".uniqid() . ".pdf"; + $docExp->convert($filename, $fullFilename, "pdf"); + } + else if($type == "pdf") + { + $fullFilename = $row->titel; + } + else + cleanUpAndDie("falscher typ TODO", $tmpDir); + + // only filled, if the file is supported + if($fullFilename != "") + { + $allDocs[] = $fullFilename; + } + + } +} + + +/* + * generate the merged PDF + */ +$finishedPdf = $tmpDir . "/Dokumentenakt.pdf"; +if(!$pdf->merge($allDocs, $finishedPdf)) + cleanUpAndDie($pdf->errormsg, $tmpDir); +$fsize = filesize($finishedPdf); + +if(!$handle = fopen($finishedPdf,'r')) + die('load failed'); + +header('Content-type: application/pdf'); +header('Content-Disposition: attachment; filename="'.$finishedPdf); +header('Content-Length: '.$fsize); + +while (!feof($handle)) +{ + echo fread($handle, 8192); +} +fclose($handle); + + + + +/* + * Cleanup + */ +removeFolder($tmpDir); + + + + + +/* + * Functions + */ +function cleanUpAndDie($msg, $tmpDir) +{ + removeFolder($tmpDir); + die($msg); +} + +function removeFolder($dir) +{ + + if($dir == "/") + return false; + if (is_dir($dir) === true) + { + $files = array_diff(scandir($dir), array('.', '..')); + foreach ($files as $file) + { + unlink($dir . "/" . $file); + } + return rmdir($dir); + } + return false; +} +?> diff --git a/include/dokument_export.class.php b/include/dokument_export.class.php index f60f94c3e..c24725ec1 100644 --- a/include/dokument_export.class.php +++ b/include/dokument_export.class.php @@ -16,6 +16,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * * Authors: Andreas Oesterreicher and + * Andreas Moik . */ require_once(dirname(__FILE__).'/vorlage.class.php'); require_once(dirname(__FILE__).'/addon.class.php'); @@ -37,8 +38,11 @@ class dokument_export /** * Konstruktor */ - public function __construct($vorlage, $oe_kurzbz=0, $version=null) + public function __construct($vorlage = null, $oe_kurzbz=0, $version=null) { + if(!isset($vorlage)) + return; + //Vorlage aus der Datenbank holen $this->vorlage = new vorlage(); if(!$this->vorlage->getAktuelleVorlage($oe_kurzbz, $vorlage, $version)) @@ -389,5 +393,28 @@ class dokument_export } return $_xml_data->asXML(); } + + /** + * Konvertiert ein Dokument in ein anderes Format + * @param string $inFile Origin File Path + * @param string $outFile Output file + * @param string $format Format to export To + * @return boolean + */ + public function convert($inFile, $outFile, $format = "pdf") + { + $command = 'unoconv --format %s --output %s %s'; + $command = sprintf($command, $format, $outFile, $inFile); + + + exec($command, $out, $ret); + if($ret!=0) + { + $this->errormsg = 'Dokumentenkonvertierung ist derzeit nicht möglich. Bitte informieren Sie den Administrator'; + return false; + } + + return true; + } } ?> diff --git a/include/pdf.class.php b/include/pdf.class.php new file mode 100644 index 000000000..033c0f5a6 --- /dev/null +++ b/include/pdf.class.php @@ -0,0 +1,107 @@ +. + */ + +class Pdf +{ + public $errormsg = ""; + + /** + * Fügt beliebig viele PDF Dateien zu einer zusammen + * @param array $files Array mit Dateien + * @param string $outFile Zieldatei + * @return boolean + */ + public function merge($files, $outFile) + { + $cmd = "gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$outFile "; + $finfo = finfo_open(FILEINFO_MIME_TYPE); + + // add all pdf files to the command + foreach($files as $f) + { + $cmd .= $f." "; + if(!file_exists($f)) + { + $this->errormsg = "File not found: '$f'"; + return false; + } + if(finfo_file($finfo, $f) != "application/pdf") + { + $this->errormsg = "Wrong format: '$f'"; + return false; + } + } + + finfo_close($finfo); + + exec($cmd, $out, $ret); + if($ret!=0) + { + $this->errormsg = 'PDF-zusammenfuegung ist derzeit nicht möglich. Bitte informieren Sie den Administrator'; + return false; + } + return true; + } + + + /** + * Konvertiert eine jpeg Datei zu einer PDF + * @param string $image jpeg Datei + * @param string $outFile Zieldatei + * @return boolean + */ + public function jpegToPdf($image, $outFile) + { + if(!file_exists($image)) + { + $this->errormsg = "File not found: '$image'"; + return false; + } + + $s = getimagesize($image); + + /* + * längere Seite ermitteln + * Hochformat wenn die Seiten gleich lang sind. + */ + if($s[0] > $s[1]) + { + $height = 595; + $width = 842; + } + else + { + $height = 842; + $width = 595; + } + + // -r300 = 300 ppi + $cmd = 'gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -r100 -o '.$outFile.' viewjpeg.ps -c "('.$image.') << /PageSize [' . $width . ' ' . $height .'] /.HWMargins [18 18 18 13.5] /countspaces { [ exch { dup 32 ne { pop } if } forall ] length } bind def >> setpagedevice viewJPEG"'; + + exec($cmd, $out, $ret); + if($ret!=0) + { + $this->errormsg = 'jpegToPdf ist derzeit nicht möglich. Bitte informieren Sie den Administrator'; + return false; + } + return true; + } +} + diff --git a/system/dbupdate_3.2.php b/system/dbupdate_3.2.php index d309f81af..2ab852b18 100755 --- a/system/dbupdate_3.2.php +++ b/system/dbupdate_3.2.php @@ -1297,6 +1297,39 @@ if(!@$db->db_query("SELECT bezeichnung_mehrsprachig FROM public.tbl_status LIMIT } + + +/************************************ 07.16 Vorlage für bewerberakt ************************************/ +if($result = $db->db_query("SELECT * FROM public.tbl_vorlage WHERE vorlage_kurzbz='Bewerberakt'")) +{ + if($db->db_num_rows($result)==0) + { + $qry_oe = "SELECT oe_kurzbz FROM public.tbl_organisationseinheit WHERE oe_parent_kurzbz is null"; + if($result = $db->db_query($qry_oe)) + { + $qry = "INSERT INTO public.tbl_vorlage(vorlage_kurzbz, bezeichnung, anmerkung,mimetype) + VALUES('Bewerberakt','Bewerberakt Deckblatt', 'wird als Deckblatt fuer den Bewerberakt verwendet', 'application/vnd.oasis.opendocument.text');"; + + $text = file_get_contents('xsl/Bewerberakt.xsl'); + + while($row = $db->db_fetch_object($result)) + { + $qry.="INSERT INTO public.tbl_vorlagestudiengang(vorlage_kurzbz, studiengang_kz, version, text, + oe_kurzbz, style, berechtigung, anmerkung_vorlagestudiengang, aktiv) VALUES( + 'Bewerberakt',0,0,".$db->db_add_param($text).",".$db->db_add_param($row->oe_kurzbz).",null,null,'',true);"; + } + } + + if(!$db->db_query($qry)) + echo 'Bewerberakt Dokumentenvorlage: '.$db->db_last_error().'
'; + else + echo 'Bewerberakt Dokumentenvorlage hinzugefuegt
'; + } +} + + + + // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

Pruefe Tabellen und Attribute!

'; diff --git a/system/vorlage_zip/Bewerberakt.odt b/system/vorlage_zip/Bewerberakt.odt new file mode 100644 index 0000000000000000000000000000000000000000..88226e050c5ab24ff31988ca5b8c5c545366f1f0 GIT binary patch literal 9434 zcmeHNby!qe*B_9U6j3@Pq`O->r9ncZdl+DbPC-&qLZrI|WeDk#4(Vka-B0B8*~hqybK8#_4IS(_R|tU>l{F7{@uAY-sKm=)w;Zf^!Mbq1Q-Ls%i^ZV=VK zfdO*>6D7z1!1YE52h+522AbF#Tib!zAm5s-4)&Izst;wcFo-eWr(ns;NvXs4l>h(& z0PP06)q2sn0RY?ps48hn!w)eqF!1s5Nk~X&XlNK2896yQ1qB5qBqS6S6*V+8^!4>k zOiXNTZ6Oedr>AE?K*00o&tqd_larIPva*Vbil9(vU0q#UTU%dW-|+D8%*@Qn%F5Q( z*5Tpd<>e(D|LXtc|2^=3)dTgqU8Vp4qNTjl15LN-ozd>dSxQ_#<604*>3+vJuhHVg z0_VWTgg${4df%r=jGOzR$`!sGNH(JdYS}Uo#5{jC&Y}t`N7?T782I$290Es+-9$g? z>@veZujqZov8q*j6Ql$yXO}1QY9bto)`;V(Okx#ha(Zf>L=cU-7rq4EX(Jnr(z%~J zzClzwi&MkpO&;$1jNZ$~?gRG*jgscuC)tS|E+P8cN70e2pV@LGMT9;MDtHqRMmpEf$fI!V*|1QeooA9s*ke7ZaRVrcR|E~y-hKBYBU0nb3O|DNf z1=&Ncxxfu*x1*y5n&HLuSt!HR%m87q)U}!LxIE1wX)6(6l@>B`Ge{{W-zY{K3Y_bGP2aFG z1i6Vlm1OVCJY|Gx@RhI$iX6PHzATzx_a=HY+A#DHO#7hZR`gMAds1q_q|><9lN{UE zGl-dudu3-+@zG3iAJ)NUuMOD`-c`lUW-0j7=UZ?E!iq`B-tdg^Yp1say+|tc$>9{_ zd9-przlgW^Q`lsQjJo9bBbkXHWSl5h?GB2)63iN&@vRuH8W~rk3NhE}PQ7U7Z9^0x zIf9sy2<(we$wu5(MINMy4DDSAr+e@$*l(Au)w7#B9wEix8Gc{rhj#@ZXt5jw5T#`J z@|3)nlBEjpT5k(LQHz~Mk6zZzc$Vk!i26?*E{5|ctgIyxSz{Y>52wfEypEo}pBF}v z=%A-j27GNRI=|cD;a6&=n-=JwLgYUl+|kP$eheCJp=mO}J&g5#V|pMEh8ze!yhoKz z8E^o^q;(>NIj!zxDnPK15L_ojpF(ETyTj4JicBcvtwrn0$gC%>I*Z2agG8&rp-Ym2 zTQVUf+N$D%^jR#3$NN6fN4x{6*4S#=`Q$1n$Z9ruAI93+o^(xef<;=9-z+e=u_Wg8 zwh8$qQ($}v#F$4e$G}gDk8`N3cZANe-QS)1WSCQp$%>LZ|B)QAU>GUy1VNvxQ9lRd z$TWJck)f{~`xGqMrCoslz$9X@nZ?9q8A0mUM^Uuc!fAir77;d#@(#_q$Woy}X8Qga zmhUcWF9tiu3m1ivGXZ6*?dX%OcO%ix{c;u;rz6!(0ce+f7lxi=ED3J3j&-7hMlJOQ z)4_djca2*U9wltFyk!_F2_()}=PJ4-_7;O)+o};gyh;|9`f~j8p-T+yS2e;!Lo*EBmvooRrw^#QF z7X)*4D|>IBA}%yU<4OkBWU1T`&nBqk6Ap7)r|3)TB{>%?`y@u@1wHNYs!g2CeNmXO z@|aE#Ywtbx%04ebHMNqgt;^G^0RbzQejs;a&s1CHbHjDyOYh29mEFU(Ja1v!*V)hF z0r5>=u}oA0k?KR@P=NNodts$W#NIFuQ#@QOqN;q_^iLlp!Z~;JFD>5fxzI~ zCo3mW$jKtOR19o;S#FKt7CB1pGQD$;KlffV4FW%3=T2>JbDT7m{ktL*`0DTF;!i)DCE z7bFljfF!C!FkbIxO`mpH*c$aBGbKCjE`fH1Wjl5D>O`GYnP#OfGj?#>*EdPvxBBn5 zjy#MD<`+i~wJME*m=y0m!xMRB@cz(k$?ay=zUDbM$Vy%JuKqnb$p8Y;gCeg<<;alW zIW+DK^5@-ejT7s3ADfTN)%8eBAr@bRsMz0q;%9Yv2CIocR#QqcfHsTZv zO96w5?z};_=~GVVEe^aObD$U~r$Ew@LfYQYJ-!Vcr5<=rHR#7?2td7uBdA1HJ@}k_ z%&P%6XIa8s61IViF(~ilv7^<}F`}qJw)N0#ijpZ2swZCbAR`-90ee9@wa0xPVJq#1 z5>YLUNn)#@vo@t6D|eI%iG#epX8XX)i@ESVc>u1hnhERAIRStCZ6jRYJEl1wDM%@ z&;nUlLrG9UI!uw5r6XlFe5SN(DlLX|qGTgJWv!zlwRtQpFJ=YklZ~+)izb~}J-qco zVZRK?g|EX{=)&IlXo>iVG*@Z~Zd15>k8=5dMo4-J2s;DgK;hLSv%qi@30_Snkr?G0 z?OTE5ds(Yq@pl5=n?@BFfu#l&acP)RB<=?s8w`RB)?ZpE+kfB``y`#4U!v-jZzEz% zHaO+iXGDftbli0uBw)cAQiyTWZhtoeD3?UBq~|DtibULxR$Y>)<+)AAZefSqGU)pB zxm6LVG{|SV%HNW507-r3q3RGPwMXZW2;?21WeyZ?lkYuNSx#iFBUGfW>fDT{k_I4I z*kD5k@|O-xf`k(@$>1slv2O5Xbjs)U5w@+Cb_fyngb>MP1~DPv9Y%RZ;i{?H4(Z%e zfY!DM;Mujm+s+5~X0JO7A2|6uc27)2k30kJ(MPaE?zgGrLpKd$Vmfagda%~*&ex~a z=3l%L+2~Bq8uv^!Vb7ItbCtDRxwE*AC;^RgRWmtE_iwu>yLdYtJN%A-BgK62wrK$a zR`{LKGN8$}j`ORcX~xl9WJ-W)bN9>GHe{Y2`nV8v6-3W<=UEGTK5s_xTIHFm&eJQ4 z@L)9=1G25)G)m+=+F?uPyT17cx?@fYrtS|Ar|$667lc1sGF3U$XN4$yatrWA@(*58 z*fjFlcrUjv334LbFyGaYV9YsNn`0W zcbdV|Bwdoye7+A4ok{{-K97HT3*)o8Xjd42wDKkGEh3vxEy@Ru#;~fyP3H=0FDma~ zb;RS&uqD%IZfNw^7ja%LRS_1`WBsE_T&XQ-gL8%(ES6s;Ht4;BB9{bu#WWlewFRiU zg{YE*+bhM4z!;v=)lcIQ#oj9L=I+yK4I3oSC_V<;#5@i=D6Ttv9H}!9W7r#Mjcz5l zw20cd3_W!XL4gJd(g{zlAuXrP(Pgtv9|f7*}`wkDf1Bb;~uAY1GvX!+8mY~R);!i@~< z)#W9Ar%gkt#~@3daO5aJw?h>E)vSqU-}c$c5=;J4V!LmG>*KOsTXTuT7}UAwPPWM^ z!tSx|M%t1xkLwqL5;6l8+UW{|`-;zIH;1^CiB z=6#uIH#vxX`L?T~j}QSi#KRPg?99`$e)Fv)Lq4IH@&@YQ#%D>kq%yNdr1OYVx6v;$ zjpTq)xkEq{Fh4WwM)%;cRWdsNs&vc8%c{2ivXxJ30W;x3F@6#Xd_E)+&kq-~o(cx7 zOXbA62110NbWotgU^9^AkS+Dc7&dU_#3tiqh-3ysiG0C{W%ERR6WwEI11!0y6}0sN z!xMX$8_CHtcscqCIM#}8;2g1frkvO>PCWHwL2=l_k^5_M3-xe}nWY`}oX^o!&-i4| zj#H_;MGW$8NZ_n*iRH?bEfDqbZE>W)5v;BeR#xl$J$RlNV(kS}<=&{Iu1DHrWq9B8 zF-(p>C_!Lutp6^7ig>^BgMpgireFg+KBlTYO>*|)&_-rxz(Z9O+(ewA%Iei_NIc+F{N5nDX{+ZS?d#F2GFJJde4x z#^y$7UQxN1`8gi-Qx1a@k}DW`1GGZzRt*-|&t+V;@+)*@GNDIJ+PGhZPCAp|i2p2T zQIwr#>r4M9jARCYc;LH?vsXqdHmq^YnyCgj5e8W}t_%S$A9ha)1G$TLDbhCo?jZ<5h`?9%ka{%}v!8jzhzo|~nN#-IIZ{V|5 zQ3N6hiHm{wEulSwb0(S-b)fa7)KXm@l~~=_F8Vmdr~W8uv92`KlLmZDae&wod|l7d&f52VGfqFFUgt!xE|lt7c)`q%)LilMPqXfwEWGp>4;6t7W`LX8z;X)h zBdZ3Udq#SNV*~f8jzv@rZWb1$UfEu;OrEN&zLaQcRKV7>nooT&wTPMEK2W457~$e$ zd3&rRo<(aLlch3c6J^vSbAp>JfNoV?@yK&My#z=v;k^*-O=_b-RX%4w#Q#{eMW=K_ zNkrYBy1-b@3J)D!Z!&Y~DuH-%OF?go$ErDh*wo;eqkrB>U}-q+Q3Dn~uS_Wwl-cd& zpxEhr{YCMOsIN`}bD1)_;pXoUEXeTqx#IBXbo~w~droMw)f8g6l@7VPt4LA^K1F8Z zrp!MAhjBzKvr{n)K>O)f2mO@`DRZ3fQiKeI+s2C>Gkg(1oy8RMIHfR@)Xz)*q?v8e&}iZ@-D2s`zC$A+PwCFSc=v|@gPD+fx6ei5q0@G@lme6 zbBmB3Nh=w`JPtWj@=RGt+#Y1x*igHXVlJ!g z-`fr^;wlZ7Xus@T4K}~HQKWnH_3W&6bHJVrOYPy8ZB?DAG0^r@?2>o(tK4Gi# zQdSRV?H%a@DISzmfmp6VA#%D9#Ke+WqWD%vQIGQ14uwky)Ll?fa|sH&OKyv9hL?CH zlpYi%7szY7R8|E?##DRKLW*NDjwE*ay_G8(uk<}D56{L{4_pp2)ay#gfLe#4ez2D1 zz65NbrE^?VOo!G*ZS)Q=aeyN^fGv{y@&*TaY~h?uayDlmTH%NB#3bx6?u5Dw)?N=1 zM>XQ2h0fewi2$3cX%bm&XBAXRN^V?d0y2J+RZr|j+L!esB#qO)2uB@lb=EGFT79aZ z%h)PG8Wb+cK*3CaTh}Wn=!;2LJ@*T{3$wcZ)^;UhMpyY-=KEwhW?B13m@EuK?>_H5 zP~mV8JWnT3Toe9W>D5^-3Z6AD?mStXg)DBi1itXwWDLK-zF`k#cs<+shEuXdA~8F} z=w(Td!-&GIx8$7d7QDqcN-VVnCKes1i5>V390#8rsNdiNK4z8pU2r60cJYf0ge&44 zi>X;w##!a5s8{;>~r7o46D{27$=7%J;p-rch`!o+_#+2~`=xq*oB6 z4V!gR+*&f)4T5Ps&=_fUq<0F2_7QI0_OEZw=jYhMMl;TQD!_5&T|E}yN1cq@mG0BD~5B~ulDxP(Ee+6G`K}K&p zuQzNuTTMJE?ehkVAv6(z$+rXdzW?Ph5{x%AJx~@gCzJf;0>F!&Uv>#k>Lk4O*3&Xo zd2{(Zf~|ybdPb*A`GP4g*F-dprO%B~O16X{RyV>>Gmh47UfttiF2o;tUnaMTf`0QN z4%lqC2yI69q{YQpY}K&dz?&?oZzklDOTdYVS*zQ81=Fmt9cA5`IJ#%LZxK!rao$Kj z?p%LGdKmVQN3*ua1CG{cC0S8Cao?i`FI1x7 z(`{MLR;^1@$lAwyG{oCRDTA1%PYmN5Yit-cJ&#T7D1{I!qjprzX*w)B_%2#uY2J=j zq2s`fwfdvP!>O-v_rmT~0=FMopJK(?Sr2?GoRb(8wXPsPQ5-bbb&#UA5AMcwI`Iozyp0wAhQ%^n{4M8LdJ*`++1$8R=5D-5 zyNej>0k=js!58!;RQeo`3+2K)BY7+*_h@5tKYn(;(m63px25p6I3#M$TMS`sYVnxB zLdbUJ&F)=>HX|EX#}n-*V3r>&hqjm ztSbr$5qc+s;($DlnLzXw@P3h!_Qxh~K^XW}HCTF#gixvKarIZ`g%#?gvO-?3+A8Oq z^qN;IH_}FeO)gFo5!yd0R5&A|y|>0}NDn;1K>{e3F#N6qW0xSus4AduaEuVrBeGKQG{x7UIbjq^WW zi}*Kp=wNJbZubwC{YnoEF@`w*;E`XIuCHf1fA)y6sj0c0Io!1%CpJ@OC#OHl+VF`; zco$u}6Y=^BF28s5uWrWyY3)PBcCLg&HG!7Qo#jrWhLM0QVWWMf z$PbhAA((lqhKmhvb`1g+yyC4qc1=B;N7@e-sN;-MICoVx>xA5|)-PE2ng8J?*H{9~p@0C%6VwB`dA`G+!WfB6xfufL9Kv2UZq z4BGP!3)#9o>5-%wOU}51UW;neZ!gWK7rV%E;|@+$W2q@BvZ9a*#? zw~|Q`UvuP)7@Me4;wM%M}Z{BT&V-*B;2meeYx!tn5kU&KT= z!i%p{Y_j?KE~sxTj*1e$>X~NtowT`c+Q(L!mwi&@IFK`A6tW6u+?bVY*IdxgCRpWl zd><6m{535WKP4no0P|eZ=}AF&gnud3-doRRqm)f?%ypL_F>;*nK*+a~#4Do{TpkVU2aiX)|Du;aL;vl~~z*9UeMTTsKaG1*Sf) z1jUHpJnvS1*9L>28oZ`UzcZ3+_a32A2b03xD~fbIBoGj91Af1%0Pf=-E~4K7>ADdqPl*U|X9c>Dt8+M;h1^Pl3B{{rVn z%J~=0w}5@E-~2_eNe*(06hF1 + + + + + + +Bewerberakt + + + +