# v2 git bundle b7180ab30cf455b352b0c6fec4893027d9bc60a0 refs/heads/bundle b7180ab30cf455b352b0c6fec4893027d9bc60a0 HEAD PACKé–xœ•Ë[jÅ ÐW1ÿ¥aôÆW)ånEÇ1b¯¡d÷…Ò ô÷À™ƒTDù�ÆQN˜ct¥f Nù¨ }æh’4EƒÏ Ê{«MRN)Q:§ìê¢–Ùæ5šèˆ­áš{^Ü÷0îpø|]�ǯ<·ʱP«_ ­[-jôÞÐ" jµ–9ù?["þmA{üWOa2,[™e;Û`˜ ÊIÇ•–~„û{”mŸï•:¤2˜f·ø“VXÉ’xœ­ŽMjÆ0 D÷>…öå Rü_JéUd[ô 4±q”Eoßt×tvóx £Sj©(-ÇD%Ç•¸y.nå5ø,‰¼M%&3xÊ¡À-Ä_Ÿ¨Ú€–*®!ÛV¨%Ÿ#¹Ø˜ƒ5|é³OØû1eôGé oÊÇuÊ<—£ßàë{ùÜôy•¥öý(&Ñ£uð‚wÌM÷MUþgÍÔû—¼Â5«ÀY'™h‡” ƒ³Þ—ÍÝZÈ—xœ��KjÄ0D÷:EïA’eY !$«ÌÂ,ºÛí1ñ«uÿˆ9BjSTQ�ÒSží‚Á[¦(³å8úó2 O=æàF2›OÙ<‘[œ$Ð;œr””hÄèsJ8vÞö¹5Øô¾Ÿð]ôÒ¾X˾Á;>ýóVôÞè•÷õÜ”ÂdÃ<¼Ø.ÓÛµ¨Ê¿`ÃýUÞ 3ªÀŠ[Y¤jÜf¨�Ö}n¿Rá§>Ê\®æ�>Qh’xœ•ËKJ1Ð}Ÿ¢ö‚ägR‘Aæ*•Tµ=0é„|„ÙyOèIñn¼ÙE@1…=î:ZíP‚r‘Í‹ qÑpHF{r¤-ê­Q—sÚˆ>«RD“vöì)ë€È¼‹ Ž�$ç�ÖŸWЗxœ��KjÄ0÷:EïA¶$[BHV™;„Y¨[­1ñ«uÿ˜9BÞ¦  xzˆ€ ‰'Ä'&—‰ca˜ç‚Ã4¹,³sfO‡¬ HÈ‚P18máB–S ïSð‘p,ƒI]ïÛßU/�à‹µn+¼§'?oUï�^y[>`˜£Ÿ­Ý/öœ9íRUå_±áóUÞ ï9©À’ÖZ¤iƒ´fh�–-÷_iðÓu®WórR}�xœ•ËKj!н§¨ý@PÛÖ6 a®RZeº¡mÅav9DN˜“B.�íƒ73¬ÖIGÔèУMF*’G6š“c«ìâ5‹Š�¯n‘J‘'eBˆi]yÑ:Ië½q’bX͆Á%‹çØKì\wlO¼î}Vn¿òxÏxœ/±ä7Pn3N.›—p“NJKÎÇü¿½ým÷Òøf% =6¬Ü Ï� Í“áûó �¸½÷•�ë,HFâ�Ç)~�…\¶—xœ��KJ1EçYEÍɧóéÄAªRñ…gèTöo㼓WNf0u)%#§lS�Ä©Uô�ì‚.°md=zƒÕQNÞJð¹ùœ˜-q°¡j]œ'ÊÍ`0d¯9§Ê”Û~Â{—�‰ðFÒ÷ žË_¿»Ü&>Ò¾¾€‰i‰ÚŨáA_S—]»ÿ+Vt½òÌ£aXËÖP¶ câº×ùÃ>ǽ@ýKýõïS’xœ•ËMJÅ0à}O1{á‘iþ¦"âU&ÉÄš¦¦Éƒ·óžÐ“âÜ~ðõ&Þ™¬-¦˜ŠMÖi�Š\F !Ë [$Tótr“£Éq™É²I„�Ęì#Î:ò²"'âyžxôµ6àKΕۃ†—kœÒ~åí½ð¶ßb-¯€žŒWZ/ž”Wjе”­wùߦ¿=ŵ6y†q&îWl|Jƒk„RÓØ¾?¿ É]Z‡^�÷>¶"·k›~ (WÕ—xœ��ÍjC!F÷>ÅìA£V ¡$«äJ3:6’Þ®ãûçÒGèÙ|pàãÈÆ ¶–˜ i‡9 6•8$"¶™È&sòX¯Øé´±×q‚NˆÓAGËÖë=rR[Ž]Ðñ^ÈK�xíHÓª*cM Ë2š9Zgi½ˆ'¹…ˆÁÞòlâP¸êÞ@Éâ?9!™ ]‚C”Ec°L³giàÞÖ\�-+×OÞÎG/Zÿäù#ñ};INO0ú™<š Ð#’Sº·¦ÿÛƒ¬¹ê#ô¹)R¹h…£‡”cß~¾¾áúvyy=¥²)ï½ ¿wšUN’xœ­Ž;nÃ0{žbûÀ—A�«p—ëX@$UøöV™dº7ÅÃÌ!(ëŠKò¦™rW³õLŒÚ“¯d3©^†ì$ÏÞÛX'›1bäô0¬Ù¥ªyLÅºŠªœóÙlmÒÛ�Ú„Ï?ãûÿ”ïë”~.G�à÷µülãy¥…ëþïµ¶ZÇžQ“îÛò?6Ås—<àj™†ÀÉ�šôµ F,åy†põ›ð]!—xœ��ËjÃ0ïúн‚Ö²#©”ÒœÚ9H»«D¤~`­þ¿¦Ÿ�ÓÀÀ0º‹@A7Ò™©Œœ ¢çĶˆ/Á‰°E—3›-í²(äx¶%FœÈg©`DÇ‘打Ëq(™Ôõ±îð]õ§g¸�Öu��ôϯ{ÕGÏ'ZçO@Fo­�¼°æ°sU•—bCÇUÞ¡oœT`NK-Ò´AZZÏóÊýW\Û³n@õfþ CS?™xœ�ËÍJÄ0à{žbîÂ’¦ùWèmQh½Éd2µ ¦)i¶àÛ >‚×¾V™Á)CÞDÑú˜Èö*© †ÞÏ>t”¤å“V^86¶��Öº¾SQ³Ã(“�8kr†’�Fà­-¥î¼-XpExØo×?yúÊxý>QÉ�Ð9¯mÎH¸“NJA%çkkü¿-h)•ï¡r.Ãðñ6Œ/çËçóøú> ãe˜&àõ€+̵d ’·²3àš ÚÅ/Æ3X�‘xœ�ËMNÃ0@á½O1{D•Ÿ&±!@dW�Ô •]5¶Ç¤Â‰­±ÓÒ‡à„œ nÀöé{™‰ “M+]ç´4•U­ÂZY)›†T¥l©K-©ÖÒ""Óœ¡]k©u¥°®k[´Rº¬´l¨5kG)�V6N \ò0Q‘Ï8#ܤ%ÿ–»· ~eÂt e'×­R]]ÁEÑ…0aš9ÓÿnaÆÀtK´˜ ’aŒÄ�=»x‚ïÏ/`šÂ‘@s8%bO)�Cï5šw!9ÄHú×—~ût¿Ù?lŸwC¿ÝôÃ°ß àóÂt ‘ÃÇùR/3$âãÁÌá#ÎÖSèýŸ€™È¦•ø¡‚yí“(xœ•�ËnÜ0 E÷ú î’ ‰£Œ5~A�ìƒnºè𖍱PZôÈÄ_ØiEWí† ^òÞSÈvì,u�9Œ‡Áb?õ�ìu7iÛ+ÕMc‹ê€G)"&ò”jÉŽ8lµŽÇ–¬:u”½ÔI9J+µXË`¦8cZÑ#<æ)í“çÓ‚Ž–'xèÕ Jµ#|‘½”B‡eq¥Ð©Õ§ZX÷þœ×\ 2ƒK ™À:¦ 6$0Éòz…D9p-.x21éâÞh[á° ñ]'Œ” Szsšòoí¶l0¦»È¨iÙÐ\o}³.|è x,®·ºÏñc¦í¯�?n6ë gô'2·`‚þIéb6VæûÁ¢c2pveWղΓù´si¬y÷»G*Å=S" ÷�†i„ø΀|Æ5_½¼¾þ+£[˜jJ¼î>÷¼5~„+3AÁt¢ò³šœ?AÄT2Ôh°PnÄ/ùíÝ÷—xœ��Kj1D÷:Eï FšÑgdŒ±WÉB-u+ö|µîŸ!GHmêQð(Ù™‡ið†qÄAÛDt`(&D*Ö&‹.9*¬6Üy=±³D“Ó˜ÒXÌàbñ^“19û Z7…]žëU>{‚G–º.pÅ¿¾ÿTyötÎë|&ëC £‡“>¢Žu®"ü/Yåã•/Ð7Ba˜q©…›4À… õ4¯ÔßÜ૽ê¹~«_FbRJ—xœ��MJ1F÷9Eíéôd’”ˆèJï .*U'ŒýC§r�àÛ|ðàãÙ¡ %D$ä\c‰ìCô>ÏBHõôÌg >¨D·Ó¡«AÂÉ_1©—P5œÂ)^k)³zNRçâhØm;à½ÙÇ(ðÆÖ¶žéo_¿›ÝFyämyŸrˆ cFx˜NÜi—f¦ÿ:;>«úc2……ÖVµ[Zú(Ë&ãG;|ö{Û�Û—ûa R¢’xœ��±NÄ0D{ÅtÜ'—s„]A ˆ~moˆE[ö†ã„øw! ¤�Õ¼�ND@�%­K…Û�®µéT¯K’­Q•µ]]Y%7Ò¨ZŠˆ‰&†¾é[¢R“®P«jƒM/ë¦BYªºë”©”6ÛVWgBÌLœ.ò)}*WOÝX˜à/¡lÚZ5]­$œÊFJa‚÷Ž™þç½{=�²I)­1:È”^œ!˜ÐpR"Ã�gíƒ�G‚ˆ<ñ0ÌÑ"ÓúûTüû�žû1ìaÎdcÌg'o÷»»ÇÛ›Ý;X·ÐÆÃJè™�ú—�ž¯L+˜ÿR–”…¸¶v¡ƒÁL�™ü²:‡c¡%òÏË‹\ˆÐóœß–xœ��½jÄ0„{=ÅöÁw:Ùúq!MÊ@^a%­OÛ2Ò roR¸N7|ÌÇ0\‰ÀÈYNA‡YIį¥Š¤öÖ+©ípGxiý úKÞîæõÊö 7ë&c� SAˆøú¼{yÞþ´Íoc Âq—xœ��KNÄ0D÷>EKl@ÀàLâ|BHì ~h·;CbÛ „Ó#f`WzR½RåÈ mÝÕRÕTS§¸¦J¶eѱÔFõ�Rۦؖšt£EÀÈ.ö6]+{’�êƒ�ÔTh%uÿƒ*UWEC% œóà#`â0`\Ñ!\¥9pÜ“›Ý„vÜ�Ÿ®¡hÚªnÚR5p*)ùi²9óÿÚ¢·Ÿ—yò Ã+.˜(Ú�Ïóø¡�~‚[oøñFt»wœÀ:HLs´yݬÓ(ÄËÀ9xðn\aÀOsÊ�ü‰�¼a8vîž/^žO6¿Â¥‚í˜àc`'R`²½eó7µW90dèp\¿ø >KèÑÓ[‚‡'8RâØp`gPû zž‚u»}ï}aI²iÒˆˆ‡ð“ÉÌn±IÊ4öö‚ÞÀßo(3‘8/>P¶Ö‰#ä2§`E²K)òËœ3švTn¬I‹¤Hf&ïØúR�r$Gqñ‘’¾ú`&<ǽ+àÁûõ� áí8wÖ_ù¸U\· õú6.>\ÃÕ9x1ј‰z­ëü¿=) Òèú´6Q|~…s/8>YÖ/ Þd½�Šcí ”…•ñØ (×þÍÐóÑ7 ã/]X·éþ¨dª˜xœ�ËKJÅ0ÐyWqçÒGÚ|ûq+7ÉMÚ|HS±3á ]‰àœ8½AàR$ÁÔ$ÐH Æ.Îinµ$¯$A1¡Í.io�Cm¡`]Í/á’x¤™xœ��ANÄ F÷=Å¿·5¥ÐRŒ1&s’øpêPh(�Éì<„'ô$F½�»——¼¼Z’p³Á�˜+k´è‡à´„0v’&X'¥ÑÍÆ©’ub”V+#X a´‚ì}èýàeðBª�G„ uÃG=çB¼c;s¹sbzÞ� å×¼¾­¼ÄG—×zV“æÙÐC¯û¾qy]—Zñ¿º àúDì=�"tÊ´•üWi¿,1îôõñI.‚Sç²GKçÃvåˆØ[úÛw.§+R]rj ?Ôù²\‘ZòØb¾w·\.!æ[ó û¤k¡Ÿxœ�ËAJÄ0Ð}Oñw*bIÚ¦?‘aPpíB½ÀÏO2hÓ�&àì<„'ô$€pûàÕâ= ¨”aâÁ`ÀiR& °,+¬0Ú2« ºLŧ B…‘f5*m5r˜G©ädåì4Š‘išXñ¨mè¨ÕóV€vŸÏT.”{˾\åé´R\zÞÖ#HÔÓ<£ Ü ¢ãm]c­þ» ñóÖQ.w�Ðv¹Ù½Ù¾xwøùú†Êd/Üæ÷tS!&^šó`[\êCLðúüñþáí:i)žÜJK)¦Sßý‘/f�xœ�Ë]JÅ0Eá÷Œâ<*ÚKÛ¤M""Nåädç¶`Û�ÐÙ‹w¾®Å× @‹=i­£xãħ5ˆ‡ŽËd–äh£Ù•¹àldƒw:2�°u,QÃ�ëì‚—yM‹3Kb¿ÎŠ{Û®B\‘7.?|2½×žQåó~ðþu“ëø É:³ÎÞO–^F;ŽJ®ãØ[Ãÿ´Jû÷Sä\žß¨WPî¡öp;¹UÚÏÚÀ‘®D¹@¸!Òߪ­€�ý¼¿>Ð0Ô«A2·Mý¨çaΙxœ�ËANÃ0Ð}N1K¨ÄŽãØ!V\£šŽê¨IÙN);Á 9 G`û¤W3@6ômáºÞê§Þw^ù D‰bÛvZubûÖ™f㌵’g탳ã)˜qЀ@ ŒÎ[£,\/ƒcãlÃ{�)l‘ó'¯L/eß�ÿäí¼ð4$-¯¤g¬öN+zh‡¶m$-ËT+þ·›qºÝ­\Ëcà-ß?SÆ’® žk”¹úùú¦"™«Dš>£Pä+hMT"æùéãŒz ÷éFÖPŽi¥šh/ ‚|�ÇR9W„æÝÇk¾šxœ�ËMJÄ0à}Oñ–'i~+ƒ®ï0¼$/3•¦)I 3;á =‰àÜ~ðõJ–�£wœ&aÐ˨“õ$LB²ÄµW¤bÔÞ¸qذÒÚ�P畹ç2$.•“Ú„¨]$É'%ÑMBG9àÞ¯¥6Ú®Xï¸"œÚ¾Qý“×KÆyy %¿€°N™q2ÆÁ#·œ¡ä<÷NÿÛCšo+övx†Pj¥ÐáíãÒ‚—?_ß°7öÙŽ¬E˜×Ö #”Œµ^*�ã\�Œe¼�7¼/ã𠽤_•=xœ�“ÍnÛ0„ïzŠ=&°e[Š-ÿ (â:.š"© ;=+r%‘H‚\9õÛ¢7@n=’Üý83K²#‚é,Mò›l.IS,B’9¥i¶¤y>¹XÅiYt¤älša‚¢Xél1“)I‘%b–%)-’ìæ¦ÈŠå$–+ã=Ù Ý 5­o-¹°sW6¨ê‘0ÍHæ‹i–.gY ƒÉ|2‰„iÅLÿׄ¼”~®Ÿ0€{´”.zv­àÖÆIs,�:’t¢RLá4Šâ¾~,Lc�§±Fö£SS¯z¦'w$oŠ+øA|`GØ Á’óÊ3iAp4uÛÐ*š+Q‘xýD•h]O m�‚š.厯D¯Ò+IcœTY}!u„ñ¹½¬MŽ5£ UÁ¶¹oswézÕI¿‚gdòlÁÕž¤òן„yáÐÒY[—d¸àŸͨ49€$KZú£¡Ë(Šb�Fø1JwëølgÔÈ”­’½1¥™J‡¬tù>"6 éíݾÿÒô£µ�ñI‘g²Q ëýæûÃóvóü{¿½v®Ç¡šMoóš`p‰¹!_�TX:l.Yì·ëû§ÓZ‰LPãÉ´ ¨eg»6§0+ã$Ëa+–F¼~LîýåtY�ÇÝ Y?>¾lvO¿v‡íË·‡Çí!Š6&^‡OC2þzZÁ¦ÆVìlëa:ZÀUò¢§?| ·Ú8²õé5WÎX%Âwˆþ˜öM�™xœ�ËKNÅ0 @ÑyWá! Åù6!¶âgZÑ6‘“>ÁŒE°BV‚` L¯Î*…„|d_Ì�fLÞÏ‚.Lj-âL(S#•c€u6fAºXÎÑÅçKà”_ØñŒ1£„’ÑLtŽ¥*P—¶�~ÐAðØÏ&úWž_wZ·{®û`š}´.'„;“Œ™¸îû:†üïžÊú~ÓY©‰Þ>À"´�…á7u¥!à�‡ïÏ/è¢WQX;œ ä*¬´Ö*ãÔ£ÿÊé‹/]òŸxœ�ËËMÄ0Ð{ª˜ã®��cÇŸ „¶•±=“XÄNd;ìr£*¤$Jàú¤×+Ìa"©´1Æ©QÌR³™§¨…^‘ rt’¥ò~8°RéàXè8FV‘-£¥f¢ ŒÖOnžœ¶­qž}Ý+`£cÅú‰áµ�Õ?¹-Óööü£u“‘J O 1„=çÔ;ýoœ—*T¯/Àé+áÖ×°Rx‡Ÿ¯o8Á}¡©´Nagh .e6ôA*ж”!e\è:ü•aX�xœ��KnÛ0Eç\Å�ÕF‡úX’ƒ ˆcx–6� �OäSD„" ’jíYÑf%Ü® Ó‹sÏàäÈ ¥kn¨jÔÐP×V•ì×¼i‹²!] kY¶ª¯ É�Ùe”ݦª‰hPu·Ù¨¢“�ìËVêu7HU mW ª×… 9�>‚‡‘â™á6Í�ãe¹{›ÈØ•òÓmW7eÙÖk|–­”Bùi29óÿ½Å`N‹¤"ŽË�ÖØÞ¾m^ï�/Çýáa<¾¾Ñ“zÇǯßHÅHÙX‹8;gܼƒ™¢ã$ÄÖ&�È–Nø§ÆÈdó¨FVïÈsb<ïž0�µï"¥%ñsd‡ë¿¸`§ƒ7.C{NîSFä¼Ó0ÙL¼b篶—x¬¯îÏ7ØYš5ã1Ì õªÃ¢ø å]æS^âÖùÈÁžïÈå1ú`Ô%‹øº‹œ�–'xœ•QKnÛ0Ýë³LP[ %Ë¢Œ ˆã­I ×é~LŽ,I�”a_ è{’Àª tÛÝ`fÞï¥@K&¤¬QvESÈr”Ѳ+Y)Y¹XUŒ:Ê<² êJa‰]u¢VÄE%;ÅÔAt�j ⊠B±lª ÇÔ»É÷.hâè)L›Çã€ÚäÒ Ÿ�×b±,8«|b5c™tàS¢ÿB7õ �)'ã F¯0ìQ›(Ñ´ÛhX§,!90ÉŒ>hÛŒ)Œ2��²lëÝæ[»ÞìßwÏù VàÚ#ÁnãÉG¸ãŒåu“sÎó%¿Ÿý•ÖC°¡Ý^u®?¼à9,Å 0ÈÞh;žÿ¹‹E^6¹(ghp'×uF[ƒ>9?9Ïæ°{^yùãç¦ôcû Í€ì 范7g�‚†bï\ÒöxÍ ›Ãæíu¿kŸÞ÷íë׉¦Óç‰ãšÊ”Q»mA‘7î‘dÒÎfÙÆÍ×S«¤æO—l ŽŠàÍ�¹€;þÒÙDçtÖòæòˆ6õÁy-§¾²\yÊp—xœ��ËJ1E÷ùŠÚ CW^Ó-"ÎJÿA\T’*'Œý SùƒŸàݸp8z2ƒs˜Æ03-¥„E¦@1ÛbgvKA�‘eòæ “7…ì9Ë,Ó-YFŠ®ˆ÷b²â¦0T1Ôõ¾Ÿð^õ£'¸e­û/ôÇ·ïª÷ž.y__¯³�b\ài3ã]«*ÿK6yTùúQHVÚªpÓ´h=­{é?Üà³=ê¹~™_R$Rc™xœ�Ž»j1Eëè+.\l�Þ !Rç#F£‘½`­­\øïI }ÚË9‡;³¤u¢äJLÁØ!eƒPY«¡+EP«g±áàuJ•4©l¼)™œ2èÀ GÅŒ*>k #ÿñÕzG¨=°�9¡FŒ6¦ˆ 0ŽÖå’Þ絉;oW\Q¾î÷�Ç÷ò~i¸ÜNÔÛ›„­g Èg”Ô[[æäÿÙâ“Ç…åOD…8È�¾ÖÛBs‡§e­ÏÔÛÖw>ï4pãqz´›ø Geœ•Exœ�SKŽÛ8Ýëµ lŒ¤H¶ävA�Œ$™Eæ%²h1¦XL‘r·³Ê!æ„s’@²Û“Ì2;‚`½z?&!‚íݦS÷ ÕwM¥î×]S5•©7›m]CºU÷¨[lÖY@!Ÿ`ÛèMÕn¨¥ UgVÝú^5J«n…«•éZlëõ ›*Ã1õ,€‘B�rF�ð*Ž�d¾ysкRñðê»m³©ÛÕ¦…?ª»ªÊƒM‰~o:2¨Ë”#ô0P¬©ÃHðï÷@hà�£ª3òŠb’ì7ÍêHb¬£‚Œž $*é ‡0ÝE;gÍöï_€¿ÉØãî}æ©þåå¨�>þŠ$ÅŒ} ¶´>’…r@­!X€žÐ¥^õ¤ŽYñËêÝ•Ž nZH ë N(×Õï¬Ìbsx°Q±èöÌÝ(©r™•` )nBoÌ?±¦òK„°ï…;—m2úd‡+Í_Î.ÜXB�û„Ö“Lç0…J>‘†Î±:^ pÖ'xd9Ç�YÖÁÒpŽ_ÝdìžU²'‚Hr²Š–ù VkG�(t}Ÿ Ìé†UúÓ z Ë„<Ÿ0MBÙÃbŒšy�§åOÄ#Mö\<³!ÅÝ…ø¥=Õ4IŒ?M�Ac¢BSˆSB|7ú¬˜Šo”bBGУ×lLáø�Ã×�Mçâ€i*ä\ùÀ�$4E{ð1ÕÛi˜xŬ˜¬ i÷ÿdæÝéRÌI²¶Ó´×Ïéì³—1Ëö\¼�?-éâÏóöGMðW#4åõÇ9TzJKxåY(¸óô©VÍß1û¿}à�>xœ�’ÛnADß÷+ú�ØZ_’õJ� �E1|@{ºv=dnš‹ÑòõhÖä&…^GÝ]5§*G€T¿[÷ª¿”]ßm¶ýªë^I«¶ÛõJÚV­†á Mà—i׶블ÍZa=0¯±jÝÐï®Z– ïú¾“A6 —|ô‘8!9Nì˜Þ¦ç—÷£em–ÊÛw´êvÛ«Õåz³¡7m×¶�òÖêœñÛÍVÙGºñêqÐ4øHIEˆT‚p}�ŒAß“ònÐc‰œµwÄNH°£êŽ95Í‚öÚ£ ùÇa:LaýI»‘ŠsPH‰ãDß¼`ù3‘v)³1³Î,ãCÖVÿ®ó‡¢�PÊ<"-›ý˜=Ê£I¸“ŽÞÙšÁ Ô=•JG+²GÍrl‘f 1ëA«úéÀù8 ÜU§ª°á2dáK&«E ~qÄK•jždrlµz6”–[SÏ]Wb�ÊÌ`d5Ñ~ÿå•)™Ç��ªS©` J}¸ýL¬*·:ûj@ó" *œâJ‚P„ó'Ε±wTcY6 úêåœÖ߸Ÿ<ÇZÑyg& ÑÏšB"ѵ>Óó>~º¾;·â±u;s‘)¨ ˜«{gù}Ž`kt…"p§¦3O'¯J¢Zˆ(•ƒõR̹%ä'Õèmôùˆ’ˆéL:‘ód¼ÉY6•\Æ—xœ��KJ1EçYEÍɧ;•ˆˆŽtâ :©ò…gèTöo㼓WOf ‹“P Ù£¯S˜æY„]™¼„äЧbÍA'o ÉZ�Ìs ¾°"ÏÎ.(9EK5PÊ«Ô`hèm?á½éÇXà­hÛ7x¦?¾~7½�å±ìë 8LSt!¦öš¹ìÚTù_±)×+?Á8*)ÃJ[îÚ�¶ },ë^Çwøì÷v@i_æÒ>Qã�xœ•�KnÅ ÷œÂûJU`BõTõ*¶1Mª—€Y¼Û?õs�nGš™ÑU•£wÙc.ÎEvÅŠ´ìfJɺ4-¦Q×c@Èȹ ¨KšÂ"ÌÊK*6°·ìœCH-ºÆZ;Щm¥þ ƒàv^MûùøÜi»¿JÝßÁÆÅ£usòð2Åi2R÷}CÿgÇ?ÛÈZ»¾ÁÕ2 …óâÖë—Ê€ß.”Úá”Ní{ÐÚ}[=Ì;1W˜xœ�ËAjÄ0 @Ñ}N¡}K±�ØŽ†Ræ*Ь4�:6Š20·/”vßíÿJ% ¡Ñ·LÈ&ŠÈDã�רæ!'IY4=‰ë¡#Ï‚L¾Ñ_à›ÀBVPxIXügÒ÷±']ÿù¨;Ò”ógV ù&uõàdE|se‰ ömÌÛ[Ã@:€‹a;ÆàÛß´ïÿKËš¬/2ðñÓ´ ÞYÀÁðwØBÇÀÛüò3€S¯'BÚ !Ws�6¼°âÊ[q‘+�£ä%Bèº6]´uôØÓƒ|oµÐéêÖ+¹<�à2ݽy|킈 ¤… :2žçða˜�hÙÖ{žM‘—õ…T/ÏÞ½²¢ÖÉ�up!޾- �[¥6#«°“ÜËpQr äÖ üë ¶¼l#+Y·å9, #*¿vᦠŽ÷²1øç®· ±¸âqÛ/¸éýÚÁ�!­üHîÖ$Í µ0óŠ[^ñËŠ=̛ϯKmN3zJgÿ´PL–²ª-+ÛF;çëð8eÑÚÝ÷–žôíe¯Ȥ§��bY¯ÍÁ*²Þáks³`@ÑTœÐóy»Û ‹o¯3%¡>륄\ç¤ØCÙÕØnr¿›òøñ¨–ºßû¤ªÛ%în®he¸ù+-ú€»)a5käÒT¬­¬Ž†ª=U£pn›¦™ê/)˜½(„Þå±… Hšõ^Mi›/Öìj°®£»!`õY�/祜&¿ÕÂcº+(íéÓÁGtæb‰Å€«f â”à¯ç|¡··@up‡ õ‘ãå]{?£¢yŒVÿ2ìÇv/ÍŠi:+ôz†jx`Àæ¡¿¼£»TõjyXm_;cSïœ+5¦*­5c¾-p†ŒHñ¥4¿eû»26îqg—¹*5ýïYÜ9JvŽ|¾Ô§Ñ–¶Ç}+.6Ka5tÝÜõ…¢Çþù©í2”ס¯®ŽCÖìMÃxØèÝEÐÞUmµÈÎÇÖÊÌ÷e•>~_êÕ;øk÷7Öúß/‚AãPT¤Ëp<ð›È0GÒoü�²Ÿ¯â$€`Ö))�^|ýó°tû™xœ­�KjÄ0÷:EïCLëã–f!WiËOcÃøƒ,'™Ûg²Ë²|EQðZÈ©OÊ�2ÄwI±—1-,{/š€‹d³kÅÚ%"r*£HÊ.جÏ>º2†~°¬"¡=Û´UÒû¤õ¡«ÒÛŸñq¨G·nûýÑÝæ6�C—·å�lLÁõìXè…#³yÒen ÿS3 G»Ò^_õöûèÓÓ×Ó§eq§2›eHYÌ�xœ�ËKnƒ0нO1ûVÑü­ª¨WÛã0LRn_µGÈöI¯ 3 ÕÞ Žl .š�| Ùe’É.…ÂÚDë£ÚHxí q4£K†mtÖ›kýk% šòà+.(:ú½ ÐÎÛ�䤕às?6–ùº-4Í—Ü–+hFg뼡GT¹-ËÔ;¿¶U�~>@øÁÒ¡ð6·žM¾ëÜžï°sî;Ð,Lå„ÜÖ:Ýá¢~enU±’xœ•ËKjÃ0нO1ûB)ú¹”Òe÷9ÁXÅ"¶$$'·/”^ Ûo4f@�ŽÆ“ÚHµ  ê˜mˆôrF­§J�óÍbF†õ"¢�,1Zb&g•'féõDÇXKê\Wj/Êý¨Ü~åë¾SÚ.¾ìŸ ¬»%•FxC‹8ù²ïi þß¶{Šéùý‘*®[yÁYÚ#nå„så ·Û7tö�G‡\ø’cº�Ãô3ÆWE—xœ��KjÄ0÷:EïA²%¹BHV™;„YtKí1ñ«uÿ˜9BÞ¦  xzˆ€ nòÖ%ÂÀ“GžsÌÙçÈXÄù¦dv:dUpƒ†1'±Ä¡X˜Ø {KƒKstYRœÉP×ûvÀwÕKgøÊZ·ÞéÉÏ[Õ{ç×¼-à&£·£àÅž3§]ªªü+6ù|•7è{!Xh­³4m@k�ÖyÙJÿ•?íQwÈõjþENQ<š xœ•�K²Ó0EçZE¡H\²åØEQP|ÀƒèÓvlµª%%Î¦÷ž38EÁ8c¬»iž°OƶÃ<‡vÍØºy:›n°Áw�JV0|&í†Þ;Œî{s2‡^‡Þ�§“ï´íz>+[Ë…lÆt±r·Ñ‡\Êcù´l–ÖÆóöÚq2C¯;s†wzÔZyÞ6*ÿËîõÓV3íïA0ózEpÄ‚'@–|Ü“�„¹€ç8ÓRWÌJáÞ„ þ;fó;s„•ËSÄðÀ�¯(B3¼±m{?€ç-­¸S¹ לÈ×üVásðå劥õF1|%A_èŠrM‰¥QÄb‹×¾%ôµ9"Ýi›Ü’«:òÉ›¥ªiabgÑú¼hä› -x ¢©Î†%Y•§ÜöÞ»|L‚·"}ßà9ÿñõ»ËmÒcÙ×0!¢Ç”áA_S—]»ÿ+Våzå'˜GͰæ­72 oƤu¯ó‡|Ž{? ô/õ ¬PQs˜xœ�ËAjÃ0нN1ûBG¶d•r•é+6±"#Ë�ܾÐ#tûàõШ#¼†ÄIF›eÎÂÌÞyM2©`²Ù¥áÕ)#„Yd˜‚:ð¤Ñ…‹uÈ’ë³ã(ÃE­‘³/µ‘Øiy ]�sGû“û£Èº}ÇZn4øÙ:fïé‹=³‰µ”µwüo›¸Ô†j(õ :ºl •øzÉÐ~Ž|VÎý,ùqú�$X¿—xœ��MjÄ0 F÷>…ö…AI;D`bÍR"�# j,1bP5ˆ¿FŸÆ„Âcv;²\3Α$ˆL^ƒúˆx(œ”%*ù„ŽºÝ·Þ«}ô 7¶º­ðB|û®vïùÂÛò Cœ§0¥0{xÂsî´K5“ÅŽÏWy†¾2�…ÖªÒ¬­ZÏËVú�4øl�º×/÷ gS_‘xœ•ËKj!н§¨eB`ð3Úå0„\¥Ô2Ý¡mÅÏ"·„\ Ûovf 2"¦{ŽÎz£r�· )sÌ:¥­#”Z4ê|MPÆ !fféBŠ: ¢q–0Åp·É§Í“C‹‚ÖÜkÜvêßt<ÇjÜåã³ÐqÞb-ï 64Îx'=¼ÉMJk)Çœü¯­äßq¯�°Z¢É0V(5­“¡ÕãšÜ¼„£¾}�zA¯u>2�ƒ_ÅñnX—xœ��Kj1÷:EïAiBÉ*¾Cð¢[ê±…3F­ûgðR›�’ƒ¦�Ë”‹×n 5G‹ÑÎÉÒÞ3y2Aíxð*àÉ¥âªMX�M5Ï9RŒÉ™Y{m‚7èm¹o|7¹ ‚¯"m[áŸûykrôZ¶åLÊ.žu§áEŸ¨Ó.M„ÿuVå¬òŒ½¢0,¸¶™»tÀµB´luür‡Ÿþh;”vU½Po›xœ�ËAjÄ0 @Ñ}N¡}a��±#—Rz€Þ¡(’œ˜Nâàxæö….z€n?ï÷fÙ' ¨Q)e]dLèÔéŒfsÁ‘MÁ;n¶wÐèNDÑLrºú«$OÑ“¦™²H2O$>âÀ÷¾Ö|Ú±r{òÎðvÞk¿åcÙ¸Ü.R·wp�qL ^pB¤n[éÝþwR^�UáQÛw¾ÕÇ—–óà.+ôV–Åô Ÿeïbø„=T‘–xœ�Ë[jÅ ÐW1Ÿ-…2>¢¦”r·2êØIÐîþB—Ðßgvf1¯²LÆ{Þ(+̉Ân½ÚÑ$ϘKg¥hÔùž€¨ÑëHÎÛ¼I�ÉEܬ·Fb‘n*§l” 5�Ú�·ƒú/ÝŸc5îòø¾¨œï±^_ �×VïÆ"¼¡C±^W™“ÿ·Er˜N\dˆ>Œ´!?ïÕ…Û¢=ž0xœ…RÉnÛ0½ë+æѬ]²IŒ 4hР½SäȦà 䨉ÿ¾�%ùõDðÞ¼…$�¼)ëŠ"G" ¦îÚµ‘]Õ˜f+·­¬UiŒé6ÛMÙ–Z—†6µlDÀH#I¹®;¬Êº©°A½Ý´²Ü”uU›º­JYJ³^µ’fî}Lú·sï¼B÷+ÙVͺڶîJY–Bùa°Ìôßaìë¾|…ƒbëÇ/>ž�ó/  Ñø¨œyÉS Õ“:ßj lò™ïÁØWàhO'ŠIˆâZ¼˜·ƒHƒ¿¼½©ÞCò×; }L€Š3:7�Aë€{zW‹Þeÿ"ÝCz±¬z`Oy¼õƒ!¤%¹)YüH‹rÐÈT¤Ü ^gG7`§ˆšàZå3ï/Í pr5\ÐY�óHàBN=Dâ8‰©-O7Мù™Ͻ½¦ço�ŽÀOÄI ½:S,ºl�.fÒ_OJŒŽ  :ã‰Òò¬2sòàÜÇwÜT¦^ vÌLi¶†H—y£gu†_¾KB}q¸î éâiÚÁÑaÖ?BN°Y´ðiõ”™^ù3<Œ>RpÓGî£V-”ÅoŽ<õÉ–xéþtree f66962466784e12476a8cd3a1ec5207281754dba parent b31fe9d1883ffe28138ef342d0dd6fee5dd99e85 author asepharyana 1783609758 +0700 committer asepharyana 1783609758 +0700 chore: add app submodules (elysia, react, rust-auth, scraper) b,Wæš xÊ5ÿtree 2bbcc48aa06f0fd787f4d8fd9861d38b7e4c6889 author asepharyana 1783609706 +0700 committer asepharyana 1783609706 +0700 chore: initial hub repo structure »,At©Ix340031QÐK*ÍÓ-K-*ÎÌÏcfWõÿê*…ÇG;V2ˆš_ [:ßÝÄôRRË’óóJ3óR‹Š–­ÿvùùܯ?\¨¹çwàý£ =†PóRò“³S‹2Óóò‹Rv o,t˜¾¯H÷£ë³SŒE~-/uÁ¦¦d–ä MËLgÈk_À|«óÞßP‡†õQ?ÍÎÌŸøjszfIFiÃÖ­7'ôès®ùzEó³6‹x®Ó$W˜Q@%P C*þ»?Ôýðû S¤ñ¶ÒlÖ§;‘Tåæ§”æ¤34Û­b(8!Àözcè¶§­­.3…k< Öegæä'秤2¨\Éô=ÀðEw§øìökºs¸wêÁŒÊ*€‡ZÕ'ïÚÛ÷xŽü]úÓ!åv«ˆÝ[÷ ¸Â‚Ü¢d†›§:6Lúr9o!—G³‰�dXzæo¸Š2� |f¥–”dÂÃT¬*rã3+¡¸³=//+ÿ“«|ñ[ÿÌ0˜R ‰;Ceg­Oœ®»~—•ÒŸç:Ì¿t” ^,+{ðwQwÛk™£—;¯Hÿý³iµØ:i¨AŽAΞ!®Î!¡A®z¹) ¿§*.ï|ðg~õ� *þ,˨ò×?`JCC<üƒ‚Aªj¦Ñíu|©µ?‹}Ù¤÷+]—©8ì…ªröpôswõñw© m¯Ôæ-|f2Ëö[æHõ‚©ó÷ òt ñô+Õ®™µw¾9ÓÎB÷ºÏ¿<ŸâêÇÃUêãéìêìÊPþ×¾`ÿ-5­+–NÞ'h¶|`´ƒ*ñMÌNMËÌIeHŸöÿåÁÆÝ ²6¿/�·à›¹E&TM�«£‹/ؓǂC§†õ¥I×}¨ÿw«±Mâ $Ä ŠDLר8ùû¸ÉíÞ-í'©å5sÔ `Ò¦šl†=¬[YòY¹ß´y7qìlŸÚÓà1˜-Š~ú²økËE,šòÏ`'“U‹’}ÔˆÔâœÌ¼=HvÐËÍ*f8ô7¦TeÎZ�U]õkNpµ6{)£1+3/­(‘aŸ—ú=—4/áÜ2Áûó—lŸ{&jXAbrvbzª^V10SÿhSݹnò…7žzrßÍž1A$m+T]Qj^~Yb TaËÚ¥…k "÷åmÑ7”Üóc–¿ÓbC#pö/J-.Í)aX¾Ô E¿ñí£E’¹\aÓE—Nx™qRqrQfAI1ÃüÌI“Û›¼ª#3.Í[³makŸ÷XB)N-)-ˆ/(ÊÏM-ÉH--Ö+Î`°¿7©ˆµ!Èuëäsb;æß«™¬è}Õ¡î†bxœ›Éy€c‘™ÖV‹þ.kÍùr«jÕÜèËa³ªL7xøÿ1.3.11 (-ªxœ340031Q(N-)ÉÌK/ÖË*ÎÏcxȪøå§Öô_úi7f‰I+½omb``` Pœ�™“SÌ`*ØÔm÷Ë C.Wø˜åcÍNjԭ&‘²:x�“ÏjÃ0 Æï} ‘ÓÆ’öÞ[Iv(ŒmÐÝÆ©£¶"Žmü§%”ÂbO¸'™’lMéÀôâEŸüÓ'å8H\MRºdïüpìOŽ«²AŽ&Bb©2¡+LÒ¿o’øZz�Vu)S!ËPál(5Ó¦E:aÉxÒ½(ïêBÎuSX½<-‹ª.ЇVìÈ£ðÁ"KJ�‘è (jèk EIOtÀþ¡ïÂ:³�u#Dœü,ˆ�/ŠA-íÈkÛËRpaÝèŠoKlcK0ƒAnè«´œŒ5kãÌB7 yö[íQõ^Ýêúµ0ÖCÞ'CƒÎ•[„ñ6øþüß¼sB¼ŸÃ娢ncœU–øy«á—šïãEí³±p ¿ƒ¢4àyñ¶ú]8´{<ù(r…Fê6;h[o¤>ÜJ}%‹�çËY^€!ƒ’¯F¡E�öÜïF�аu° Ä?ÙÌçÇä4ùÍ� øï�lxœ[ľ•}B"›~°·§�ÏÄD 7çœÔÄ<Ç¢äŒÌ’Ôä’Ò¢T…`O……G SR‹2²óu“R‹Kt Š“K2“SuSóÒ3óRS‹2óÒ'0Ém|pˆ E" x342…äœÔÄ<Ýäü”T†Ïì®5WØî†Ë?´¢îø›“«•¬†f&&HªôrS„VåÎxÉó`ÇôÇêÜòô 'La~nnf м¼²Ô¼’Ìü<�úÇÇTE+^‹f;,¾n\›ÈÝ.+Åpª>%µ '¿R·<¿(;-'¿¤ºýgÑ.ñã�5]»^(Öz[õÂt÷gPÕ© CuSŠ2�4HéÂe<ì±¶üs›¶Ä.E•wé{˜C2J“t‹JsR‹Aê¢v‡JÕ¼:$ÏV¢´Uâ­Îé_/m?g_i€dxœk`ºÎ8AobøJªëxœ»Îx�qÂa‘ù¢GùLöÇ×V˯×ï±¼û⌬ ͽxœÁ� !°‰3ñxQ"¢ñÜ?ßêØ jÄÔieò�OÎ5áT�nTWÎȤzÂJ|7üÆT´‡xœ�UÛnÛF}߯Ø@!º vÓ‚a@VìÖ�q‚>A8ä©�Èb/²Yè¡Ñ/ì—»¤dÙ±ãîÓìåÌõìÌx<kšAÎu­Ü8g½&ík!ÉæF5AžÁ¹.ØäÔ?ƒš¬Å2l·ÏÁkçW0·Ô,Ñ´¨~÷™�ÇB¢ƒ-îŸÿû÷?ß=‡‡pÁ¦F'Dš¦âĵ �NlÎ �gp²çÓ©r”°‚Œeûeÿ `vd¾D5Aí§¶!+Ä& Э |ŽA¼°6bãÝ‚ýÍó+¢Ò‚Ð¥½­ å¼� �ÁVZ¨»8ó%êîeÓ|Ɇ"nïPiGuN£P£B•#pÌ•ÒåC”äÜn=|Ã+_“vhÕ ¶ ˜;6)làŸá5¬X8Ô BáuiûÒ„ˆ#Ê‘Ýeã=Ö.§¾‘èÂͳq©>°�ÅåtñnÙ¬ŠŠoí»#HéÂà}Fãv ƒœë†-�À¤B­F 9_‘>.BDMJå–>›î*1}2�›Þ»Ž_ؘž�ðX%)Gó=J£ë)Ù1eþéf×o2ÿDÑùr¹CQóE iI:Wô#ru=h÷o>;U)×BüÊ0÷ô�¨�Ìn›�BUOìȵ`íxÙ5ÄÐO}‰‡3@)µª $9Tä˜/a× »l7>³>…ºÄJC£7†r×åuqu E…¥…‚ ¼%wã a-b3„ì gÐÒLqMàÖG“דc2¾Ó\‘ÔT܆¬I&êŒnX2k•“¹ J+n{H¨õ¤­« v~uõuqýîÃõÍù׋˫ó±m3{!ת4Á™ó0Gμ…Âp ŽWŠ!3Œ2Gë‚¶ýð·C`î¼A-Ä« $ÉøMeI5é–ŒÃjˆƒ$VXÃöϯKq´�H<ž{R$ÇgmÚ�¾~4¶¨K�ª$MÑÓù¥8èß¼Ž6TÝ„ µ&¨™e’Ìà¥<€Ì‡ë “<€i”ì�ø9€ß¢.QCŽ�rX©¿(I ÇY7cfi�N/âN¼ ÷:ž 6@*ÀÕRÅÆð-”?C£¬øeg,[ »¦B¥!In—mxŽ�Œ.IF½î$Yòm’ˆ_'ð‘ 2 ¬õ�zѵtQ±% ‡¯ŽŽS@‡Ò u·;‘ªŸÉâ?9'mŸ¶Åxœ…Vmo7þ¾¿b`�í˜+»i‹;£ àÚN$$µINQàí,w´Ë—äñE>úp?â~aIAîêÅn’êÓŠ>3óÌð2Æ2…-]AEFê5{Òv¹�ú)«Èq+ŒZ]ÁUPõFçp3ÜÜžC… n5_’®[£�AïÉ*Aù°„kG¦A»F…0 eÆ˲c¸M8ð ~ëÝÁÿûÿ_Œ³ããÎŒ…!)Å¥cø%YíÖनR ¬ŒëÌ×äëV§ÙÌŠº&{q –E‹B°FUƒ×�7P 1npvVœC!ÔÂâ³ï8.eÙegg¼AU“;;KWä‰{pdW‚´1ðu %ÙPb+�P •X,²ïãñ'ž¹P¶º ’˜¥E�tbÉh'¼¶ëy%œAÏÐJ®OÁUצÃëHr+<,ÈóKIÙ›šÒîqZôVüÒ²ÛØÎw|ÞLà¤p ²Ÿ]£­WÀk($zr¾8Í~ˆ�ÁT艵¨Ä‚œïÁ»U-Ök¨Ä®î !é|àëä­+V_êÃju�Öqû²R]äŽ$9ç€ÃËêõ…ÛU+•f:&mc�VÆpù/qKÞåŸÇÓùða:+Nc)¦kÅ!r'E½¥«Èøæí%¼KŽ"orø¤k¡¶ÜE‚nÉÓÒ=Oþ ðÙ�9Œƒ”S®óh=p­< •ê"iéÅ¢#iÚ úO–ªlÓ/ÁÓEÚdÖÿ¶›lÅt:œ�'£Ï׳»ùÇ»ß Øl©ø<žÆSPì2‡ ŒÆƒF;Ÿ6O< é8J‚Ñøtoû8½›lq‚#{¥@‡j�PX­}±7�]O>ÜÍæ·£tà“^¢­•Øpwÿyþ~ôén>ž<Ü>ÞÌF÷Ñ<'µJŒ�ò½\««À£æÀfËŒ$îÅŠúFjIùŒÁ0…óþ»û] f©ëµŒíq® xÏߺþ0}{Ī£"ò  BÁ˜¥V¯ˆikT®8ͼ�uìP^œ„—öGER¬^ǽJVEªFm­oh'“àüiV½†ÅL²÷“‡_A†%µè›'”Q‚ög®º«Êlpž]æÿøg~×Sˆ[Ùo“�·£ И&y¹ž‚‘¨Ùìæaü;$ÍsÜbTˆ<›<Þw1uÖÆ’AK)?. 1ƒ¾�î;ÿ·Óê9rº±[dÆV·o{o)ŽÁÁÉg(/Ür­—ɧ$tßòþí:ÙáDj»L‚ò¢%h…-ʾã"ÿP …vý¥*TT TW¥ÖË'm[æ¤hcÒ¶K~ÑxV“ßÊã«W»¡œG)�­�1¥Yÿ?f¦Û–Tåà_GÆÉz±<x°¤(�“o" m�Ù VhR”4~ …ónp¶MFI–gX×BÕƒ‰g®ÁwEÒpѶÁÇÙqÞ`µ”%òe<Ñ�n’<7ãZ­H Rœ2Ö·3GÞÄût0Kºœ6ŠŒÁ„já¼�W§n¸Í…à~È~³&”ƒŸûiõ®ËèWTåv‚L=³-Ñ5Ù1\n…9©2ñFÃwF³áã/óÙÃÇ»{Ø@WM�ɬX€¿À˜Açž´­˜ó•Pñyò}ÞÝ{ç#1=ÊVlغÑÓ/ ¼EZˆeœd©œ1p Zª¾¾¯Ð»¯ïVhì7°»+°7`¤V, bÒ×`à R“|“ˆëI“Õ¡Û'Ãéß&~èû‹~w½9³:”’\£µ�Ý™.äÍnZBÞÀl;޲1:/–¨Àêà)³Ý^,ñ©;¯vý LoŒU—ùO?äùÅàò*ZÁnÔ]tFæÖÎSË½Ü è�Kh©ßºh‡„Ò7¼!¾„k”1’È@|8tƒ>»¿žM»G1%—SœW`pI;Ûx¹¼¨p ¥pÍ7‡›° &¾YRæ)&ªŠèª"c®UÞ?¬¢'*âh�ÛH–Œ}ß»äÖ�eh‹­¨-`âŽèQnÈZm�RªcRk*±„Іö –±ÒŠT¼þ QƒC‰Í9Ä</r,I†œ@“g],ºÊxœ�VënÛFþϧ8•�”tMÒIº-Ê8.\ÙM¼Û¤†¥Ŧ�tÈ9'"gعÈ¢ýÕXìöIs‘¬Æh¶-!HÔ™3ß¹Îù&ÏóD`OЊ„É™â+ #Ý(>.E{+0 1¤„Fb�ÎqPð¼<›NÀ c—p¦ihQ­Q <·u’çy’D”ó€r¦š–jŒU¿ýòß{›’ƒ˜l–I‡‡/Hk\|ƒÍ²–‚«`ñ3ø'™‰Q„=¤Á¼öÿ¸XÀx#køÙ’¥ÌÃ\ÙºœØ®­0¼÷(Þ}Í5¨` šÔŠ7é`kmkXq„kb\Cmygr.ÖÄ !˜©îp~ûõ?A׻x£a,…ûË¥H’ù|ž´¶.N˜ì‘‹Óâ·rš$c)Œl+¿Ì{\PÑ`Óƒð8—N š:ÒÈ�ñÜkÀ’`|þro£¢¹Š[ï62>�ª‘/9¤ã—g/. iQ,(ó[u£p ï©`RPØ:ñbðâ­é ¿Ö†ú;RfÏÇ ¥¤*ƒ”¡âÛ¬úÐ]nÆ�´Ì'H÷Rõh|ZÞh)’w ÀHÔ¬Hi.Ũ‚ÑÃâxtääf=�|˜ °ª¥U�_�¨—lý†ãÖ|ù µ!9srk9ËWŸGC¼÷@�Ž}‘™?z8}x\»Ï¿ƒCƒ�†„Ùz…ÃÐñ]1KË�⨂wP¼OÞï²peëŽë6vJzmµñýö|:½‚³«Ë,IžY�K0Wôó-i3‡ÅB[±pÿ]÷¦“ó�ÇèQóèí@Š÷$ vYåó«¬6IG&vxêêÂhæ\­*÷ýIê²ÿÇùÿøh ¶‰þÁrVU‚ng«ÏÓ¬0r¦�âb‘f[!÷M«¤�UõƒiªJÈÛ «nšÇ�µSþ³eØ/ÄH*¾à»™Uݨ«º#5LÄÿñÍ+{’$1÷U5î8 ã}O3�Y¸6JG­1CU–�l°k¥6Õã—«‡Åq9„"»_mëò^Ú"Žó3}àë%šÛZÁ[äæë'»Î™Ä)u)V2êë[£n“Æyþ‡¸XÉ%•'8 9g§eO¦•¬<д§wîæÛ´3l‚�üG¸ú~2ý˜!í ·v8ðS�?‡‘›rŽ ¦ë�*¸W­ ÇàÓWïFKZ»Šök÷r£vÖ׸_‡×÷¯?uìòlë×_ð§ô¨n÷9udhØùÅwÓ‹¿µK^èüx°/…¡…ŠUú–wk Ç6�Æ{Éø _¢æ‘@÷™¸J’ ø=¸"eklQÀ&Ùäþ‰?á=ÙÀ\«¦ôûuY[](=‡ ‚¹ã÷æØÒ7|‰PSg{@†löî ÏQ°Ž”†tbkwùª)K’o,šà»ÞJ•.ç±QÚ°go¶—%|¨ìƒ›EÕBéd°5 ^‹nD„˜¥0‘RvµÇÑä§pMÚvæ$ÍN!pDYÂwrqBšØ¿G`æŠïÊlõ–éÎñÆ r,¶ç0óûÍo•zÀ[õ²ÚÅæ[¶ªüRè劢7ŽÕzkâõžÂ^[;»é(Œa7JîOâ'é¶uÇÍáMdO!™ãJ�\zkÒ,LähÛ=˜È¨°¡lÇÄ”´qÕß]�Ç’…‰ëƒ>xÕÜ,R7e²×I/¸WíZM í@ªªŸ$^tð*¦Éé½ö¢]­�héhæ}K³½\Ä!_ð^ÈfywÂ#ã…Üóê®Í3’Õö)n¹iÓ¢(>+2V Ç÷›Ù¾_¦i–íA—¥¿'9g·)ó ûO§u±²x…VÍnÛF¾ó)ÐXª–Jšæ"Ä �®k¹½Z+r-mEr‰Ý¥Ý‚>ƒ�}ºO1EàriÍ#z¨uœò•.-ê¿Ç \¶mô ·Q›ÆÆA–EÒ¶”›'DïÛ—üB ÝÇ}œ—=9Pu)7¢›mfSmfƒ 5|Óªœ#Ëâ=~>H�—ÖÏ‘§Gypá àr؉ÓÚDÇÂ9§Võl|$ŽUªÚßs+wB‚ÒtÆ_’dhè%#1æSJTÛBcNkêØdaæ,13iŸ¥y�\ÁÓê2x‚µ6Í,ƒ,ó_>/0œä—RˆY¡ªÜÝc™¢JúA¦P×\Ç]×ü>ÔAå-;[u!3ѾSñ_‚ÃŒÆz¼�=ÌtônÞ)ô*�Q½j�ãDÔùyœgÄÚXþž?œÐ‚ë[ïk8Þ¾{ýú9}cë,ÒA~ýæ„¡[lÑgBæ97êùw)a¹w'rà Ö‰Zúíù,ì.^>.²íM�UÚW¡Ãb\š¬} 1<ñÕm”[Óø8Íø SæÇ~ åXJU(ma#w»ªÝL3äÖ¥Üû+žfÍ:7%¦Ámž>sZõYOM�–‡Tç+ûú£Z3Ï®ÏKÊ”õ¸YM1p* µÓ[6Þ™•¨a?…ÅÉn!XÈbÝè"uã¶é~†ûK8.å)1/¦�W—¸š´»¢»4eú�Û„Õ†[‹ˆÚ�*—Ë+7¸îmÔ¾Æ ­›¢ Ðrxi{‹³¤ •y½WíýwGYd¼a8/(‡ ­ãB Kiq¼)ýjse“7)­â–‰œ…á=N~Â97h{z}q·$ Åa¼bIb}¼#¤eXà‘z˜Ž“ŸAnkÜ+Æ^‚[µ5_ãä]ŠâÒê’o8g T4htqr�“—D¹l‰ xœ[(Ö!¶áËæ×,fl!Ÿº³xcœþ**/.git **/.gitmodules **/node_modules **/dist **/.output **/target **/.svelte-kit **/.next **/.DS_Store **/build !apps/*/scripts/build/ !apps/*/src/**/build/ **/*.log **/*.pem .env .env.* !.env.example # IDE and temporary files **/.vscode **/.idea **/tmp **/temp **/.cache **/coverage **/.npm **/.bun **/.pnpm-store **/.yarn **/.cargo-ok **/*.swp **/*~ Ìôi2µxõ ÿ# Editor configuration, see http://editorconfig.org root = true [*] charset = utf-8 indent_style = space indent_size = 2 insert_final_newline = true trim_trailing_whitespace = true [*.md] max_line_length = off trim_trailing_whitespace = false •RW7¨xœ340031Qpöwqõ÷s f蛾`Î%Í[®é»X ¯[âø`«‰(x‡ºÆ‡¸úø8†¸2è%WÒØôeÚ£H'ßÇæB,ùBŒ vu ò ‰ÔËMa8h]ß%Tq_­gbü=½÷æÁ·3 ÊRR RóR“òKô*ss—‡²lQÚŸj6¥ƒú‹Ï�öMÛUYPš“_”ZXšZ\_’š[�“X’ 2}ãîm·•_4¿¨óÇ2ç™Î®sxqmy~QvZN~y1ÃÞ¶þ�ßjØåf±2ɸË\³Û£! ½v] »x‹tÿ# Default owners * @MythEclipse # Infrastructure /infra/ @MythEclipse # GitHub config /.github/ @MythEclipse # Docs /docs/ @MythEclipse ­þ. §xW¨ÿ100644 bug_report.md’L\Ëõx…迳øŒ¸UVª°Ú100644 feature_request.md_yz!YÔòjÚÆ/†�”Ç'ÿ7Á$Õ½3x=Âü--- name: Bug Report about: Create a report to help us improve title: '[Bug] ' labels: bug assignees: asepharyana --- ## Description A clear and concise description of what the bug is. ## Steps to Reproduce 1. Go to '...' 2. Click on '...' 3. Scroll down to '...' 4. See error ## Expected Behavior A clear and concise description of what you expected to happen. ## Actual Behavior A clear and concise description of what actually happened, including any error messages, logs, or screenshots. ## Environment - OS: [e.g. Ubuntu 22.04, macOS 14.0] - Browser (if applicable): [e.g. Chrome 120, Firefox 121] - Version / Commit: [e.g. v1.0.0, commit 3a2b1c4] - Runtime: [e.g. Node 20, Docker 24] ## Additional Context Add any other context about the problem here, such as relevant log output, stack traces, or screenshots. _ …´,xÄ;ý--- name: Feature Request about: Suggest an idea for this project title: '[Feature] ' labels: enhancement assignees: asepharyana --- ## Problem Description A clear and concise description of the problem or need this feature would address. Ex. I'm always frustrated when [...] ## Proposed Solution A clear and concise description of what you would like to happen, including any specific functionality, API changes, or user interface considerations. ## Alternatives Considered A clear and concise description of any alternative solutions or features you have considered and why they were not sufficient. ## Additional Context Add any other context, mockups, or examples about the feature request here. yú’²Hx‚}û# Security Policy ## Supported Versions Only the latest stable release of this project receives security updates. Older versions are not supported. | Version | Supported | | -------- | ------------------ | | latest | :white_check_mark: | | < latest | :x: | ## Reporting a Vulnerability If you discover a security vulnerability, please report it via [GitHub Security Advisories](https://github.com/asepharyana/asepharyana-hub/security/advisories). Do **not** report security vulnerabilities via public GitHub issues. Please include the following information in your report: - A description of the vulnerability and the potential impact - Steps to reproduce the issue - The version(s) affected - Any possible mitigations you have identified ## Disclosure Policy - We will acknowledge receipt of your report within **48 hours**. - We will investigate the issue and provide an estimated timeline for a fix. - Once a fix is released, we will publish a security advisory and credit the reporter (if desired). - We ask that you allow us **90 days** from the date of the report to release a fix before any public disclosure. dóŽs¼'x|ƒý# To get started with Dependabot version updates, you'll need to specify which # package ecosystems to update and where the package manifests are located. # Please see the documentation for more information: # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates # https://containers.dev/guide/dependabot version: 2 updates: - package-ecosystem: 'devcontainers' directory: '/' schedule: interval: weekly - package-ecosystem: 'github-actions' directory: '/' schedule: interval: weekly groups: github-actions: patterns: - '*' VÖ¿TxO°ú--- name: Pull Request about: Submit a pull request to improve the project title: '' labels: '' assignees: '' --- ## Description A clear and concise description of the changes being introduced and why they are needed. Include any relevant motivation or context. ## Type of Change Please delete options that are not relevant. - [ ] **feat** -- A new feature - [ ] **fix** -- A bug fix - [ ] **chore** -- Maintenance, dependency updates, build configuration - [ ] **docs** -- Documentation only changes - [ ] **refactor** -- A code change that neither fixes a bug nor adds a feature ## How Has This Been Tested? Please describe the tests that you ran to verify your changes. - [ ] Unit tests pass - [ ] Integration / E2E tests pass - [ ] Manual testing performed (describe below) ## Checklist - [ ] My code follows the project's coding style and conventions - [ ] I have performed a self-review of my own changes - [ ] I have added or updated tests to cover my changes (if applicable) - [ ] All new and existing tests pass locally - [ ] I have updated the documentation (if applicable) - [ ] My changes generate no new warnings, linter errors, or type errors - [ ] Any dependent changes have been merged and published ## Related Issues Fixes # (issue) Closes # (issue) ## Screenshots (if applicable) Add screenshots to help explain your changes. ÛMÇ‚ª xœ340031QHI-ÈɯÔMÉOÎN-Ò«ÌÍa˜ûÉèÞ,i¡š4Î×ÚOi¾½ßaU V¥›T𙓢[PZœÖ 1ïZ]ïgM‰Œ›6ï&4HA5ädæ•€Õl�Ì]õüåõ©·Xr�=›0ýÉûwǦBÕ§&—e–T‚Õ0ò�ˆUmr·uùê(`¶bË%‰+Pu¥)‰%©ºÅ¥I¹ù)¥9©`õ‰êEvsÿer(æ\–µ|ÉÍ�ëW+ÈW-¾ŽxœåZOoÇ¿ëS¼¬èP2´¤ÿÀJ‡†Š’ËAJnƒ4!–»CrªåîvfWc«ðÁí©m $—-ÒKÛc½4_'_ ù}ov–û—” § >˜3ïͼù½ÿ3ëYsÖ‚=¸þö|ûœ }xÝnlø^kàÒç׿‰HýNGd >­q×Ës ÉY²DonM™¬¦èÃEÀdÌ `‚íÏ—…ÌQ#cayö,;?·¸‡?\®µž‰¬p–¯so"¬æýûõt¨1åá,7—R7uZÓQ¢6sw=µ"3ÇtN“„J8–À8\¢6J»± }Á.˜Â@òz™ M}tx2<]76ìÖ͟£½^–J†,ÈØ¦§<­3cö9"‰j|ÉC_,4@$ YËI‹M[S¾¸xº¤¸DXZË_†xš¨C†‡™ �ç¾¹,µ�¼Ú㵫'lÌ»È._@°µ7oVÂ{}�áL@ͳ,¡.ÑÀeZ{‰6»Ì‘QDޝ{üz´ß;ê¢Ä'{g�ÓÞÉqž¹‚ ¿ÂÁag :Þ}Õ�yµ‘¢Â|QA|zò²[Øå wzxöq<“å Ð o³úc!˜,ò!à›XÜÝÈL2{惡5¨\$'OƧ®¯�U|‚Mr\ø{¹œY9rü­È3ô|Ÿ‚ùµ7EÃ1¯ øŒü:!XÚG匲†Ê™ŒîÕü3gÌË‘ˆýý_¯mœ"o¢°Ïa¹î‚¢ä„O#Áœô]fI¦€/H¿³´æ�¥­î¨Œ——¨aäå¸âaÎ''<‹ÖüÜáÌ~ÓlH9+á^+HaÀsMÚäÎHH+ÃaÏÐÙáéƒ+)pÐCCŠ ;È`a,•T+Œÿ«æšq BUŽ/YÙ¡j¡†”ÛÀàÛÀ¼îdeµƒ²¬KÂJ©[EqˆÜ(‡�¾ýúOpäO§¤<îQ&8àáa4Vàb}…а)Â+�FζÁ½põ{²Ž"¤±Î€·wB7®¬ÀõQ˜ÎlÑà¨þêµ\°­ƒi–”X8¦ î?VŸì*ðEXðÛv±g0¶pMSðÑGõîÉ~=ç×åМ�µ­¤ëå¤%ÿézc…TŒ<à±� ŠäiYR PBÁ=0;+̘ÙÄ)xŽíEÓÈ�žø�Bf�c–r¾�Ѝ‰Fñ† ¬¶…ïñ/È4Ò:¥`:à&™Êæêpœ,ÝóxÈ-7^©×- Š€#GŰ`sŸã8à N¦3 C,´šM�šÐóšÊ<éÂò¬ìÿMšŸ–Ÿ\ÜCÕUÉòÔl  ª*«­à EÄr<ïawƒz²g–7E O8Öa0f"Š�"9žÝ££QçäUÿdØU±aØ6ra¤ ‹Mø9õ�Ÿ‰5Z5a +ˆœÂ s’[h'vX5ÉÐÄè¬zŸ¼®N»ÝýÞËÑÞ'諽Žr(-»–¹é,°á¶±2´¤XµèéÓËaww¯hØ•ÆõqwÿdÐ º¯Ûµ­òÛ•¤\ØDÜØïžvGDZ ÜÝ?íÖ¬[ W¾`ÔRq hãïå*«œcY¯¼ÿî¿ÿùŽ}tÚK•69–+Ž2$*OΤJ²„™¸,TΕë¢ä@¨˜8i«jE F]A‘©s¸{|ÐÝÓgvød‚@Q)‰}!Lù控ݢxY¾z�ÍOÆ!Ze‘u‚ÔBEŒ³®&öXØ×jG“«N³Ä ¶UضÑÔ?ÏÛ{ãþ/ÉÒkõÕǺ ^ˆ+"J­µ‚Ï0>—¨©»ÇP+Åäe»¡¿ûH>ãþvIœZ~É xö¬b&-»4ìø^Ù6 [Ô¶òu@~š ½²ÄT®F0î¼ ÖU®’Óÿ¥-­©Ò1ìW — ®ÊÊ.©WÖûÄá\÷ ÇË×ùñßÒpOã˜:&êäF ÖQvµŸ×*"qs�_¦ð6¹+þë�TáæEG_n\A9è�ì¦ç7è,?Z�ë%½«*UȈ£qbt[ñõ§²�½üèNv*ÔqÃä ¢À¡ šjÏ J`i³‹µ~öŠ7o/ˆ¹î€IYºá1J;v“ºbObÌu¶¾w«(É�W{m#¿NáFÂÍË£o¶“=ä^抽J:K/f ‡åRÝÉ`{Z®K6æÑÞI¥O7%ß,Ý®”�u“:Yl_£L½€)Šõ”¥Ôòˆ9˜˜°çž{ìcÁËj¿ÜøÜ!s%¨!ñ°\)¤uB~µÊ2!Þs>%ôÕž›ß±–ýIÜÈ|³VgýÑþÑ.-i:Œ1Õ4c§0}�]–'㢔¹-øEâ8’®¬ Ÿ;pÎ]—JÙ8ŽH&.¸]H|+mç‡o¿y}Œ¯¾˜/ËáÔùÀŸÐrÑŠ¾ò¶š(Õ`•ʸ3Ê7@Z³¬*{ö¯þý(F•«w7u�m�…«ÁÐw!{'�—XÃwŽz£î/úÝAïU÷øt÷¨ÍNŽS®Öª3Bög¥óüó;è Ù âWpÑ*Ë`Ä©�®Žè¾ÅuýËÞæ2¨ãû®ã_ªVÅ Ž…N®~ÓUZ×–�ù[.Œ£ÎY�mí· ëi ¾ü7üÜâarõ®�©¸té ›Z§�n…Ì€¢‘z«ÆÌÌ’�b'ÄÆ‹ô—zrªØ°{…>O×–¨L :.·yè.0nO�Ë)ðë7ò|¯EõJÉræÊ4ô3;ÕØ¸b!¡ß5Aÿ)8nËò§k1×[°.Ï¡þFuÐP{tM5ýåŒ" =σ‰Åѯ¸)(T,FM—ëÊ*ëLø+ü›+€Š�sלùŒÞªüý»?Ã]Kùòêt�\Ðÿ{±q4mAG}-¦Õtâ•…VLÏL+7q‡Ô‡Ù¼–T*Å*ûû¯ßá¿es-˜ë£âѪ¼ð&ßÓ·LUI\« Ó›3„z¢XÛÈãÞï¾Öb¤š¸"Ám.º¤S¨NÁ¶£°(½òmã ƒØ6“†"W™z{§´&ÅpÉ0d {‡g}°è2JFôSÑj´j¨&FÈ%ŸR žäÊàQÆ(ÓwvÅì%IÌLL‹äæ›*}éÍQðpM‹Ü=Ù§�œâ¿ä[’Õo‚b±�æ‚>NºZÀ–Ã\k�Ba©¾½äÑߘlf6¸ëW&YÞ›¿3)R¯ÿÒ$¥ÖŸddÙ‹OöÙ¹Û>ÚgyV=Ûgi ÷7¿ÔoVˆ•-ž>ˆÛƒLO ‘ô�*‰GJ—ÊurR©âéƒÊÝ”‡Ò%rfQ^*~¾M”pý"ý8ä:}#U&fT-;o‡šU]Õþ?’Køí+—Mxœe�OkAÆI 5­$¥©Í’òf“�™¬ð`´‡µƒ`SzðO˰û&YØÝYf&ic+ý|ïæˆÂ~¯„z-xU0©¡˜fN3ó>Ïû{x~<ûÒü´™¤fò(Þ™¦��kU>xa[rËA$Z.�dl-|OÅ»Ëlj{¶¿Ïj¤qüž‹`7›0QBÛóQA[Hp1ÂÐÅЀD%üžöD˜¦›FžþäèŠQ£ÛÅ ýÝŸ%úºzuÞ!¦Ó$²÷y ZrGƒBÙ÷„�ãÍR ¹ì žb®©õ3ªBíõzQ¦Î¶½õ¨±½×jlí<ÞlP´Ò9V}Gm”×:#` ¨î¾T‡·Þ¼àìµÍžß`w÷Ø«ëõ*˜å¶ GðOÖ‡*�"¦º\¢ËBÔÕÑH¡ UeÕ-«3~Œªõ üÙ +­ ³<ýÕ‚ò8Ù‹Kt²z™|céáÅ(0:]3Vóœ P-½ö»žFq‡N*¹;§Ã·¡õ_C.×8©í¬dU‡™¥T4�N+óô!ÿ s1Š¿7Þ%23.²‹Ëô¹p)~ZÈ&©�KÅ|›£Ãl&u.Iä®ÑïRm‘¹³ö1s2cLb úÈ„ŒºIÏÞ€]\x‘�‰ÂÉÄÆâì9ßîž=WØÃ3ÒBǵölt‘DStè[·$D'3$ØÞØ Þîu?�ô/{?·Ðdj… LJ±“ÓΧîð¬sÚ^ôºG'ÿh!‘`ŠÃ9öpSù» `66~õGLÄ[ô¿ÿþç•üÇà\L+Úk¡C+F÷SÇš¢ˆ„wŽE"4ÅwYSìMˆýúàs`BÇÃÄ‹L¸(%^œ˜.hUs¥sfÄObsæxILÕoo—�ÃX�Äé™á8t¸rE1 ¢FD`mÚäªE‘bÐ#Ž:sì¸1 å¬ëºBV vÕã0!uôô$&H•_iŠÐqrê:ôÀl°×…ëSÏ`w9xÊŒjU�Õ3ÖǷΊÍ{2Z1%Zaå„L¢ØÄI<]P­ °jº™€Ìà'UuX<µoMpÖ-Èüáî/‚ì-h¥OÀ@åÔDfïÆD™6 èêßo¤R<æ´„õ–"µé|ÇŽl£²¡q«b…ÔïÔS:a…åïc÷è¼×Õ<›Þ‘±’ì°è¯stÙíi´Ñ«$`4ZèIÝ#“$> œ€Œ±ã*ïœ1ºFæ¿�Q{(Ìg èQ]_Ã(4Pûßè—Ýojh0ØGñ”x „Ž;gŸº‡Ã£“Ÿºývm p!72asH´­P}û]?dšžoÆxÁߨ�´ß#?t&ާ€PT‘–ʶ�ñ˜r„ÍëéÎF�ퟡÂ;Ê“8ï­mô¨ BNjǨþ§èÆ«M0`7Ndvÿ ïö ´¹‰ˆ5õ` œ=äðYÌ( ÅBÂj¤òÕÙb¡Žx»Õ|ªm?ݬëÜÐ`§öÄãþV2¹ið8ŒSm»¾m ï¿ìŸN.�¯>ϯ./®.�¾Ì8–Àã/¿ çñ2p©],ÁÆÞ}4Æâ…ȤA,C&ßqtºHx§I\<#Ö¯jÎì]ࢧ’`‚ï¹ëc[3€òå &°„e¥Eìw{ŸOÊL¢å:”«ÀÒVY7‘ýãÎ 3×¶šåfSBev³Ä8òóoµHúa«µ`c ܽ‰t5†Îç,Û^¥ÙRÁò¿&š)^ ‰E£o£&öÅ@ŽŽ@1pO™1yJ¯îSz¶Ñþ¾6õݶöX‚„þ´I$ÂVn›ÞpÏ»ÄÝÚõ®ùWlŽ;æÑàñÛÝçÌÇå7ëĻîcÓ Au:¿Þ@݇‚¸Ìßî¢)y Þ#„…�02ö¼ýÜþˆ�é··”­P‚Ù,fÌ‚3Í]ù!Šî,Ä\£T¿þõƒgiûÚn0­P΢ 0·\7¤vÔ�ä¹M=×2ãVâÓs\˜Ë[ζ({°}�äÍR®#ÏS4û“e3Õ79Ûpu±mÅE+øz9ã›ö–ñxc8ö�Ѻ·~cìÜ1'$æ#ïÙ­Jðç7Ƴ[<î¨ñ *ƒ¾2ø�KåWöG‹J †þF €›ûúa.[ô-]r&%[1“ Ok®÷wIö–®6’-– ɵò‡u—ú{¤�Ë—*…(KU†ô�ÌÈ[ïûçgÃN¯×ù¹m\×¶NŽúí�ýÔä¥ÖøXãíA1䶪]ËØ0Û¨›F*ï;±™UC2æñ‘GˆM‹�¢N4Øà±vÐõ‚ÒR.çvùï˜æpÔ%I¬à¿ÆÔ¸nIì¢ÙÁmÔë^œ·�iö4›”åÏš ê¦ÒjÒÐÜÈ8ªÑy!{Ρœ{vÉ_Èœ1¨à�Þ˜—ò– JùC?=6»ò¢$ü0Î*54FãçX7ò“׎¹8ªì4$¦ú.™#XØ ØÑ€�Æd5ºzUàåéÅáIò¾ÙmLf2mu-´^áxð?£Æ ›Aè�hÄÔ´É]ÓK\7GmhC2ócBÍ\V4Éà˜qLP�èq¯Ñø°û\1V‘…^žÙË$±H:ƒ‹Þ¿¹· ¼ì§†BÛ¹ˆ À#x¡îoþìÂ2ÃqŠ®ôhw«cK‰¢#¶¢&ö¤ùa·Å‘x~¬@™“xŸczî{»‘./r ¤}ä?¼.€[PªT‡Ë7FÓµ{åðá1¸\ôaWG&ü•µ7ÊÚ4ï ÝAÞD[§ÌUn¿â5°‚K©[Þ)ñ߃µýîéwC šÌ¥#¥NËã(Ö+Ú¢Õ“¥Gžå&6ású³#ßÛb@f®´-'�'¤ÏÄî=žG�"mnŠ�EH¢Ä�Y°%–E¢¨ž‘ qÅÍ(��ÞJô·N»^ )××zs®<ìɵGé/×"僶n©¶Ð}èÄä·êEä“ܹg)�”ë[ØuçUÁT÷s÷ì’5l‹Q�µèéð¤ѹ<8¾$Œ‚àëêãéùáÕOÝ!p9æ D‘æ¿/î@Po“-™wÎÁË0ŸhÂÑ[I9w,*Ó¨æN$"Ù†°JGIìK[››´RÆŠ'Ú–T•Ì,{¡lµ‹‘ºD•q‘XêÊÂ,é�Š& ®L®u?Ü}[©k!™8`8æü @s²ç¯+0¹ò)ìÁëhtŽ"È·lÑ&$VHà†‰´åòüoÝ3J_R´Iù½³óY�F[hHð öƒ²º?ÁhFb j‚µJ\Pú|À£m(zëØ4_ÔŒóÞe»ö(–Eµb·õ�º Üe;ÔE�ÜÒçfí±ðù”bŸË²¼Ö#ãèõáç±’9 WNDv¸>g¥Ã?T¨/ä°%,f]$‘Ü^Z]˜=ü¦‰‚bºü[â-ŽÂ2bZ6æ_Ïæ¬·PxfꨮgÄP4fª:Bºì|j,ÈHéÕK|6ÓÖòú³‰åâBÿNÚ~+Žû×Z(0hËGúÁƒQJ¯xu ~»’:sÑ@Ì�p5mêo)mZ¾dôå £¹ƒº*ö\X’ÖM+Rë R;QEZm9J#§„R]L®¢®æ-º“ɲß;¼ yVäŒÒÂU¤Ð+”¦ÉZ–r4h¥‹  d5bc…¹,·5>9ñq2BÆAÃH!AlÏäowÈAI¯~:w>w‡½«³vþº©]®Ò*C¾›ë@ñtÓ¨96Ö:©²?•Açîçë–Kqh}Ñ%0Ôîæ×E¡¶+—€PšŽ_ƒÒG\†!ký-ÅP¢¬î™”/’#.iqæªà7^œ÷»ìãĶ¡ÿk¥K »0xÎWÐù—D´d­r©’$æPh�\›Þ ÕÀ#äeÐ’��LîÃKJËM9VH3ÙKÈúï¾h:…ö41òK-€¥†ˆ6W–ÑIçVøJ5ÿ�ý½E'cäÄupÀ¥ŸÛQ+O�E±œ±cÉÆÖŽ¬’�¥UJg�ïxêÇÈ««é¢BYaju§–3c7«JW Ê’W{9k–è·¹‘u[”w_¥Š,UYô¨RÁÕð ÊœínM e*­±+a³¨¨i¤¬ªf²æ[J”¯-®";ÇA)8®2›«ú"” ½Ðo+ T~ëEB_…€e–ŽG¬YfÎ�‡‚-û=Ó²¹,ÂE×4@–30ô;YÖ"-vHÓi@›�´D=¢Y¤8lӛà ¢©:^e@‹-Ë’Mäš)3TΚ˜¬9Dì}°(�‚ƒ çO�âˆM�ü0.ý¬-YaùÞý³6š?àBÛóˆ!¦×Š­IžšÕëJ­ou}î4X�ÊÆècF¢9-¹g§òÏŒÇ# <<Ì¿`¼ ;xl39…}ï£<=¿^ÇKâ�5xœ[Á:™uC&£pIfnj~i‰nnf^iIj±•‚¡ÁæF1FF.Ñm ¡é .xœ›Ìú„E9/17ÕJÁ'3¯„‹+?ÏŠKA¡<¿(;-'¿<>%³¸ ±$9c"_WRf~nª^Vq~ÞÄyRž:WV~R1HXp²ãO03«XL¥@@W¡¨4Ï ¢J!9SAOAW7/_7µ¨(¿¨X7?O·4/d[j Äì3Ææ €xœ{ÂòšyBÜÄ™|2 º êZzYÅùyê\ .\`âbcBJ&K3®‹È/KÍÓ-ÎÐ/N-)-ÐM*Ís(3‚++*ͳRH*ÍSÈÌ+.IÌÉQÐÕM+ʯJÍÓÍÉOÎNËÌIÅTZTš§�œÉìl/_³xœ…�±nÃ0 D÷|�Š N ƒ§.;u,ŠB– G©L9éÀýúR–‘¡K¡E$ßñxdGlá�$ÏËn©ÝLÂW«`æRtÉ’;cnác´ž>µ™µî%` ¸¤bØà�úž÷ð¯3¦Þ"õV—_b— íb�×PuI(›"”NˆÅËjºŽØ�…ÍèI¸XkÂ4úœ}¤\wè-[ƒ3+zÓ ×afœîœÉe“u\ä�Fpßêñ2Ÿþƒç³tM=ÕT¾ñä=n(ÀM¡ö^KƒØ¡è/v¶Ù%?±áeÂú}Ò¸[¸œ,Ù°ü`1ûO‚Jk€~xœ[ÌÜü!’qr£1êwæ xœEޱ Â0„‰Š`žâtèP©uuÑÝ!&¿m´&áOŠtòÜò>¢µÞvpßÝ=‡¯Ñ{²5‡Nw+Ñ;€3FUå}¬,y:²iš³1+ÒŠe�.˜ƒ•7°iL­áЄžÜU„³#Ø:�ûH+ë6˜Ð·Sc(I¥ƒÓ—üŸpt5¶Ìµ!TÑQ+@zA‘ôHü7›�ÍÿR$6¡á<‡|xœ}SKkÔPF¤ÚF´uªµ�E�i˜AÇÉtZ¨QZµÚ"Õ¡µÜ”Lrf’’Ü“›©eZ ‚®µgåcÑ  Á•ÿ øfáNÁ�+of†ÒŽØ¬nÎwÏ÷8'yþð[Je¦�,¶)â’ÏíØC(r— ÎŒW;óJ€¡ïF‘ËYd(—(‘«¡+PQVx©Ä "š<|y«»›~÷ Ëbòä ©´dznC+0×�?’LËú”èuˆd}Üh†þ¡:ú®/Tu’bF�éfíkæ ÓàÖÅy �6xÃõ697{yÈßj¬uɃãÚV`£¬t»È%@ŸjÛ�}GûÏ:!6 ¾žAëʳ_¼é¢f€xœ;Ê\4ñv V8x÷ÿ22.11.0 ·]³x#Üÿengine-strict=true save-exact=true ô� <°»x¥ZínÛJ’ý¯§hÄÀ]É×¢ìØù¸Æl²¤ØºãØZÑ™ì@¸ˆ(²%1¡H›´£»^`0?æù9O—'ÙSÕ¤lçÎά`XÙ]]]]}êT5÷D¿×q)ò*d«µ·'.ª…˜Ê/“ìÎ)¼'ãÞ`(ò8—IœJš£5ŒT¸SzÚæÞæ“²–ÙÓ,+ÅÈ¿ÄózMl¿ÎŽYxŸv`ócúaƒm‚’–¤GmÖ²ÓõòB¢�,а)†VfbžÐn5Âôú2öLÞÈp�fI¶"ˆ„F„�{Â7˜ÖjÝÛkˆ¾—Aºª toZ¥e¼‘¸õ¶6’ †ëaP *./·â2^AA;ûrºöƒ§öÒ~7o5®—Ü’åìï´ÜßÇó�m‡¸��¤â·?uVØùµóƒ›ÜëÉî M™a!´:IܰT}W÷bRà0ëù³ck“.$»ëÝ‹ï?Ùm÷¿Ø”Sƒ@c 0O)·ÇÞËæŒðäÒ¥,6qÊw`!ã@lâ(Jä]PHÑúÉnoâò>DÀ¥TåºÃc2D,l¡BXÂl ÿh/,.×Þ«,Ññ6H#‘!ŒI`¿¾ÓÔòÑ5Ù¶1¦\Åè·Å˜ $m—8ëÔýœ6dè�Í?ó¡1¯dI»‚Õ~`Á NT$ÅÑÙ7ͳýýS1¸‹ X1íTXC1×Í’,%’âm7Éœ‘¸¡Ü ìänB€�'Õ*NcˆÖ�Æ1b�¸ž%-Z&–a™w 0¥ÅjŽg%¹}¬@nÒ>ãIk,Râ‘_Ì­þ2 ‰üw�K9I°�‰Öô-x¢› ¼Ì‚H‰9¥ Þ6 Y·�z=«]ç@Ìk|4ÍpO©Dwiµ(XÖMD¸@•¿c…º¥Öáåš+†�®Á\m+ß¿7Œâdû@\ø7þ�ø/ß§9P²Ä;màO`¯9­a��¢;žÿçXx}‹<–Ü�ó,U@!²Ÿxþâ¥XláâÔ½†}-àèðP·+Ñ/Å¢*T‰îÀ‚ˆæ‹j¹”…múîÌ>ìÙ1Ä"‹¶z›rû«ÙU2E>¼êæA¹6ª.èÁ“éí†%Gß½»¼D@¯¹�eè™9n²´ËÖcÏU þÀÖzL;y\‚EaáÛ…6üÐ3hµúØSv­9"Jl=8ÁjíB)Ì—gE)NNŽEî —`³€ò¦ìÂ7isúO¯˜§7ün²Òj�€UvH±ÆV�K¬È]º“Έ d·°;ÉL³7÷ÄŽ¾Ÿ ŒäÂ]…LXRÊWÂd_°ÉÒ ±!ÙD¤` ö…€Š,°$œþ’¹6Uj“â'!&Ð#ã�˜ŠÏÒ­âJ;í.~hjø˜jL’8P@²‹šwh%wûÙ}ëpçæ©¼*ÔÊ2cÓiѨ¿@܈DT49 Ùx '  µë–ÎàØ3ˆïu—„¢ðèg­?ÿÒù>M)‡èF–uƒv;"Póg~ÄQk…Rè¬E‘qYÿ~Fý°¢�íå½<ñ½ÃÞÑaç7£¦ãwÓ«‘?{o ¤)ºÝÑó#ïèõ¡÷úyçÙ/®åõ´u>±˜=ÃIWò67í_ýäy/�šÍûÓÁÅìYâ…ů¾hɯO¼ãŸ¼×Ƕ!¬Ö��"ÆòªÖtr>kO2U® éÿçe§Vl:Žý/½¾ù„ÔZcÇí¢o¦ýÑÛñïgÖ N±ñjùþ`ÚŸŒ¦3“F º‹Ó“ߎŒf¤€„¿¦�™\¹EЖ¦ÒArºw¼:‘F§{ËåR›€[9+Û†¯‚§’}M›W¯Ž›m¨LÕrÓ$”¨½!3%¿¥ü›ðH�è/ÔV•%»;ËuPR¹†žq€eÆûΖZ/�½%Rû{ 𣊸Øñ6ì�[45LöP÷S‹Síß7kð üiî!D‹�À=£”ùî9]¹ºÞ�s¼$ö2w«<'ÌhÈ9¦x‹ä\cãTǾ#ÚHd"”ù¯:;»IQ«4”Ã8ÀFÚðúäArç¸Ñ{ Mœé¬@Ò�Í ‰±ó5^ùÔj�dU´L6pçQ+ëuhi/¡×—í£†¨"’8|¹b¢[æG�‡gÔ¶Þ0¢mvèZ '�Gý4„¢«ÁÒ§{q7²B÷ÍÌéc¹º¨·Ùz@$B:9k{°‚Ä óŒ‚Ú¦!R¥4þU—Ä©Ö;Iæ­OX(hš@K&ë…%:· >Q¼\Î[/<ëz—°$-ÛœqéLån�2Ú!KQ¬KX Ží^zâ:‰`xk SÈ ’^=¢{ô‘R›yë•'æOíÁ¹XP2¡ˆý“¹È\_Õz k˜<Åe‚X�-;G#>îÃHo‘Š«)Ú|™0'qL;E¤aÎj ›È)¥”×vѾ«¸d/Á¿ D–>é|(jñcÒ ‘_‡ >4»ŽÖØœöøjˆX+�o³˜["‹+ªœ aØ-ØŠ`_vÏ‚å)þAtÍLƒÜ¯†²áx:ë8qé5¸ Ÿéj4&�]ýaFe‚úÎàúÝäÚÍÄÊÙêFW£›6I#?6èJ21.Áð½u]#-Óa Få\¤Û…&]JAw1"žêF¶½GöÑ?Gž×æ*¶¹F õÝ98ЀW7³�sñz®ô€Ã &í°›/ê@° õœ½_M$þÇ"j]ËŽ&—×´1÷ƒ9a«Ÿs_ž¯xDhîą̂rÀ�5�p‘JÛ„¦Î¯Ëü3SåozÆ/6¾=²§—à©«­)±4q1Aщ+ž¶Ö0Ž™÷ ÈÕ)íÁasAÀÌCæ$3br™�J0 ½ÈÀ𸲿?â’# �ýŠ)&!Ñ’I–S¬ï¡“-Ù,ý„AŠÛŠv…3ÞiІè,!è*ÐÄ’-¢Ðþþ„Š‹ò í\pN£ŒpÚÒ$Ðfb0 Å%ݾžÂJ­®„b$�PÈFx]5õ-àÌk¹� xázn¿[S¤h˜ À!Ùè3€T¹ðº«Žÿ Ž�µÍ@ôÁ8¤à3p…Ø`ŒL·8—ñR†[œ&sÄj£’ˆx`ÑQM½,-Àú©ž©!€ :Gú7µ7žôd!íIлÖ×4……ž–aLaY³Z;1Ç2c@þÊ‘‹Ë\ÂÛÈÇ×”íÃgÈð†D=6Âð #=¿EA9=Œ…Z.|Ýr}íHäøfIï&ùA`&)#‘>ª@wêÈb˜\#ZòÁô{¢ÒTŸs¶QD¼àòÞDÐLË…6ðÄÚ_aà„Ù^+„s4–®E¸�ã¤ð3Ž8á;„²ÔÔózžÇw¨ò¸#o Ñ݈g!¨£l‡èœš9=¥Â³zÌÚâàn�ó¬1WT}ssЬ¨jŸå̬=²¥ÙuJS9ÁÔd¢Ór °yé�‡Ý¤ º,‡�‰²¥ Ýr5ÜÊðg*Äh5ßœ÷`�¨Œ×\W|±²|ÂÖðTá—CPyœ5")¦³Æ¶9“¤cÂN‹°ÛÔg”†ÛˆÂÃX2ááÆœoU^Ú<ñ¨˜Ow=7έÍ@PvLÊ}ÜHð&*\HÁ‹ºbÍmžª;×–&(ˆ ^¦â-}�³çwx§8­6¸F¹u$üö{¤¾êv×tÌm}™ëtèoªïY`b©tÈ5<Ѐþd X @!Úñ�I 4õ+Mí^QAGãÞ¾É 3¼Ã@µ3ûúÐ[×ÇY; Ú±ƒ*³ÍI4;z� ÷¢Oé%Þš(c@ »CUN ¡,½@€@Ÿ":’Îvjc‡‡`'o.2¥Ü¡9F#¯üAd BýJ#^2!ÉüŽ‚Ï¯­I[]�Åcs(F­ô»€>‰(Ò‹^кnJÔÇòvM‚¯�*�l îTüì__Q¨Ç+t“Š =ã«·×"!RÃìïÿÕyˆS°E�g%Eö&�6/͉|ξX« È(¨è3Ö¨Óú_ãVp¶xF¹ÿ# Authors - Asep Haryana Saputra (@asepharyana) - Project maintainer 0̽€x]Uínã6üï§X Ô–’~üÉ¿ÀA�ëµ×ë9W M­,ž%’GRö¹Ðè#öI:KY¶sàØ$µœ��ÝЪUvË�ÛÎf�]GÖ%µé˜t^Ž”¥ÖDòÁ}f�è`phÃT;=ôl×dìx¤1³ÙsËԸЫDxn£"Ž8K/o™=©Ë}ŸæmJ>>”å;j¼8 íú’my_Üwåíb¦lýƒª[œ±½¬¹W6MrˆÆYc·—‘û=‡Â…m=ërÿ}q‡¿6õÝ-�ÞÜÐËG¸cùInNøêÙlI8¦0è4´�ÐV`ï¢I.Ñ4˜QÔ™m›,ŸÔ›|¥–bnÕ9ˤ¼§8lzWÇ•צ÷�i êçXv� Û¾S ´!;µåâst¶¢¨ƒñ)’Pá9,#‡½Ñ˜’ëÑ~�k¾eÆmÔõ‚jö�;Ê èà®éÜ!.r™i€*�µq†hPÀL}и±@9xzг£õúWÜk³}@»½Ûc»ã­ÒGªÀ£ocbÝVåé‡îÜPW¤9$o08«âÿkÚ»:¢Þ 6aµ1_±X)o c#kP_ Ž÷aUÁv_ðWú¸¢&¸žîüiº¯B¤ùÏ&°ÈnAO&jê­„ßæ¸ ÷.$ðËaA¹áyØà']Ü õ?ÜA¸zÁJ%¹÷wŸLoþ–«1î‹'§wDìÕ…€w®–YefW-`™¡á8J0™^Æùzö«7åêé2˜K9<ü'4�h/Ì-òÌGãi\J›x2Ö«Y�ôr)5ÂÔ¿×LÛ¸> írƒÌæ"ÏÁ×*ñ:Êw<Ö5¸x÷ø¼¦ïèNëXõÔsŒh�6Á�›oTHó*˲„Zá.­J±8ö].i,ù¤| 3W¯Tü žÐœE|¾@¬Y«@^¥ÄÁ.È›&,ôšŸ.dƒxXÚ’«Þ ¯¶»5åû¦"Ù̧ùÒä­oQOó?ÿ˜©©¯=±qx Ø*‰Œÿþùw¤J¾ä åËä#ùŽd¸¢µ‚'c©êzYƒ�ÉäEûlô+±JØ–¤Èå Yˇ 1*åû0šrL°ÑŸ_]Òø©½8ªSdIÉ`à>älsV8~Lpƒ’lJ�£DH=]'´Cb½³àÝ;rA·’Ÿc¾Œ�1ú£unwN¼lᜭ=òäuͪ°û>èŠæõ€À”È5ˆ é/‘íùÕí‚*ÄŠÛcû˜ó! K蛑—²Ô^C}•€T�‡OÇe¯¼ÐŽºn#„©�éL:žÖ`ÍÚ5ÍR^V’Ï�ü2(9²ÜDQ`ubj™E9._7x5˜qúq@Æxw@keüÑl­¼l³L&üg?I —ý1~épxnñFÒÉì'£ŸF}›g6–çPÆ/Ð^´¶)æ„GjÄìÿèwàλ¼x�XmsÛÆþŽ_±3šI)V-»M¦×3z³¥DvYQJ?d<Á8’g8w ÌŽ>äGäö—ôÙ=€„9µË[Àaïno_žg÷öèÔV¾1óÖ›jIÞÒ±ÓõJ5U)ºhçQ´·G7j^h² Ö•wQÓOÓF7ú—Ö8ãµ{?Ú«‡ïû,qe3UÐLû¶Æ÷‚ßbÇoòõL¯uaë Ò¿ls·(ì=ÄòÝp|ß ‹ü´±tæiæ›6óm£eO‹]?&’§6çÓ̼ªrÕä¬\&C�ë†:¹²4žÞjçÔRÓk۔ʋ0�Çe�2th‹‚®qjíi« z˜¼€,�j•ÝñÉKx{©› uf³;Ý@¦Â¤ð ×—µuÃ#؃bDçdªE£Æçhx��´G‡ �¶ÒäWÆÃ2ÆÛfEišÎ•[EK8!‰•÷µ;šL0²jçIfˉÚäð9æï‹²œ"<Ìë†�Ÿ'tYoTaþ­iÖÎK›·…FüÞ¬Œ#ÈR}¨uÚì ãö"ħTð¶ªëÂdÊÌԹÊ=Ö};‹Ú:W^Sl‹?�ÎZx`­ƒN²k¶ÒÙ�#ÛzY;Ù‘òb¢ÚTl‹ÃstŽ*ë)-•�º� ‡3à"XÕ48Gi‘‡·@»š*ÄËð÷Ó³ÈpìéçL�?ùÑï‡>‘è_‰§§°š›¸¬QµnRlÃCŸwd<” ®{Á®CºÂgºÖU®«Ìà|X¯O¤(ê%ò¡;îfSëYÖ˜ÚOôOù�Ãf #}ó Í!iº=ñ ‰$™$É.œþ’0¦4€ ý—�¢?ŠÂÇ.5úX¡ÑµÎ�Û'NËÇÉ4£\’Ž}ÎYFñ"¤Ö¤˜„E“MY Æ(ÎwJýÙe«…Yé¼Z›ÆVŒ©Qtjë�”þ¨Ê®w_ia0À®ò-ÀL9ª´Îu>P*«)Áœ¤ŸÏ/aãô†Öª1L Ži#ëU�àû±ûÔÅ×\ÜD_þû} ~yöáþ† <;¾9>9ž�ÿ|{}•b©©u~ÙèÙ?¯Xÿ äÂú�n”)¸JÓå”Ï–š²©´KéÇél¡Ìñýæòæâöäç›üpþŽ—x\M�ÎV =•15`ö�þƒ?æ?E„! ®Ûª& ÜºÖ $”Ò*[õqý' É}Eˆ¡–=°JPšÉV¼<`U‰q¦PÖ%a£ãé%Çænú×îÄ `àB ÙZ[ƒ:AVGx>¦ã°åp¶Àq'Æ–Ì-Ÿäî÷j­Bó�³T)¼EÑφ‰ú—Aä¢fÙ!Àn•ˆS¼Á?Áà]½Þ.þ…ê�žçÌc!ù:Ý—ºÒ Ü?Ðv”&Ȇó¾Â{{]ÉÁ<°U-L ºIxœx\¥t †ZCj"]a"| }Ö8z„¹\ à»Ð …Y¥«mzÿ¿ˆfÑKÓ½½t™Åßý#z™ï²÷Uýd%�±úÜæ›÷Ã�…Á4ïw†e/ jÄ[4¸•rëËq`(ùþ_<¢ÂB+ŸÊt ¼'a4ýºŸàÂÂ| kA³c0Ê@ûñëÖiY,[ÙFËrô€×•ª2}СípÀ"–gU-áýÏüd1ÎNY š=Ju²U±ù_KìV–ŽPbš¡é­»é`Ô0•Fõ”ÂÉ¡“+T~yίCëÊb([v3¤¥”âÃñçÏm§WÌ™ ‡Ä+�^NN϶Ô`‘Á#pѯ)š9¿)z„a: Ò8Ǫ9]šÌ¢ru¤}–p±FÈÉ< kg•ý@à†Eï€)ž9åàM2%f¬µôAÃã|îYHc�Ω#»¸Üe£Žp.®·�²0µD2ªQEζÀÀ¾×ËF¬IdõåêœÑ·³sËúðYÄáÖahïý)Ž ›F™9‚]xúV¢¼º~±ƒ ôePâbZ^�(íÔNÀ´\Qñ܈ÿQ×9)åiúDãEè,x ÎŽZ†æ ì¹b¬klÙ•Ì¡oR´…°µ¦J•¨‘aÞ˜R¶Û¤ÜÄ]P¦ý°ù8��[o'¢‹ê>Šñ&¡Ô�;T�"ôãñ[u§i{÷ù$È[ ³•HFñQÚ6¢¤æp>ˆïxÌlÖõÒ.,0׈MuëVX,Ç‘Ñs??fµîk¡\�§˜%¤ ÛW0Òô+ª%ÐE_h+P@^ÂNÜë´Þ‚eÑî€eg¦ñ˜Ùÿóëot>ãT8�E… 'ð­”–.ØjuÆ]“ñ|vÞ�¡„µØ8´m£{­ï ŸÃ$nçèÏ8•¯¢Þö«'­)rššZ!¹´À-Ç=.J¥JLêÖ`º_Á8¡i�ÓÞyÝéÏ´Giè dv5×öäá ²�ëë{S¢�v¹®~ÅE}ß„옠Û‹Óë§)¬!`È(•¢æ�_:p€•’WËΦ·Òcbÿ®WŠ˜…`$Ò�¬”üLc³‹ã0-úV £ëÂnfž2‹Z€º ®•ÒuÑ¢ñ MÉœMÙÙb6»€Òð¿•mPÓ(µH¼¥^#WpW4(žÓÃgÏ’ïþ†»†ÃäÛC”>â`Îe×aOÞoL®u&9;‚ŸùÚ 3¤›GìÂ�AôQÛÛ5\Jˆ8»2=îXÀ.ÝQðÌwJQô[ä­n–áèH‚Z9¾ `ë#‰i¥€ ´B㎺à¥f¬Fé32 ~á›´@hÌoÙÁ¿´¸Î@m…eï´®  |Û� ­ªP?u+„îQk `wô–›!l�”y*q$F€Ç #ÐC×ñ|ƒë,l°l n�¢ÿF,µCx5ÊûMIT License Copyright (c) 2026 Asep Haryana Saputra Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. }MWS½/xuRÛNÛ0¾®ŸâSja¸í¨´‹LhtZ «–mÒr7±šÄ‘TœÞç L»‰ãßÿé; —³/ç?d<¯�ðkØ*a†SmW…Llε‹V¹¼�(…yÖ†« ‰fáb�ࣕ(G+¦3Bênvver “ Ý ½ãTñ 4DÿÏ£·SúëŠþ~ ÷?¸äá¾ï÷á>OÏ“ù"¼ZÌ£o{¸‡–ʸƒm7è Oçç¸;‰p¯+ôÞã®R¢4kx—ãÉäbò®Ø¥‡cÝ\ÆvõeéÀ÷ß֟Ç>!l»¢a®»»ñ\V/�CºVLeccÇà+Onâáé%2Þp…X•Ôtݦ�ºÀHgLñdxSäŽJЄ�mÆ~oxËs¤ÂàßF"whÅ i8é½Hè¥í³û)¸JÝ*.[¥Å5¯ÑÕ¢5“>µú¹¶?–F‰4åJãT˜™]a!Kí ó8“ð–VgpÙe}v�j† ”-ï©H3l¥Ú¬s§¸{ëÒiËW͇GÈ+5ëÍ�¯ËÅ-oÈøKÄq×]^¢m½ØÊY;î© :—¾¢°‹>u¯ûú¾„xœíXÝRɾŸ§èZ¶‚„5#�11ŠqEHÌBö^¸\žÖLKêhþÒÝÈ!U¹Ê¤ò„û$ùN÷Ìh8ËÆ©\EBs¦Ï×§ÏÏwN³ÁFZs®–<ã줜x¾˜EÎÊÌ” &¹–Úˆ”¹2Ó<‘9‹yÆN*+D—‹2›±T&rañØI8æEi¼Q�w\KËBj>gZLøŒK¦ËIšÇe"›ª<3@ì±ÑÅiÏn¤…º–‘hm4€"�ðl¶pk ‰üXI¾ÄsÄg2Ã3ÔDxÞÆ;(íywõoFŸ;vÁÍœµ?wìHLy™ö.�xÂ.pxÈ�Ðì¿õ¹ƒC¿ù°µ§¯‰¾"ü†�µã²Ô†œîò¢Ð}™ÏK3I´;Øßï9‰JÃSÎ:£Û2eÏàW~~yÖí1)^ÈlÖc2å3ÄOå·Ë~Ä£¹è±T%#Ýcçˆ�Äy¤­ÇÉRKî,©íVV¦ÁŽ�ÇìP‚'F¦¢O÷£97ý?—ò ëT�ÏØa™áûHÉ/_�pÏØ¥ˆ¥î>—KÁ#Ã~“¶?HV[†ÏƒÁ};ÞVùëÔû¤ߘcr£Põ¦Öíd¡ýô·>¢i-¯Ö5%ô-–PýœfSŵQedJ%<ï­„£<-r-ØD(S²PÒº~õ¢=Ïg!x@Lå"X¦I8D°®…ÒUV°+÷®¢-Ò’×�®C‰¸RµQ³â&?í› ]¢ÔO6\õCå‹ #噜 d|Em/u\¾þîäÍ%Ê🌺 �£yG˜,ŒÌ³ƒRn嚪âLnsl=£½Ñ,x° r“K� +ôØ;ïceú'ïjYˆƒþ˜çÆ;¾јB}ПȬO…ÂüˆmÂÅ«IôŸTÛyÝÇË~V& »»c� a†`ãÕ©.Q…½4 ÷q«qÇÀ²… ¡^Ñ¥6j +ð°’øJxºÂ«o~YÇ^5â×,ËcÜû΃H˜[ØrÄ&tg�›ÝßTï"¼ÉÄ ­ Æ„g:ôþ6W2°¶ób0XYeQ‡(¿Ç6׈|³Ç:]vðšý… Ôy"‚$Ÿu6Ïÿ€½Xàú `öW ”g�M¡T® %Qz;:}7¤wØ2kjÆõµí®NÏŽÏß_¹=c¸QåËzßïê€Õtr?ÉÖ[1rägÓ��!»ë¡¨ù�ù!W¥ç]àFZV׬M#"•̓›°Ò–6¯µ'Ðfõ§èÞÙW`ö¼ñ1Ši\ý�êÌÈ4¸èìôÊND—þhf‚ç6<ú"ž»‘f')…Ða>_Ð2hQуø“eí¦<ÑtùE»*ßëYùS»Ò„Ij¦Íh€ &`Ñ à·ùL[êà Ã\G6vm„-اsÿ~ä~Ø82A~]Ê'pˆœÓ.Â1óûʱ÷P˜‚!Fayä Ëo¨`×A›2`#O¸C„üBLAn,Ë×�·©Ý‹3¹ ÕßgX ©2Xœ¼¬ÝÇð<€ƒ^—z *€»\ gcäwÔ«s ¨�CôÄ c]µ«ØF}èû>s\�røŒZùåïårV�,Æ›ÝÈâÊ;ùæâ+}>¹2 \™N”ÎéFbïú‚Þå=Z¾e6µ�žšÍ†ü‘ø´×ÆŽêAø€jç²ÉÁî�ãÛ£�“ ×÷ ã‡½Žqàsx1 ˆL%׫ÿ÷H£užr2=I~×ä¡~ Ö%+Oõú†Ú£R!ƶAŒZ…Ô¶Ãýhù\tš�” �ŽËeC[•Å´¾:xXyªub¹kÈVz­´Ðu!Z ‹2»7p½Ñ‹ØQ»Cvꤶ#?¤‹ÓµKÏ–’q¬|›©þSӳ̷•˱Ü,A¾ å®MOsíMØýÅ£xœ343…âä¢Ä‚Ô"†N�SoϵÿÝ:W³,¦2ÅC\ôÓ§ ¯½ex…TMoÛ0 ½÷WdÆNÁ`·vé-Ë2 Ðnmº†aPdÚV&“%çcEþû(9ßi10lê‘||¤ø|Ñë%o�® VÉM/©¼oÜM–M Õ0sió¬;uÙuú!}¿ùKgŽ0y¼•sÆyq~–oí ¡ë~µ¬¡û&.š¿0®b‰ø÷Öá‰Q¬AÀS¢ª©…\ ž[1rk!�¿bh„Ü ƒ¦ºÌŧCjWW«]È¡uð±õžp²jµd¡¸«#‹‹Æ«&ÆÛHóòÉøŠZÿ*H ¬ŸÀ2’‹I6œc¹1•n,,�?áˆô™x¤tøQQìêz’Ü+oôÚÕЊô/b&•qcì�/„Ü]¥ì°R·�3†®u�цÚCÑ#‹³Z�EíåôÏtDÊ P'áY£ec%°àÞù,»&–®z„Xe7Q8¤G”òïŠM˜’(0J%ˆ¯Š¥�èïUn–¯WéW‘æQ†[ÂÛÖÚ�sÀAªSïÈv-ïn| âZùÿOp‡ Ó3 |óBY·p#Š¢ØJ\£äm†¿;{2¹ƒq½±Ê½�­íêòòÀ:ÂÜ`xÛ"Ù�©¹ršMol¬"™¹å}‹ÞÔqÞ=+”Ä,D¶©Ï«“!øÓ’‡=UÉ%*ÄüvÈ©•Ví’Æùr(×VÅ*k÷Çj£ÉvË$Qv¡VnªD¼…tW8V²6îsÒ}0<‰T%íI¶­N¼�Xˆ²ŸL53�¡ÂÆ9 S˜ÃÍ“˜‰á#-Âh÷PÛ6��~Ä(¢U¿¿çþ¦ßÏRj5åzséNÂ`‘sl˜¶Æl¸€A‰ó«¦<.Ç#o¯¸”õxdÓ4VåIæ~ 8?FSzB\5�ËdÏgŽuÆÂ& �–€©ìõXðOy¯/Öÿâ¹õ¾•xœ�TÛŽ¢J}ï¯ ¼Ò=  h'“Œ7PAi@蜇âjq—A;ýïí>ÇÑvÎy¡*{/V핵ªÞ0 �3'òaìé^�`–âÏXëñXw²Ô‡ÁeµÎŠåÀñþŒ½=`†á¿v†§ ñðg ¯â& ôžòò (ö ßJÏÙà�ÿB]o7òr/u½Ô�g|§æf‰"ò´éoío̯¿ß?6§åôÁsàD 8ŸëŽ×‹Ò�ON DZ7 Ïòf)ˆ/Ç:£rbøä‚¢†é(’{6ÙuTó&†iÕÜ#:=%Šï!ÿâÄæ.U S†¾7Ùè·ó°÷G ·á10oÇͧy6L?]ÀÞO´íý4/f¨æ]öÆþ¨®µ=]*År”‹TA¬’9¿dÌ:`?p¤Ùw8&ÖB[îîr¢­fl˪rk¦$T‘Mx~3ô×ÿþÿçñá"Wœ{½Ýý#Ç àˆcÕÉ«cáƒé\‘²1—½¤Ò*Õíá䫥=®!KôX43ôX.ê�9lŤ([¨….TµB˜ 0FëÂŒ‰‚í«4ÒD?˜05¡3Á=EÍzš¿VÓ\h‘‡-µ œb­‰}7dY›çúK*Tgî îÀÕÆ£æýhÔ­µ'#`°F…Mxj6ɄѠkclÏu�‚ºL;ç(7µü~^o6¯«9¾´&BMK4¼½i´ºSI¢Øñ䌵å`$3Ì!5Å®EyGîâ�ÞH=2`aIdI0™‰{– [ìr;'Iò¤*|9Tx;lWîíë׈ÿ+ÌwØPu§É;®ƒÆR®F2ž¬S{ÂÙÑê²B9ÞxœYD´pÚÈ£Ã^ÿ¥g�LXFë|§‰�†UfzKV¿�¹óg檢›‰»”r¸ý<š•0FÁn*�=Ú´ºÐ¥»Ã6&*„M;Ú'DÑÒ¤hÑžh ¿êõMQ{¡Kõ¬|¡«R®¹Í†—¢Å%šyÏ¡³Çð–šÿàÎ¥¤¹×z¦¸Òàd“8!OûLw©†ÈÓ#F`uÉ0J 'F~púj¬w„îT0¦ú˜÷¹9¿ô�éAÖ¦»%‡^ßR¦‹ •¾¸C¿¿Û¯7›×Åœ_FÍY·„`Ö+g;Î"ª?aDÕW„`kº”œ%~Þám¯UÁ—r,�™îÆ�ÐQ—¥k¥WK2àÉÙŒ+Ø"œ)¬¾"�ðW‰b×wä\�Ú¯ÖßI¹ôeܨ`f@–¬:„°¢C¬Š¹¡†¢l��×7·ÛhxHÑY$[A×"ã-:m’qÊxÛqýie»ÓéJÕ¥!¹zÍ2æ¨O_0ìýáýá'§WÌ“  x340031Qpq ðñ�ôuõ ÑËMa`-Ub&uUfÕþЇ…?ØðZx,7„(LLIÑMI,(Ò-N-*ËLN)×Vó½øbÍŸ¹«®\ðü÷)Ñwò[1$åy©åº‰ •ÙÖÏw›Ýˆy9_Èq߬­öÛã3?|21…Ä”"ç׋^VœRÉÚ *ï§tƒ}å��v,zY>æ¿ÏxœÍ[ér9’þ_O�•ÝmR£"uØÝ3KaY¢%�)HÙ½³^‡²@f±ªU¥Ã-olÌ3LÌÃLìÓÌ“ì—8ê )·­žŽ]‡C"�D"‘w& ìP$a|3QÆŽrÏ;ãQ�óˆz†ñ$”3žJ|àI1€N&yÄgY_?ŒG3¡Øï˜ýpÏ“88’Ùq>dû£LÆQŠ�wgýõõ–ç=xÀöU*31ËråyƒÁÀ³°=‘ÄìŸûoúÿ÷,b('zb"ÓLݰÆÑñA�µÝæÝf]=„a«é±ûýûçßþzï¥ÿŸ{,oXã)~^ŸöÏ÷¾�ðÀp`dÙŸäa–ç‰f/±üL %þ’Kb|êy¾ãY7šÈH°½]¶ý¸u]Ž;A^n³Fæjb"ÁÏýôÀJ'€:@ø,)S æûýc67,�lð_íVšNÛO_vÿ|ñfÿuwoÀ�ó<Ì:l ƒ l?y²õ‡AS“ù2ŽÆr’+R8bÊ9W‘yÞóœgl(4‘pÆŠGq™¤ÀÆ3ž3ìžs9Ój« Ñ%Û�ÞìhËÄuæ�öôm¿ÛÛ{VòÚpè Ž²xÊÀž:ú…Õ*޳g�Ÿ´¶¶lí„eÚ?JDj*?ÉhV83íC®´A@!­‡&b²Ó,žóL¦¬Ñ`=Ö"€;²º¾½Ìyc»ˆÜÛ0—a°�mÒé†Özpµ²?`?Åj6ã+¶ÕaÏ Rƒœ˜��~{Þ ‚)ƒÖDfÓ|ؾ² Ò¶Q,_ã÷ }ëf4—oø<ôH)b½AjuSãF|ˆ£b-îèX4„GMEÚaïçPût^ÊF€ô¡æ2MéÄ´n©#³À*%x@�0p¥ˆ<ïc<Ô�šX³•Ê£ÔÇþ,Óü�#bez*ÍD’vlpôÉh€‰·AÞhçٳ˼Ѷ±ÿìòqd¯ÀÁN%ä:¥(µ°œs†Úaþ™Þ·€2Vìóç œ³9—Â6D–¶ª>�àWÓ™Š,OŒü®+ä®.Å\€þxçÉ´@®y[•Á±V$£ô¹z R–©¼:˜ñ ¶¿­å(–Qí S(@¶ø>n?…Ѿ;9èÛìT„z_é”ûX|­K`Ä¡þXÅsœà&»N¬JŒw¿u7Íf�ri‹,þ×n°1�±;çׯƒ½ò)|m ÚEFüR—î´³ã!Ü…â 6¸CúÅ9h¶L@žÇQLl0ŽáŠ”¼†U)Hcâ©&¹²-¤üÅ©˜ñ©Yºè ¶;Î%ιÊ/y& çÛÈ·Ê+YLÖe±Ah¼Qápà!ŒR˜á–}É¡=ú áIJKirˆd-øp'ç|–9Íoà´j¬°}Ô=}ñ¨í–µ³:;rÔ•”Ôˆ( þHd䢘ŒÒDŒ2÷ï#*ø˜b{p¹—íˆ2Ùí½ï·ØííâBØ\ÕºúVrÌÞ³c>h"—¾Æ>ü‘eS-4)02d¶bX‰yL›‹•DƦY§ØnÛÈq·«éý^»’ÈÓ¦5¤cé-î0ðÍ99oæûðϰ}è… ÆQ¥…àãØ{Ñ=?8¾8îî®ä³k¬ø>ôÁ§,I+’.¾>Oˆ�¾O¹~¬’)�Òª<}áz6P»j×çj‰MP¤#ÉsÄoêŠ ®¯¯÷E–ÁVS˜�[Aaðµ †‚Æm²¾®ë^…BíP¤3%T#•¢·Ö­ô`ÁR…w‚%¶žŒxÆVµh©3½æÌ4 ‚X H· �`t#„ZEB£û HeL`¥O&îšåêÒJÇ¡Tb†,K–½K×Õ +ȉ (©âH7EÉSäšyTÆ’PΡdPùšG9uC†îM¦E¶@Áˆ-%;F®EYäÛ žþj`;‰ùîr¼�"B™éÎbÓ/»†ÊÃ×y˜I?ͨëa’ FÿlŸµ‘y Ö1T"P‰¦¦4(³ü½Ó× J¡„ˆ:[l¿oR?¡¼ŸN{/ÉOScÇ;8=û³+ÜZS0ð­ˆX«íõÞ¾¡ïä€27ãSÆýID>è}ôú*JÌÑ;y†ê@^wx˜ÈÈBk$ó]KŽ&£�,cíâjÛº‚\_(x*¬ð1”<ê ãxë™ûi(çw+A¦•m‹‚†ŒJ€#¼â7&&$±Ê*µÃ ¸C?LbTqT%ЛÓÃîœÜnéºJ¹[_ak:ëïLàw)ÁÿÝi-TÕó‘“ñY¦«iÐSu*öGß:•ûlXÌ™ÃW& Åé«y“Ê5)Å.�u¬?4ÌVây· Àr c;W\Œå ¦v€ôè¿ß�;jþ¿”M‡|(ŠN>ÊÌ �ÞP²±K‡~´òiyGÔ?Þ§~.³Ê‘úǧ½ó Lí>l˜úáÛ°7ŸemVmüÐXýª€õ¥m£óÝqùà¤}p³¥Ãw)¹½ðÚ°¬OÍ£&­IܪiÛ]Ú»+2Öè_q˜/ÝÿRi Å…zÐ"*«»`xáÔØó*³•ql´Ú¦]he×Y¥óD¤ïtX×@vO6×RSô4q}ýœ—ˆº�jfëë¨ÈGÒbhmºEðôVʵ¾�ø­Ño¡,E¿~e†üKæb Æ ä§P~ŸDcØæˆ‡„ �éuH¬Ðh4«ðN|_0ѺÿŽ`NªïnÖuç>ŸçsÝ}w£Å A*nÙKAA†G« -}¦Vö+S(üN—+·l`I-rJØùp´µ½C/™Ñ´‘H8©•â#¡ E?ówæíáVk»µC‹ñAÿ¢•=ÓiC’G4cöœ&x.•ŠõÊK³û7ÑÈÕP Gkžë›õʺ0½üKÆôz�^¨^JqeúÖš¥¶án™äðJ^ ×^¯×4mˆÑ_uÁcï„ìpÅðæ™éˆÓ¢ [§šeé'dZn)æÂ -'ü^†@2³žÓ~ÓJªŠ¢|1[(SKw~ê%Ç$Qç]±¶Ð¹y`´?ÔØÞžT¶rÎjƒ rA5çŒH;§B—P(]Â:K©Åªû~÷ZeP©²†îójrÓ=1S>/ Ž4”™¹÷sV^¥LÅ,Y=\-N fS¦oµm‹ŒªHÄáî|I2@v˜§áqB‘’¨,êØŠ_Õ‹Bºñ³5ý™~´ úTîy(Uß³Õž` u$ ©SʃjóQGóò4½íêêâþG£�BË \ïTj¤ÿ(KwÌÒAËÈ ½¨+Þâ5"ä]H¾r+ŒZLÚ;6½Çfa¯,A†ÔQ2¿â €Úß±è–Wý�Yž$ ‹‹;g‹Ó½r/^â²Á«Û�÷ƒÁD’M%O\¹±À” ÷ˆßûÑ,è×SzwŠÁÊüú½ã—ÖöÊU:Š5Ú\ëq™ò9໾êªÄU'¤¬e ¾µi�Xׯý2Ç@_@Ã39öþ#‘Ás±ÜxÕWmoÛ6þ®_qs€Å,)IlP ]Ò­ÁÚÎh²b@WØŒt±XK¤@RNÝ$ÿ}w¤$;mڵاÅ�Eñ^xo|î¼/P‰úR”K¡àT4–çhV2GøE˜6ЦB-Q¥r¸0ÂÊÀgZåd�`e�¹0@¯íl'ZH˜ ‹M)ÌZ(—íå<‰¢�˜’е0ÂEQ /Ÿ\œ{4p‰æ�¨è ñ\ª+#Ò\×�¶˜*ál²®«ùIx›JäX£rÃyŸ.ȧN˜O?Hà$¨…_e…QtŽNŠf£§um9ø”kå„TdË¢Êé2‹¢ù|¾uuîÚ,MÀAjF¡ÅŒ ~_ÖbA¯‹27‰ÔéVx¶×ª”uU¡u^ÒÐBGªªk±¶~¯ÀUagZ…SØÕxM¿ëí)¤“ÄØ»9+QT®\{Eà¯fW讵Ydjl)ÍXÄDÚ¨•$6L<„ÕjvEñïÙcH’”ÿ‰‘U¬”Ý ôê©Þü.ªÌMAåGñ ��ÇVð¼?Tõ5ݸMdv“àÕn—­vã˜$‹cz|²ÝhãŽíïïߣøâ(�kâ@?zˆ¾0MèDÞ?¸§`(¬¸ÔÖÅ¢(¨*í±×;Ð2–;º'ço±¢»jãF¸ò8\k¿øVºjëM¡ô¥0€ÕoId[ë(Ú.ŇÊp¸~Çß;4JT8Ó"ßfM‡ ÃáB,©nÐÂÈ™e^KÏ..¦ðdzc‹u+€àSX±G`Òaa%­C ‚•ÎEÅËQlæ;.…-#‚Âö’8KÀ…'Ê[SAüLÿ8¿ÎT–¦÷¥ÓÕA²Ÿ6AŠŸ– ‚à"ñ ·nþ¦*‰ŸÁˆ¡Š´Æ´é!¨’¹`HßY­F�¯€Ý›Ñ×£ F+Qµ8ºÛ%7{� òWd>Kë¾`³.‘�+­Ñ•ºH �MMÃ+tf`�6øÕ~ä9Lý·üf×Þ ¾ÕkvrÒ;IÞÖëÎß·»}úCnO©ààüôw¿j­£œ^øöÈmq~"ÌB'NS+ yäeäo€-–p 7°Bc)\´í'Gtæ ×ÒU¡­7£�3¶„C9z w‘ÓK©cë Šº“B·�.ß¡J¹†L‹Z‹ògtv–啤tgÙ͉_Là)ÕÝã�ØØ½Àñ8Š*täèà %Ë^�G‡?&ûô9 s¹v÷q-¤ûùqd’ΰ™¯¾ñ¶oT’–“\ä%¤€e�3.½,ãïïÆ7ÎFÚÈ…¤«8£ê§2¤ïI ä…êöºÕ$ºÛÛØàïl!º67ò?‰{X·4&ôáíL$‚ñö‹Öo½.©g+=×5޽ã{» >Q„+㎂Ì['2x±öaî­X\]Ï,ÝMïÕ%̽GA憙¦PR/ 3=-ºëk%!Áp¡™[žL8ß|S£ßZ%xœk ^É÷0g„˜ó–×F¥tÄá¦b]iQÐê9– «‚Ûè6ý3Ž7+¦G8`;ßsR3¿ÙÎìú$‚Õ­ÉñŽyÎx ¢pTh…$´Œ}¹ð©Û: 6BÒxÑi­ .‹ P�òÂ+:yùäÅSð&�šÍ¥�K¹QD‰¡h`M ­0è ¦PqVíbEKC)yí5ž{ ðƒ…ƒavMø^'¢Bã:Uaî�Pq¬�¬£†fÉ9¯ë©1Ú¤ž™j�J?$ßú®óCϹIPäIT7<×FÑŸ~œ.6[à„jœê|‰4q%tm„fÚ3E8Y‘ F¯“çg„áÔÌΔtaË÷�T„éÒC2UЫV ¶Üøè5t°ÀJ#>ô£�dÝ À½{ðÆ �§c‚<ŸéÐö!Ilè3Ð/ˆ…:p¨ð£^£‘WrI?9¶Ýí›l˜aÿµ1¶Ü…¦]¿å¹º»Qÿ¡éz-ßÞnYŒ€Ž�ÐlÃo PÜíìg\úéðð�š÷tn|¤þsšnåŠlxœ;(}@zC2 GQjq~iQrêæ–PN[3À¾ûxœÅWmo7þ¾¿b—Tì)ÐV×5$)Ð&" ¡Ÿ²s»¾]s^{e{NÀïØÞ×K TUU)ÊÝyÆóúÌ‹ïÓX-±\£„ÃZð5ÏQ7°fpÌj¡6“6ŠŽÕº¡oÀ%ú|ÏwI ,ÖXº³^�aúšg –­œ «KÔ”—Í2MàB) šÕ –L¯Y�ZÖX âX€Q�&ØÙDl˜#䜤յ™ï“:Œéë³´¿hše¥òF°‡t”{Ã$«lÍ4©ªV†(—ÙŠ¯1À�Òë•P7�{WÁ2‹õH—îÌL¢èþ}ØKàyƒ­á�iQ4œy�éÞ n_6K’* ÒR+�àì]DQš¦–}°QimmóyÁ-ù›dªš�¢4ߊX<¸›Ð '%ŠNQ4`û¨S ½¹Ä~;"AóMÑýá0Ïá_Ù[騒ßÔ9ZqLÀ±ô¡YÖhïYð�‚úC—½![+.XÝu º‘–WÌ�Ë•Æyî‰# ’�=¥¼½h$:!}.ûè,.rÈ”t:ÒcMKnÐÁºÀµafäR�¶Å3èo…Å+øºU[ ¡2�ôy<H‹[!ñHkýÎe¬bS‰4X¶ÁJDmšEc}ô ¼×È%ÓWD`‹Ý“y…�e¦®¾‡‘þ…)1Þ7¥Ò6¦¯A’fÆ¢¶ @qƒãÏ$³®òL0„ÜÍò˜HÝ)� NÚÌpo[Êäõ• NÇC’ÌÝ¢h¬é.-Áù)%ˆý`™–(`uÓ‚µCR:åOtº®—#„ð`£+»žã[NÇ&(úI›ï§“Àš„ñœe$tçßó%è›5Ôm‚án½a–S£êdQ. Â]Á¥lÑÚé%µ—-6ý.¯ t–+ äFcˆKn°Óš´¥7*²¯ƒm ±˜b ¿†3Ï4›ûMXsùBP×0öoDýšÉÜ\)ÙåÝ]‹k�sk€ �sçé¢óþªd(l¹iY$ZóÍìÛÈ�ï«B™<³$x5Nbƒ˜çC@nQk*¤ƒ}÷J󮺦8?}ôè6½ÐuèD~´7aèÃ—ÊØ˜fÅØl…ÐÝ{:¹çQ ‰fb׿ÃAà»V‚¶³]‹mK$ñ£‹Ñ÷P_çh,wÀ}ßè; §h:ä=uoj±¯¯�ΕÿVº^þd\ÙZ54 ÛfEoÃhl+̆ãy¾!@ðlîÆjâ|™KºÓï%éÖ”íÖNd7ñaö’’»“îSõ窢0>KF½;©6 ÏÓ]øô ¾ÌxÖž³ƒ…LoΗãXÄ@lÆ wÖžYaðñsû«ây.Ø ÕÉä’+%ã¬$­¿ú(m<'ý¢=‹¢ž|+O§B(ÌŸ#í¨ÓƒZÇÔG¯³¤ÑÔëg>ÀóñLëê¯Ë(õê6qýòèGÿ�Ï$ìQóŽnÚe ö|qݘ²kž{cx¸’"°Z–ùÆzþím×�üÛVŸÉfÕµ~ªš ­æ‚ÙI4Y7*’Bƒd¼Ñ0–Õ�¶›tE;29ФàÉ]W³ÑÆ&Þdsäµñ²X v9ð™4 Æo‡:ìéãÝp¢®qžž^½>;ýæäê·W§'oR?ÌîH�‡HŽfš_í¾4ûz@üÔ[™‡7’õ�‚ö,˜Å4_7–VJzL^Gn\7nÔ"-Å–­mã'6½,Ȍҋ“Ã㳓¤ÊS÷ëðâèå«Ë“£Ë·ýY°qÊçÜìBémü9�?i™Ê½e¿»‚p¡»n�àÝáÙ©OULM “l–Å(õÆ–KZÀögçïf¯\eøœ ¾|¾A­”Yæ²£$çô¹3óvÎv]µÜ™}ïb8Û 5xCYñ쉢V½³ h`UõéD'WìÊôΪÜõ$Z¤ÝYÍ^ÿÝíϳÝdþ'œ¿‹¼î%Sy§!œÐåöÙÐEœ÷¾[Ýs3eÅ xFÀ¼žËFxðXV*¸GJˆƒÞ2죯ø)§¥xœ340031Q0000Ô--NÕÍ(MÒ-J-È×-Ï,ÉÐ-.MÊÍO)ÍI-ÖËMa`“ª½R`yÁñ~ëQ«¥>óåº ßBô¹:ºøº‚y¶Îµ¾zëXƒÔÂøœµnï2¶™šÿÌÖ%·¸yxuUÛŽÚH}ç+JâÃìëhµb¢d´I4’wšv�;ØÝ�¾@XÍÇï©¶Á�‹�ݸOWÕ¹xJ˧Wzxxøë‘¾F&Eò–^Ù»h’ g:™ÔÐÒ{ZçmçêÜrœL¦SZ'•2n—Z³O\—Å•³‰¤ÉäKÃäƒûÆ:‘Æ¢26R—Ûd|ËdlÍžñc)ï[£U2ÎRäp4š#¥F%Š� LÎ2áíÖ�;y=æ°SšéÉéZ¹¥òŒ¾Å;s àr2v?£÷&I+K-БN.v­;Å)[“óÊ¡ª¥Úé,àåyÞ-%6.·5m¥Š#·ØW€#‡`<ÝtÓžgtj Z¼)ÙØ]P1…¬SFC`àC!�sƒjÍŠNfVã=ÆÐH9L÷]R§¬ÙqL‘bRg™l41Uƒ“'ÖFŠšL„Ê�Šì1ó²ªjòvCJ&Ë@v‰°@áJ3öWÂò• íj¦ÖAFQhÞÇÅßÃ\þ)`1¹Èbˆçû^{´y=V޼ –Á,6²lŽ çþièŠý®Õóbõ42[ö�ŽßŸ6ßCÉy»¸ ¡Çx•a$çZˆ¦L:5Ötª}¤�Wú ö<ÿ�ÝÌè%pJ†ÃŒÞ­?›fôI :ðÝp E âº!?ê`|Š˜ï*‡ Æo†ö8™¼Ñº×=ÉõF/ ޝ7¸±s‰Ç•?ݽª/@�r÷ËÂýß7O$Pkz¢åË3vöü£YÛ”…Q^‹Ÿ¤V]ßCC—dˆü=³…½eaJ/’0˜(ï�ÒMŒV–øèÚ£„Ý�`…�V$Ù"êõ’)üC!b®"Ä«Çb�H;dc1”ÙÞYt@rc¨üäÐÞšñΛ’¬"ȇXHåÚÀsýF=­Ù7éÄò[¼[;xÈBd¦$U ´m6È”x†w;, eFÔÞ*^žÒgÞ#�úù< Ñ$Dcê „@Qw½ Å}õ5 ku�Æ@¾gÄÔ—ÿÄ™ãø¼ƒ¬Ñã`¢KHÚ*¸«¡FÒ�²{à €ˆ"jcûóW�p§´ìsÿÊ£aq„¨à4 }"ÉDÿ2{ÚˆU‡o rF댨Ƨ ÝÖ,ÝIÄ öZijÕÕµ�8�ͦ u¯Ö|ÆÀÔg�¸¤Îe<•ªÁ«„/ˆñQ¦°)iƒõÊò©‚wç]]«TŠá¸ùÆ`°^"YÔ&ò¾|£&{¦Â9â’åIí{ø—ÔÀpþ;¡v¿'x€ý# Architecture Decision Records This directory contains Architecture Decision Records (ADRs). Each ADR documents an architectural decision, its context, and its consequences. ## How to use ```bash coder-workflow adr new "" coder-workflow adr list coder-workflow adr status --status accepted coder-workflow adr graph ``` ## Status Definitions | Status | Meaning | | ---------- | --------------------------- | | Proposed | Under discussion | | Accepted | Agreed upon and implemented | | Deprecated | No longer recommended | | Superseded | Replaced by a newer ADR | –@Îe© xœ340031QrutñuÕËMa`’vøþ¯ý|‘ƒ¸Né½m«�ßçô™�Br~nA~q*CϬu+ö{zì=ºîØ¢‰ Ƈv¹<ƒ¨HI,(b8!ìs¼|Ñ›©ßHEŸ½µgBg+T:?9;µˆ¡ø…JÔ�ë�›ÖNsþ—¦^ëñsC DAIQbjZf6ƒÊ{©­†»6-Xo/;Ûdá•ÓÆ#- F�»µxµVÝnÛ6½×S|ˆ‡ÚÞb¹i‡Ëšnâ$^ÒİÝb¹²)‰ŠˆH¤@Rv„a@±gÈåž.O²�¤¤Èq†`ËQßßá9‡ìÀ„Ç’(-‹P’zÞ‰宅c‘åBQ <‚…$4fw ³ÛB͇XHXEó„È’p2HŠ`å{^§—¤…ö¼Õj¥é½ö˜©1ôþ~|ø†?˜ÉfÂó¯\sZ/CÌR 9v£4 Ê5 )æù ãž²iן_féS¾L‹ e!Hº¦'É¥¸/wbvO£íPèÀÜ>†�˜Ú‰áD«g€1W£Å2ª¹¥Ha`ü~£z®%%ÙNšˆäò…4'øò”„4£\Ãó¡*U( B³�w�a4�@�ä9v`*Ñ�È>vQoBdwzwpG¿² `™™I\³ŒBBS¬lpiRaÏ/$2¨Øêv¿¹ÇqhS÷Ü/Éöž¥" i�¤E¿Í�¦„j5bI0TE=³;ý}Ã$Mñ¯�zv{Û�TLje¨…Àb ²Éè!*9Éðó‹ºhk°qooçìÀ ‚ bGŽÕø)cQ”Ò ÿY\Î!¤R?AUOº˜�Ƨ“‹åøêëòøúêtræg–­×”Ûõì8„«�5OòmMÁZŸ2©ôÀn¶¢ºÈ=ï)ŒÀéÁsÚ¨Œ‚S½òІ`�%R3~‹@•õh‡Ö ¢Ïqê ÐeEž\Ö®¸.ª‚+Ÿòõ b)2°Ÿ}zO²<¥+»HÑÔ(;Bû2¦´&iA•�. Û²ŒiXyÓ ÍSQZi Qéy œéŒésdIdÁ §bcâÆQfn‚%ÖÛæ„ê(´È 3Hš–>œ¢)f„ÈY—ËÚ‡ýG'L�-Ù£~m65j�,£1pƒ3ÐêÁ°åYEƒ· Þùð¹¶žBÕªoläÕœ�§¹ŒÕ>ýk �w5 ¼÷Ñ-ÛNûZжk7Y~ôa”çhÛ!�Þ†édËÉTÿÕ™Úé*Ôüó5“‚[¬‰d$@§C’#],‰ª'fß"J‡¿aƒ=­/ºMDrz'£ÅèÓh>^~™]yg“Åù—OËÅõÅøêÈ›Ÿ�fã“%þNæËñïÓëùøèàÝÿ-~þôþÃÏö�£|ã'({ ðÔ"8wÓ" 7€È Õ‘a:ºaÖj›-`WFk´~ÕÉÀÌ�øâÌHÒ˜)gh M¢*ÁðE£A-"Ç�âµ—2¥Ý¡_u�zª® ¨íH5fé\©²k¸®Sùép…˜ðN‘çx¼âA°‚Ço �QZ¹9ºž¥µ³(ó~Ë6[a•K=-B˜Æm„RiëÍÚi+ÈÕÎÍÆÏJŸEÎpÚ7C³`-ó+IYdYëy³‚ƒ*¹&÷X”†wh1š=àmÂz£nFŸ/[V�—:Aò àãÇîô¦ë1$›Ô–) öÁ âì-%¯Wü)R¤×µ9»}_Þâ‘Ùë~o.Ýþ¡gœßŠÇ„ù"§¼×‚C&nͬ›Ô¾"1]¦‚D½8éÛ°\2®{q÷úþ0Ñvûÿ©Ìú?t0½©ƒl£II9š¹9x6 åÕÐqÉš°Ô軵Aјê3_µ˜ý‘ÀéwÝkï»xË™;ü:ŒèzÈ�Þ¼&ö%|M‰SÛà?Oåúì‰xœ»-Ö#¶ákPjJfñäwL6Œ.“͘§lægña�ÿ ©¬ xœ340031QHI,(Ò«ÌÍa`W¸à´ˆëVu“Þ-cއߪ‹çIBÔä%–ƒÕÔíì ôm[°gáFÑÓçêãO3pÆ@Õ'%¤BŒúÜc×§¼¯õëäŠ<¡¸H'ëÿ-»~Á”e$¥¦€UÍŠ/è•bu,²5n¼W³Ùjó£b7¨ª’¢ÄÔ´Ìl°²VŽ÷.S-¯7Ssaº{)OÔô�v Ï G¶±)xmRËJÅ0Ý÷+\tc¨^$àÆÜŽ xw"ehÍ£$s_âÇ›GëÌ"içÌÌ9'“@~§: ²°ÈùèœeT–|kÑ�ÌHLP_§©‘)pûø�ž% Þã1ä˜%Þ;ÿ>uÀqa@O½ˆPâ+ µÂPÌ!ñC8:?‹P_. ™¶à:­Èr’k©cål¡Î™×)3m9s¹Ù<‚qV±óÐÀ@¨yÈ:g Ú~9„x#ì M=ÉÌÑk©í•¿izdüƒ<´#µÃþæz}[°�Ó[óc­ØjS­Ìró"¥¨{Ÿ5¤{•ð\ß­ïÅÓòaµªO¡Þ¿ƒaT=y˜GÙ4Úu¨Ó“Ó¦ôú€ÏO ƒb8¯_&Êrœ4j çWó%±2ä¶‘é;â‰½Š‚áb*ËcmGòÊõ±ô,TÕ/SéÁ;Uõ{Üÿ�º<¤¿H&¡CTf“2ö[ª¾<½î �lxœ›Èz˜Yª8µ¨,39µØŠKA!%± H· '19575¯d¢€˜*ªP‰‚BfnbzªXmf¾>ˆšheà «�XP [œ‘X”𢛗 QšœŸ››˜—b¥­¤§7EIGAIW· ¿Ì25000UŠ�\Ëèà fO>˘:Ù“É.^1Èj€xœ;ÌÜÏ4áØä*FOŒàƒxœ›Èº‡yƒ(£BV±:—è*¨ë§ ñôSK'‡3ªO6dJº è¾YxœÍTßkÛ0~Ï_¡‡B^&ÿHš­5˜’¶†mdÄŒa4éR‹Ú’*ÉÉJ»ÿ}’�ÄN[Øëî»;Ý÷ùÎô†S0É!C5Q 1QÜ›Q),át!H É0 ÅyMn�û¶¤:à2$TIôdxÆeó3Ö6%ÁôèúlÝ–Ñ`,Ñ6A¤Ú’Óú(ÌRt­ $ˆ5ûsÛã–;™ŽBѶ aDi¬*B¡aÿ9Q€ÝJ}w¸‰(…]¿vP_†TÜQ4„~¡ˆM±æì£0 ‚Ð?h]%�Ê–´z·�±NŒ}_}ºÆùûl±¿AcÚè a#QÈ`ЦrvLP‹-¯A6ÍPi­J°’”T¥tuN£ó8DOOmUtr�0Ü£ÉdücwÖi@ªM#³o +— øàÒ`5wdÑlçh+U.YŸëXq-ÅPoŒ–Ùõ‡¼øº\¤NCn\{ÝûíôÝù!èãͪȳ«e¶JO{#¹èψ×Ç}Ã]úïCâõ|5¿œçY{ÁÉãÐ샲o«lùy¾(.—_nòl¹Èò¼¸ÉÓ­ï&Ž¢ žÄA|g“dEñèx°¥¿.D5Ü o»¥ð/–TÄ�ÿ~Úñ³yß‘®k"X3:VãÞƒ±Oä,(òVRÛÔ�äÒ¶î'·Ã§³(z‰ßjE;ÜÁÑq�mìgÆœÄ&}&‰Ï›å9^J ‡¬ˆ-Ó°wtqY55˜çÛËÅZ“V�AF28�FC]_ûƒtÓóŠÖðË-¤ð iu£?›c«äƒ\xœ›Çý”kB{b¢…±¥…ÙÆúX¦Í"ÌÏ9ŠR‹óK‹’S'³°ÎæŠ c¹xmQKKÄ0¾÷WÌAÈÅêÖ¢‹¹‰[Ѓ(ö"ˆ”¡¶aÓ¤¤é®"þw§IW+˜��Ì#ß#¹½ªi� €£F…@m�GeÈU;’1Å%ªÃ-D,FÝs•GƒGç% >àÇb†üÁºÝü*ö}:´ÈÍ)§&Ð8P+"‹c(]€öÖùŸ7R'ŸåÝÍs±©xÝ—UñòôX2Í.Ög+ž™¼Ê××aûŠÜZBíÛº¥zwõLW«¸}؈ÓYOZk5]XÔV¼Íì”ñlj Ù*ªðª#;r~Œ8òN±Èç¶`FÕ“S¶‘pëöV�ݯN–|¬ô(ϧ]$ÉÒ´ÿ ‹_ò7@é�™š‰©w#%ÉmfÔ:ù;®‘»ºÝxœ­WYoã6~ϯÐCw�5%'vš °9œ¬‘:ҠŢ(ZÛ¬)RKR>¶ÛÿÞ¡%ùHlEYäÁ–43üæàpf¨AÍXÚ?r£(ŒØÔ¾:N$…¡L€ MÀ/™+KèxCòg'ätEW  UÆw(ŸÓ¥^ÑôRG†ëÔqšŽC"©€h™ÐªÁi§sÒÙ`é¬�!—åa*• cZÞqÛÙÈgœ%̬х1å*—#´¦åµÏ:¿œ®©ªâ]ªU°ebãÌóÏ¼Ææ»Ý>ññ—Sо¹TÓ-yš¦M�¨7‘¹"ãN¤ÞÁµß$–Ña€”û-�x¤EZ�"îIBE¼µ¨Ù¤)#1Õ“¡DË£2hþ8ŠŽ&�@`eônšDxÎ5—ã=T²È0�@11Öì›=m»îX 3àAïîzð‚5’*¡&øGKQi?Æ_h{æÐ |Šõ=²d† h\|ÕÁ¬„™+fàpXÌß ÃÙ.—¦�‚¯ÅsŒojn�ÖX­Ž~3Ú¸X¯ O£w u°ú¯ƒV;ì/ÀÞ!ø˜?°ëÚ°î ¥ø"Å£–à*ÊIʳ1q»'¼ÉR’È8ãp‡½733ɆØ4WËŒ)ÿV–°f!^w†¥ KF0kaשaÏ[ð4¥frÀ¢²–æò͵ø[�×6yä¸ìƒe9ƤتWôÂL°ÂEÓ²CÜbßù«qÙ¿j|tó1¶Œ�v©Nm·ï¶b[ ¶c•>ó\ Ýø»@YuãvcçÄÓ%rž-¾Ó)) Œb8,9'a5ï„Ö9iGŠBÄŒ))¬¿›>~5¸¼í>„ç÷½ð�îÃï½Á]Ð"íÖš3èwû¿õú½Ç íýzÚg[¬›ËàØóV„™äY[Sžæìï%*¹^ôÓ¿�çÝëÞmx9¸»îÝ„÷ç�Ÿý¦«¤4.Õ�bÿ]RA›¸Ï.#EŸwÍÿü}½ô€ŽîÃcØÿö®Âûn�’,ñÈ“’g°àd¶_òUU·Ý/‡UMaYSJV¨ú³{Qá–­ä5ýÚˆ¾®í€gD×6¢¥6N‡°=§7ŠÅ8[Ð!‡çCCÉÍg<&vd*‰ EðOÚÏO%éE\Ÿ>8ß¿;‡…r Ÿ>ÔÕ©ó› N�ìS9[×]»*Ü«‰WïÁ*ãíæMÁIXŒÍmŽó­hœ`ÑŒ&xÓúdçÍÆÑÑöõbwÎ÷&¿Ží¿rä ÇZsô?$ƒw¬xœL³ÿ40000 components�<ö2­¦#~Á�â5.¨–´§(Q100644 config.yamlÞ×óÜhÐ$s¡¦&–Ñ*çrYƒZ¢xœ340031Q((M*.MÒ«LÌÍaH›•è¹õQä&n~¡-³ŽÝ-êòŸiQV\’X’Z\’_” QZâzæ‚vÑú{:-‡Ïœ˜øè æl!£°xœe�± Â@DûýŠ%½‘ (^kc™Ê~ñV<’Ü·ëiþ^ mgÞÌ0”Â…³‰=¥\Ù–†út§º½Ã“ I"Gƒ��<9@Œ4°C52V“Ì ‰¯“acZŒ:³ ˆe™( ~× n>U3{µYE,Ô?Ùíw‡ã?Ý’êS²_'ªjEv<¶™oáõCMo+x �OMå€xœk`ºÌ8Á^º 4©¸4‰«¸ 5ÙŠKA¡¤² ÕJ"81¶ñš ´ x]Î;Â0 à=§°ºêÚ qv“¸Å"u¢Øeàô8íÆçÿüÀÊjÊE&HXÛ™Ëå3b®/Û%Mp+2ó²54Wa%ĆS\éh;Å­{b #ËÒŸŠkÍ^ÝÑœã°ÿ~¹úüC�¤ZXìšR#Ug]ù²ÆQD‚ÏL~�µ�zhù?™1+…³C ®xœ340031Q(N.J,H-ÒsÉOÎN-JËÌIex{ûð…w.±GEfdçeyWN¸+üF‘%Q·Gxwˆû# Use cargo-chef for dependency caching FROM lukemathwalker/cargo-chef:latest-rust-1.89.0 AS chef WORKDIR /app FROM chef AS planner COPY apps/rust-auth . RUN cargo chef prepare --recipe-path recipe.json FROM chef AS builder COPY --from=planner /app/recipe.json recipe.json # Utilize buildkit cache mounts for cargo RUN --mount=type=cache,target=/usr/local/cargo/registry \ --mount=type=cache,target=/app/target \ cargo chef cook --release --recipe-path recipe.json # Build application COPY apps/rust-auth . RUN --mount=type=cache,target=/usr/local/cargo/registry \ --mount=type=cache,target=/app/target \ cargo build --release && \ cp target/release/rust-auth /app/rust-auth # Final runtime image FROM debian:bookworm-slim AS runtime RUN apt-get update && apt-get install -y --no-install-recommends \ ca-certificates \ curl \ libssl3 \ && rm -rf /var/lib/apt/lists/* # Add non-root user RUN groupadd -g 1001 appgroup && \ useradd -u 1001 -g appgroup -s /bin/sh appuser WORKDIR /app COPY --from=builder /app/rust-auth /app/rust-auth # Run as non-root USER appuser EXPOSE 3000 CMD ["./rust-auth"] /zïˆxœûÎqŽkB�®²‚g^qIbNŽ‚_~Jª^V±BfšB^jjJjŠBZ~‘BRifNŠBqrQfAIñä¯Lly@uYÅ“S™Õ'ȳe R‹6ÎHb䄲ô&Û0N.cÒ�‰è'èC9“w2m¶IÎ(ÊÏÍ,ÍUˆáR‚´ü¼’bݜ̤ԢĒÌü<á¼ü’|Ýäüœü"ÝÔÜü¬L Õ;°›lÊ¢)nb`iÈåì뢭¤“PŠå/FSç€Cxœ;ǵ˜CTYáÑ”†GSœJ3sRŠKÓS­&²*±CÅ'ª{Nb\Èê7ù!“Ìä?Œ “'0—†ê *Í+ÉÌMUÈÌMLO…j™œÅýãY¿|ü†�[´�€Aão¿_¯oïîw«o_oïþØm®·ú3e–K µ�•¡‚f<7Õ�ªœe<ìY3ª¼í ¸|¾~|¸¢Øü¥B/™Â"a²¢ö›'e°äy,ÙR7Ô^º�ßñÏPLÄ�ñ(JñÀ$Î@R¢œYb*”{¢é|ŠÉœVGhÖß·»ÇçÝÝÍn³~´€êEM˜ ƒÈYµà‘?ñ6…¦±Y˜Y'GV5<==,·O#N»�DF n/צGs¿~¶Žj¸ÇÊð£(:µqh^±²NÚ£î½GSH¾7C’žpÿš¿×_Å9£6 Þ*Îdm›ÅéÑ ÇñqmœÛœßkãиâ¼Q›wP´  Ítqz4oÕf�‘¯¿é‚²‹nœ~Á„í9QärÓéÞ•çÝÅ�‹¡B@/­DTP¨gÝl8p’;\Љe«Ñ)§§*‡X öè„‹D\•\•¶]5-·pHH¯†„R`üò\i’>Òv¦�;rJòˆÉR7SŒXù¾0•x´/¼¢ì´lÓ f(9qk‡Ó¢ÊAóÈX6Z•J‹Ìê�‚K÷í¦ß(K[LJ¡Ãk; ÂÆ´×Ú™I؉tHFí%4yÝØSŸzøÓî SüóuØ¢X6~çnÒzÿýÎ`A«ÜÒ õ¼•D3 ¨OÊ"2Ÿ*QJðÍ ¿P4Õšò·+-NW$tÔ›Dp¾vôöý¬¤Éÿù7ùéö” 1ø¤ olÒϰ ›~öLM;rFÆ“m¶m‚íª9¨ùqçÎ)s+h¶,çw2|•çÍaz+5Ä¥êFs‘§í%m»pé’¿² U–’ëŠn ±À†¤t¥W¤áJ™æmX ªÀ�vl¢©Ù|gpÓÐp/RÚÞæ´1ãé¿¿þÁ\•ÇŒ§ÝVi8&ˆû¯@áPæºE¥]ô›µ¢ë=Ȉ‹íbCC,%í7kK³ÖZ|íú·� F!KQ L+ï?©û&¥xœ340031QH,((Ö«LÌÍa¼"½ëo…Ò×õ\R9ÛÄë—]/ô¯1„(ÊÍLIÉI-O,J…ªÍZ4OCü¥ì»bÞ_ ¯®ê­Lf„ª-.Î�¨9)7OL<ô¯éÅW�¹Ì<µó?Û�-N¼\xœÅTKnƒ0Ýç#uA² ¡ŸE˪©T©ÝEÉ25SaÉ`d›F¨©ÔCô„=I0)PB7H‘XØ~ã7ó3Ž�É €’¹!¥K€ øþú´¬ ™�Íj ÓH&ÈS'ÍÌÁe¬:„T×ì&‚÷$µ™nQS£*0ÅyRÌy´�Á~Á½”¨çX(5ªXIž]ø`Ã4±\‘;3B‡ðþávšÔg6{Y�ï¶“¶ž S˜‘‚å깩AWǽ*6V“ñá€>–ZöišQŒIx Ú¡¢Ö%&“D¦>‹í_½傺>º’O8ù( ͱk$•§½>VаK=1gµ ªç„ë\Xæ&îš ,à£ú§Âÿ4S7â¬Õ4mpKÇÔš¸š\HŒP`Ê~«ºx|fêr%¬=ñá%Z,*2«%¼ ¼ætŽ• ¦³ÃÞw—^£sÇÊáØ\Š+¯Ý£Yul´ë °fýÊÙâ�oxœ;Ã}†y‚ÜÆwöŒ“ÍXø&/fIE‹ª»mx½TÍnÛ0 ¾÷)„í�m˜š¤]Ú!C/MW¬ÀÐIt@Q@±iG¨õ3InšÛbO¸')ÇŽm¬=.É!"?‘É�Z‡`§Œ)™¦l„OGÆ<$¥¾‘‚ÛÙëæ‹¤ÒA¦,¸âe �—Àòfù%Fè9}ðKHŒNý”�'Ç'£Ñ¨¹‰Î+�e Ër•%¤FX'8Bæ #Òž#sBÁèmÏŽ¹èp³µpm¼–YÖ¬œÙxp·Ëå¥,¸žÛAÎ�››B&|à17NæRæIéƒQ ðÖhUåMï¨)·|VáÄ„³A"ÃéŠÔ>a/©˜èâóõ�.éò¹3Û��0ÎøS&…³Ua’‡6v±+€¿\cspJzO¼öØ ”äìÍÛ÷(—Ä»6â1AžNàß*cb”E!5•÷Ï$7]wéܤÛóm@ݱ£ÉIÓJxŠ Hwý¢v5ñ¨“œ ¤9 ßµ«D«°G©M pUÁ·­ÎXçÀ˜” $ÉHɼ�J†æZ¾¶ xé+ÏaÊÆ-¯Jçq&•¦We†â©cT'©óÚ€ÝO øY‚­fŒG>NNOökQ•²^„ ð™`Mw�ž‹Q"Åñd�ËWíþñdÐXh0ݧ£ÉI®Z cÃA4½f~ÿÂûî!+ 6/J\0¿³Fβà2>Z”ÎFDM‘fÚq¤–’†°1î¡#£(¤ñÑéá¿ãáñQ[MKÚêÍÃÝš]ÒöjÚ5�ó«ù âW�{Ð^ùÜŠ°nrôéE0!öŒ‰sOm±zu?¼»;ýøªÕ¬½#—¡ïÜ7–ÇÁµ«ØÝAWa°™Ô®mÿ.fÃ'2“yíîŽcf”2šÍHíaà<Ñþ?eB­>œí´Õ"Ϊ ;ø úŽçS¿x��Aƒ0 ï}…?Ðäεÿ0a£Z„%FU~_@œƒok{½òhH݃È!ªxq¬¨šèY{½td¡Îjdx™lYM––7ÇÌ6s62šóv¨Ô„ÜàÛ¶«¯!ð‡á^âaÜ#“~ãùíÏkЂ¢Ô!_•s²£jxïÂrÌ‘NЉ½xm�±‚0D{¾â&•à¨cCe¡AÂ1œJ’¹Ôaøw“X@a•Ù{»wÙ9Z(*Ò¡í%¤–E?6b¡eš¤�Üóˆiä“õ.Œæàž'i4d„¨ LéÀ:ÃÜП†¢x1y\}ªGõX—$ùÇE ­i�.Ý@Õ¨Å�ÙpÚ@à,*êÛZ@ž¾ÉÃA„¿/©O‹Ó-êµ"Üôº¤Bw·Oo¼|,Ïå)%³%ûÜ Z3½x=Âÿ/nix/store/a1vm413z2gayp4dfj6fvcnsp880bx08g-apps-leptos-0.1.0•”ª£x340031Q0*-HI,IMÍ+Ó+Î`X¢û¿î[ú]‹¢ò‰5¸µOõB&ç¤&æéæå§¤êææ§”æ¤ë2ˆtºL™öðzrlÍ“uKk5ón_/Ç­h…Ð ÕůE”gÛ�¹[è´QÙ2íò*d ¥ºéÉE ×Dßþ)§ñÄöœš¨¦T¨¹b$÷�r' PHÏ,ÑÍÈÏÏ.fˆžË6o~ ïRîE!ÞjÜÇ…Œïä�375U(®ÌKÖ-.M‚9hbÃ{I…`×CÆwí¿uküœùÄðß%¨å�pÐMI-(Ù=�!­@I*õßS}Å5“SÝê;==ý…tn³3xU’ÁnÛ0 †ïz ÖÉ€tèlì\ä´íÚA±KײE;jÑ�ä Å¼=ûHÉY:$ú'i‹ÿ§ÕUÓZß´:Ô ¾Ðø5úô�Žˆ$í°K§v ôÌalFݽè#l<×yŒ Í HÜNÖ-a=ØTD‰S[^<|:’™Æ%�¦ÐÒ{|=w�bǵE76.ò8µÎvE�a ::aàÙÑpþ´ÁSG>ië1,xÓÁ—0é0`ºæñ¿Üíî¡xìF�c p™T¹ò.¤Ú –ôä †X+µßíÝ}ßVu#FVJÙà >õP­Ïé o�Û½Àî@PíÅëb½u˜]ìiòt‚K›”¿ÚŸUo•êùl£èXrÚ[0Ä5’``¢Öͺ”4›% °‚=Ù,HA[gýÑÉ ~¸o[­ñö¡ù]e‰on×Ù¼>"ÏÁÙê:çdºV$YÁöüÜüÒs^™÷ü5«3·‚w²s�:3ÏùŒrŠ\öž ¿ ½y·†Ç‹™2� ¶~Â|>ö)kãîç @’. øú[4…ó—)ÿÕò¨òòCœ ÿ½ðx òè<# .SYNOPSIS Clean all node_modules directories in the repository with optional cache and lockfile cleanup. .DESCRIPTION This script recursively finds and removes all 'node_modules' directories starting at the repo root. Optionally, it can also remove build caches and lockfiles, and run 'pnpm store prune'. .PARAMETER IncludeCache Also remove common cache/build output directories (e.g., .next, .turbo, .vite, node_modules/.cache, dist, build, coverage, out, storybook-static). .PARAMETER IncludeLock Also remove lock files (pnpm-lock.yaml, package-lock.json, yarn.lock) in the repo. .PARAMETER PruneStore After deletion, try to run 'pnpm store prune' if pnpm is installed. .PARAMETER Yes Proceed without interactive confirmation (non-interactive mode). .PARAMETER DryRun Show what would be removed without deleting anything. .EXAMPLE # Preview what will be removed ./scripts/clean-node-modules.ps1 -DryRun .EXAMPLE # Clean node_modules only, no prompt ./scripts/clean-node-modules.ps1 -Yes .EXAMPLE # Deep clean including caches and lockfiles, and prune pnpm store ./scripts/clean-node-modules.ps1 -IncludeCache -IncludeLock -PruneStore -Yes #> [CmdletBinding(SupportsShouldProcess=$true)] param( [switch] $IncludeCache, [switch] $IncludeLock, [switch] $PruneStore, [switch] $Yes, [switch] $DryRun ) $ErrorActionPreference = 'Stop' function Write-Section($text) { Write-Host "`n==== $text ====\n" -ForegroundColor Cyan } function Safe-RemoveDirectory { param( [Parameter(Mandatory=$true)][string] $Path, [switch] $Preview ) if (-not (Test-Path -LiteralPath $Path)) { return } if ($Preview) { Write-Host "[dir] $Path"; return } try { # Use cmd rmdir for better handling of read-only/long paths on Windows PowerShell 5.1 & cmd.exe /c "rmdir /s /q \"$Path\"" | Out-Null } catch { try { Remove-Item -LiteralPath $Path -Recurse -Force -ErrorAction Stop } catch { Write-Warning "Failed to remove directory: $Path -> $($_.Exception.Message)" } } } function Safe-RemoveFile { param( [Parameter(Mandatory=$true)][string] $Path, [switch] $Preview ) if (-not (Test-Path -LiteralPath $Path)) { return } if ($Preview) { Write-Host "[file] $Path"; return } try { Remove-Item -LiteralPath $Path -Force -ErrorAction Stop } catch { Write-Warning "Failed to remove file: $Path -> $($_.Exception.Message)" } } # Resolve repo root (this script lives in ./scripts) $RepoRoot = (Resolve-Path (Join-Path $PSScriptRoot '..')).Path Set-Location -LiteralPath $RepoRoot Write-Host "Repo root: $RepoRoot" -ForegroundColor DarkGray # Accumulators $DirsToDelete = New-Object System.Collections.Generic.List[string] $FilesToDelete = New-Object System.Collections.Generic.List[string] # 1) node_modules everywhere (including root) Write-Section 'Scanning node_modules directories' $nodeModulesDirs = Get-ChildItem -LiteralPath $RepoRoot -Directory -Recurse -Force -ErrorAction SilentlyContinue | Where-Object { $_.Name -eq 'node_modules' } # Ensure root node_modules is included if present $rootNM = Join-Path $RepoRoot 'node_modules' if (Test-Path -LiteralPath $rootNM) { $DirsToDelete.Add($rootNM) } foreach ($d in $nodeModulesDirs) { if (-not $DirsToDelete.Contains($d.FullName)) { $DirsToDelete.Add($d.FullName) } } Write-Host ("Found {0} node_modules directory(ies)" -f $DirsToDelete.Count) # 2) Optional caches/output folders if ($IncludeCache) { Write-Section 'Scanning cache/output directories' $cacheNames = @( '.next', '.turbo', '.vite', '.parcel-cache', '.cache', 'dist', 'build', 'coverage', 'out', 'storybook-static', '.wrangler' ) # node_modules/.cache is common; include it via name match too $allDirs = Get-ChildItem -LiteralPath $RepoRoot -Directory -Recurse -Force -ErrorAction SilentlyContinue foreach ($dir in $allDirs) { if ($cacheNames -contains $dir.Name) { if (-not $DirsToDelete.Contains($dir.FullName)) { $DirsToDelete.Add($dir.FullName) } } } Write-Host ("Found {0} cache/output directory(ies)" -f ($DirsToDelete | Where-Object { Test-Path $_ }).Count) } # 3) Optional lockfiles if ($IncludeLock) { Write-Section 'Scanning lock files' $lockGlobs = @('pnpm-lock.yaml', 'package-lock.json', 'yarn.lock') foreach ($glob in $lockGlobs) { $files = Get-ChildItem -LiteralPath $RepoRoot -Recurse -Force -File -Filter $glob -ErrorAction SilentlyContinue foreach ($f in $files) { if (-not $FilesToDelete.Contains($f.FullName)) { $FilesToDelete.Add($f.FullName) } } } Write-Host ("Found {0} lock file(s)" -f $FilesToDelete.Count) } # 4) Summary Write-Section 'Summary' Write-Host ("Directories to delete: {0}" -f $DirsToDelete.Count) Write-Host ("Files to delete: {0}" -f $FilesToDelete.Count) $preview = $DryRun -or (-not $Yes) if ($preview) { Write-Host "Preview mode (no deletions). Use -Yes to confirm, or pass -DryRun:$false to hide this list." -ForegroundColor Yellow foreach ($dir in $DirsToDelete) { Safe-RemoveDirectory -Path $dir -Preview } foreach ($fil in $FilesToDelete) { Safe-RemoveFile -Path $fil -Preview } if (-not $Yes) { Write-Host "\nRun again with -Yes to confirm deletion." -ForegroundColor Yellow } exit 0 } # 5) Deletion Write-Section 'Deleting directories' foreach ($dir in $DirsToDelete) { Safe-RemoveDirectory -Path $dir } if ($FilesToDelete.Count -gt 0) { Write-Section 'Deleting files' foreach ($fil in $FilesToDelete) { Safe-RemoveFile -Path $fil } } # 6) Optional pnpm store prune if ($PruneStore) { Write-Section 'Pruning pnpm store' $pnpm = Get-Command pnpm -ErrorAction SilentlyContinue if ($null -ne $pnpm) { try { & pnpm store prune } catch { Write-Warning "pnpm store prune failed: $($_.Exception.Message)" } } else { Write-Warning "pnpm not found on PATH; skipping 'pnpm store prune'." } } Write-Host "\nDone." -ForegroundColor Green Ò©Qº©xš eõ#!/usr/bin/env bash set -euo pipefail # Clean all node_modules directories with optional cache & lockfile cleanup. # Usage: # ./scripts/clean-node-modules.sh [--include-cache] [--include-lock] [--prune-store] [--yes] [--dry-run] INCLUDE_CACHE=false INCLUDE_LOCK=false PRUNE_STORE=false YES=false DRY_RUN=false for arg in "$@"; do case "$arg" in --include-cache) INCLUDE_CACHE=true ;; --include-lock) INCLUDE_LOCK=true ;; --prune-store) PRUNE_STORE=true ;; --yes) YES=true ;; --dry-run) DRY_RUN=true ;; *) echo "Unknown option: $arg"; exit 2 ;; esac done SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" preview() { if [[ "$DRY_RUN" == true || "$YES" == false ]]; then echo 1; else echo 0; fi } section() { echo -e "\n==== $* ====\n"; } DIRS_TO_DELETE=() FILES_TO_DELETE=() section "Scanning node_modules directories" while IFS= read -r -d '' d; do DIRS_TO_DELETE+=("$d"); done < <(find "$REPO_ROOT" -type d -name node_modules -print0) if [[ -d "$REPO_ROOT/node_modules" ]]; then DIRS_TO_DELETE+=("$REPO_ROOT/node_modules"); fi section "Summary so far" echo "Found ${#DIRS_TO_DELETE[@]} node_modules directories" if [[ "$INCLUDE_CACHE" == true ]]; then section "Scanning cache/output directories" while IFS= read -r -d '' d; do DIRS_TO_DELETE+=("$d"); done < <(find "$REPO_ROOT" -type d \( \ -name .next -o -name .turbo -o -name .vite -o -name .parcel-cache -o -name .cache -o \ -name dist -o -name build -o -name coverage -o -name out -o -name storybook-static -o -name .wrangler \ \) -print0) fi if [[ "$INCLUDE_LOCK" == true ]]; then section "Scanning lock files" while IFS= read -r -d '' f; do FILES_TO_DELETE+=("$f"); done < <(\ find "$REPO_ROOT" -type f \( -name pnpm-lock.yaml -o -name package-lock.json -o -name yarn.lock \) -print0) fi section "Summary" echo "Directories to delete: ${#DIRS_TO_DELETE[@]}" echo "Files to delete: ${#FILES_TO_DELETE[@]}" if [[ $(preview) -eq 1 ]]; then echo "Preview mode (no deletions). Re-run with --yes to confirm." for d in "${DIRS_TO_DELETE[@]}"; do echo "[dir] $d"; done for f in "${FILES_TO_DELETE[@]}"; do echo "[file] $f"; done exit 0 fi section "Deleting directories" for d in "${DIRS_TO_DELETE[@]}"; do rm -rf -- "$d" || true; done if [[ ${#FILES_TO_DELETE[@]} -gt 0 ]]; then section "Deleting files" for f in "${FILES_TO_DELETE[@]}"; do rm -f -- "$f" || true; done fi if [[ "$PRUNE_STORE" == true ]]; then section "Pruning pnpm store" if command -v pnpm >/dev/null 2>&1; then pnpm store prune || true; else echo "pnpm not found; skipping"; fi fi echo "Done." %7·°|x•UÛŠãF}×WTdƒlXIyžÅ¯­ñ˜xì`ksÁ–¶Ô¶:#wkÕ­�8™…}ÙÇr�@,y ù„|O~ û ©jI¶gßFà‹¤ºœ:uªºóQ¸2Ü0�9NF9g²*@'¥( lU *Oa"ÌUµ�‘’† ÉKXò�Ц<@or5ZöAìÙŽk gB·Þ•æLÆÁÛeŒfS0 RžsÃmÔ‚%·è¯x©…’:@ÿ%Y‰ýÎ}6„Ô†å9O�IüTV‘0ƒOî„ÉÀ«_4Aµ‡(TÁÇÑÜ€ÏmuJnÅ®*™ÁtÎb9¸Ló"cå�Iæ:Ÿ GŸ'Ñ‹ùð:Z zç/ý¬Ú„È +xé³B¸}ÇáI¦À}ÿî÷7°2¬4Bî€è€¤a‘èëbš \Ç¡»&–n÷ûùܼ֟vŸBªÀ«Ží?òrÏ|ß¿ûå/e<¹%\ -Ðm’Ö¦Ö¾3læ± Ø2f€•拼9ÖÆ³¼�s/†=3If›Te‰}€ÕÕP7¡¬P 4Ûr`EQ*–d�Slá)uÅ`#¡VJÔF"RÔF M°­È >ß E¡aTˆÁG$¢©±»D-öE.a*e7‡'ü$È;�é-ŽVrÖ´ ‚@_QzRl¢ö{‚w,>Ým¾XÁðy¼¸ÆÓÑp6ûªQõ¨$y%�î‘áABuox®îÎ`·òùõ¸äÈ(µ©ÅeC~-WÓÅ|5èöv7TåN‡¤«°{˜´“¶ý ÛP.ø~ÁvB"ƒà¿/XßÀ=¸_÷‘ööÜ0ä—Ç(2­×ß@‚+•�·®5­ jDú‚™¾ëõO-[XƒÿŠºìÂÍS"AZ#*¥®÷ß?ÞÂ\ ÅS!ÏvR(“<��·!¶â”®u–ëî2‘s(9KÁ/a:†x8�ñ0ŽŽ#E çQâKpku#ØÑ’u‹øoXÝŠ¢ Õö8F˜¡×¥øýz’Èž®˜éAƒ›þ©è@ô-C¹ò P2Gu×KÑ‘lHæ©âZzp땦Ùp:c¾=–~SÑ(i�œ§<­Û@ñ;° !² Û°[VIÞ Ë­ú~ûé¿~„KÛZõ�lê ï!f;üK\ÞÃ[�7Tô©æ³šžÏG‹ëëhC|Ál:�àY4[|ñ¢ùðÙ,:M Œ£Y£²Ïü�û_Ö/£GK=Ä®œ�uŽý{ cKJJm« R¤Å±_Íä¦õÝÆ�ôüá©)¤ÐOqé·,ÿü'ŠžØ³@ðôÜJͪÀLUÆ.9¾eU^»õþ JE½Lš#7—lƒZü_ßP¿ªx*Õÿ100755 setup-hooks.shcQuD‰""?jÝ£°’}ܨOÿש.ÑR»x[¤þ#!/usr/bin/env bash set -euo pipefail echo "=== Setting up Git hooks ===" REPO_ROOT=$(git rev-parse --show-toplevel) cat <’@jIIf^z±^Vq~Þä &µÉmL“ï3­äÑKÎOIM/J,ÈÐç°(¦à€xœ ßÿúú°qÓæ4!Ù˜DŒ½¸›Vܾ�Daâ“…õÿjÍ£xœ343000P(N.J,H-bð¹à"pÞŸá¾ÌÞ ‘´æ³ ‹ËÐì Tà]xœûÅö‹mÃ/&Ëm-g±2…øÛ?Øx±xÑ¿ðþöÉ|Ì9÷�²î€¡xœ[ɸ’q‚±ˆç²Æ±Ø_òÞuÑŒ íæoÿúL:2Ñ= ¯ EPxœÛø‡qB´ˆÞžY÷LöKO~á·(žñP�­°¨ï­‰ù¾È¡ Ü​?xœ{Êõ”kB»¹±�¡aŠåÆúg,@x¡à€#xœ ßÿúú°qNÿ‘øÊx£3zçZ›Õ ҥ•“…õ¡S£xœ343000P(N.J,H-b8ëgõNaIW’—šå™ù•ž¯oÕ~à]xœ ßÿúú°ú0±ÆéVÆû)¡¤†¬]­à;<Ý“l °u xœ[ɸ’q‚±ÈµKZÊ$žD¬3ÉêŸã þzÉwæ‰îIÓ‰ óRxœÛø‡qB´ÈE¥ ·]«2vººß�é{ée©öÄ|_Í* ´á€�Axœ{Êõ”kB%›™©eš©åÆúg,<€à€$xœ ßÿúú°q¢µ<Š’ˆÏÒ=Ã�}b–æä¦~¢“…õ¬£xœ343000P(N.J,H-b`ÕÉù·c‘XZSÍ?Ãõ±ís’˜œxÑ™ ·à\xœûÅö‹mÃ/&‘³Âæ‰jGÚ¥ÙŽ´}ÎQÖ¹Gåßd>æî} xœ[ɸ’q‚±H~H¼Æ !íûÕתãï*ì˜zõÕ٣ݓ¾*PxœÛø‡qB´Èí•ÚM ·­ÏñMÝκËìYra؃Oó}ÕÌ�â€�?xœ{Êõ”kB{ª©I²¥©åÆúg,CXàà€#xœ ßÿúú°qX³‚-ë¢ù~EpÎ*å¸=%ËØ§“…õùy£xœ343…âä¢Ä‚Ô"©� Õgéäö¸ žl*]®°KNDz *é€~xœ9Æÿúú°q…§ ôÅyƒ%³4êNµ¸ŠÈ“…uç^Ðëe^Ñàbè¨qzùÛÕŸ`“lV>£xœ343…âä¢Ä‚Ô"†¦ Rfi·È.™"½ÎfƒÆ|Çø {Mxœáÿ©©�3⬅ã¤ÒÄ1ж½êÿÙaX¹‘Gbß8xœÛø‡qB´ˆüÂe.»¶ØÞU¸)•*û#ï—¾´ÚÄ|_Êê ‒xœ{Êõ”kB{ª…‘i²©éÆúg,CÙà�HxœûÅö‹mÃ/&‘†ußÊ”•ŠŸ>Iðdâ¼Ýw:øØd>æø¼î€¨sxœ[ɸ’q‚±H‹Ç¾4ïwZ;v—î¾*œ¶kU”J£õD÷$É+ Hî€�?1ßÌï <–+xœ{Êõ”kB{r²qª…¥áÆúg,Dþà€$xœûÅö‹mC!“Cër†_ŽV6«n–7yå·UrG׉ɭL_ëšà€QxœûÅö‹mC!“ˆ•ܘ5-ûFóƸïZú®l£öäV¦¯äí&£xœ343…âä¢Ä‚Ô"†0­[™o扬zè¡9³Áó—ò�#|׆ ÖàYxœ ßÿúú°ú¡3kÀ‡z~ÙãÞúÚ•ljÒ¯ë�“lÎ4xœ[ɸ’q‚±Èêiey 2=:kÜÛµ£–ßÄêçD÷$¿ï ‚gxœÛø‡qB´ÈÊû—í�,¯>ü†ÓNâ•ëÍ0gæ‰ù¾Ú ®â€•Vxœ{Êõ”kB»™I’ER’ÑÆúg,C™à€%xœûÅö‹mC!“ÈŠÏû³{Ïjˆ¤U[�<“Ûu˜mr+ÓWõ££xœ343000P(N.J,H-b�–Œ:ü�¿ÓxÞDÃgv/(ôxÍïÏ3 rà[xœûÅö‹mÃ/&‘¯‹§qD?K=ó!ó§y/c”ñïœÉ|Ì9 ŠÈxœ[ɸ’q‚±HtÏ~›ïÁå’÷ûölÜÖ“yY/•köD÷$Ín ²î€¡exœÛø‡qB´È¥Cª©/ ë÷È2XÿJñÓÛ6{ÞÄ|_È .‗Txœ{Êõ”kB»¹¥�¡©¥ùÆúg,?Ä~è€~xœ8Çÿúú�6aÏÇ9×>¹tÈä[:QKó7†ÿwŸ¢5R“|Ä9ðcå�xœ»Äþ‹m‚†’‰(è%ç$–¦¤2$ž?nyÝNtgIý‰'ÑV�Þ6ú)þ5¬~Ÿò·s¾j+òì¤Ü�ã‹ö©†f&& zé™%™éyùE© u’L&ˆxMÒ‹ê{{kò³¨ÛYYUª89{x†¸:‡„¹êå¦0˜w¿Éû|â鑹åïV-[ÞäË>kr#£•ÈôïâR³ËÞ(PœÈÔ{3ic\àäóŒâ"ÏB.­1}Ý_þb¯uŒ¸q�óOO—É¿�-ÿ®ß«ô¡åß¹Z‡œ¸›³Ô˜ÚWlƒ:,ÈÕÑÅl_cã©–ÉR?9Ôc×M^wÊMºålÜä4¦“ŽÉMÏî͹sõfx}ç¦í¯>¶~9[ �̼´¢DkÙ7~k•WÛl>·ý<Ç?+Â'ó1kNN`Öñþ¯ÿyIU¿õÔ¾ØÛ¿6§ÂÚ»]•ë‚ónxœûÁøƒqÂ›ê µd;-y~éLûÃ^póÇF¢ Iî…(xœ»Åx‹qÂ4‘öŒÜ¡Egrî‡%¼(8q‚Es×ÄUÑV “ï‚6xœûÅö‹mÂ*‘íst|D¬7n¬â•hßàÍím¬Ä'·qß&ÎÏ ðë€xœûÁøƒq‘&ž¯í¦sÖ¹ŸÙhà»>R0,öV’¸T wîxœ»Åx‹qÂ4‘»k;ÜW ç‹ÿ²øíÕÂW–>#ÈuñÄU×° ¯ê~xœ:Åÿúú°mÖ²½†21èÈvB«„ÊÓ¼.-Ñ`³�yg-Æõàˆ58,#à¬ãåe…,“l?Öé•�üxœ�VAlEUJíÒm’T4´ôc‡`»Þ]ÛqÇE‘œÔIM“ÆÝu�Añx=±·]{Í캩+‹Dœ‘ š\�*GEæH'N ¸¢\nœfw¯LÅÊ«�?óÿ›?óÞŸñ£õoßxÿÃí‡û»;ìXk*¡ÿñƒ„‘fª5 é\óͺ˜qü®õþ} ‹.«F�Ûß}‡ùïï Œó0C[$zÝÄõ2ȹ4$ËgM¼¥šXÌ£ºl"åΤ¦aò¨iVÅ~¤lz&Áê“»ª‚!�¾×¬‰2F«ÒÊ»_?1ÏðØdtÕ3>Tñø.C®"•��áèÓ†ë¸Ëj‰ ¢bƒ>ð ô±÷,ýÅ3B{ž¡?{Fé÷^9á¥ßxNÓï¼'YÛÇÞ§·¡Íµ!ê¥ 18‰YGf°2„ˆ�´�œn˜‚å›Ë0ÞÒî]?Ë ÃmC¯oá’©³U„‘Š^�…Ùβ ƒÞÀl+5\Ã&Ùn…¡AtÖ¬â¦ÑMÆá“eb#æ[ ,+Dm˜"#Ñîrˆ„¨?’L—Z`û´vÌ5Ã`Ó U·Ó†áÕõ<,nëfÆjka�·P¥‚Iw1v2†BP;›6lŒf©¦—›n8ùíïìöž£xGè¸÷ ûNÒ=ïp¦Íq~¿«ŽÁÉ]­¸E‚jxK'wX{¾©jeÈëº6�Ì=ï%örôk†þ™E çýÉ3Ö%Õ×}ÏôÈ´Ôéiµ :kÍg‰fº4ˆ$½i²_†›MLù*ÁX¸mˆN¨m¢Z„�!UÛRY ,È2ÄÃð:“ ª—­­Uªˆ˜ÃŒ\Óȱ–ªhØèL{� z…V4fB,ž’ º>úâ•h4.Dg…D¢?l9�˯æ > 5L½ÁÇ68ª6ªN|2Á¦…Ø,ÝÝ¢�N­Kkr~#½–¿VèÕ ¤¦"‘ˆ‹˜Y~MΦ ÎxÔP!�ÌÆ\)“^ÈìUñ¬T •ŒPÿØ\¢‡m{æ¥tf1{x~® ù¯nˆæÆ^Øî…/ðsm‹.CALÿÙ+“%ÎÍë O‘2W³òáœîw¢Õ±$ýx,uÁr6Ìs66UMKùgff:?Œ�êüzöÓ¡Î{Ï–††íMÁR&/Ê™<Ý;7î±»:Çÿ|êRnåd¸ùqÛ‰^ô›î*JÑk VÖ¢« "0…2E0±êu­E—˜bçÝçÿ8îu::;¾/‡ºmze"æsš\E5�¡Ö؇¯�O©²S$Ðu{0qiŽóÃZ£ŒX…!MƒÞaØ�=šŽÏ\ÓíF “ ¦ŸOLŸ-‹Ì¨!µÌUØ‘S…e‰ê“ úÛ¤¸}D,¯”ˆ8Çãªi ä·Ã²;D±+_Çõ°„­G^�Ò¹ }ôòK>›Ö‚}x:Þ‰©™Y×Ûº®nœîf¶FêØ°ÈòõÆrK…€{L;ÑÓñ©X°¿úFvE*HGf Ÿ¦öüïŠ8XŸ]Jíó µï VÙ)NêH믂Ãáƒ<2Û§ï-÷ÉY¸nLÖu«%ëO*©šj¶8ŽgÇ}ν?­+UUŒP(é» •´ Ìïþ�»ìâ,"v›óî½[¤¿‡æiõòµýƒÙäë{‰7xœeUÏoEVÚÒ6›F%%4*ê«S�íÚÛØIiR¡ ×± ¥i,;ÐCųë‰=Ä;kfÖKæ7¤Šé©ˆ „„„Ä #.pቀCO\��àTqàÍì®”‘,¿�}¿æÍ÷}û˽/îÞ4èM}wì¹*‡Ì¥Ò²zÙjóxb¡ë$ ‘zð&íÂmæ"•ê³éõëô åÏœRßLÏàïÔZô0G:-]AÚT¤Ó¸—”Çóë�Mín<þðÄË<©‡'?X¿¹»I¥$ 7;räq§°]…Ëp‹Õ@Pâ�Þ”)²uÁðÚç VÊÀ;¾ïvh‡Ê H¡~Ÿ}ñ\¥ÃæQ¨²:u‰3¬“¶P_ŸS¯Í+›“ㇾKæóLœˆƒ‰ˆnÊ€<±SöƒG/·Iá%¨jõ`vóLÆÔˆ‚dà :ø{öòñ™hDv×k©µ¹Vó9;·ºd¯æS‰]+N¹U)Üy½ôv¹º“ðá zØ–�Ì--Ù×Öì\.g¿’SÌ]´VWìå5{u9•Píô9µwöÞQôT?ž]V[ϯ¨O2³ª9Ÿ?ЉÔÃùë_=™ŸÒïO^ø64¾^p¦ž1½«ÙóZƒüùŽ&ðm 0’Û„µ¤KZj J°xäˆÏÕ_Î^¬gÀç­.8ׂʶÏëŒ7@†À|žøó؉èðƒû/??¨[©ü¥È¶,ÀxÏÿ¬ ·‰sKÆŽ�RÔ¿©•Êââ"¼±½]†déý€ NZ“ ™‡ŒÀ¶ tŸ¤¬¡^ãþ>s�ð:Þt´i’àÑZêô™ù¾“@âY FÚí¬lAëYNƒúq -é›þ:œ¹úbëLP7Àƒ;]Üçaœ àÄ£¶eé>C¨®‡PMF�ÖÈHYæá=4Cˆ÷ ÆÛÂ?D J €G–Li^ć¸ŽÏ© %¼ªx¶Ð$Ú?Ä[„ò I‚!|åˆ$qÈ8ÚõLdpzݶÚ�»¤*ir2¥¤¯ôuÓ;O3óUG\¹q}%ŸÏ� ¬×z¡\Ù+ß.K›¥;Û;¦Ár‹¸¦@tuiiéê®5†�6ðÆ›�ˆ.ä:DÈN“6KgµuùZX¤º±^**a‰ˆéa�e¬0Ù•^Õb¥P.U@K×x‚ GÊëÖ¸=|ˆ#Ê:²vöF¯Q)ã)‡Òõ?ï‘s;žAï©©g3W‘µ'ûµZ-ÄOq6¼*(“@C×(vd£˜mR·I8“Úo¡h�r[½l¼FÖ„­…kHÃ…^Äœþ<þøÓ˜aZ‚¢¼ÊåµPÞ0¼‘Fü6ødŽ8l—r#lÏnž6Ø!ƒ”¹Ld?âÈmâz ½8–*”К^ϘnÑáD�L¬yÂQ|'|†`÷WK¸¢ ÷�Àsˆ°‘öFØ2øà¢ 'fó@*Ì?,ÿgHá wä|Q4MS¬Ì„¬!¾ÿù|Ö�“¯àÐw9ø >;g�Ž“/άY¡È"{~õ =ùâRoæz$Ÿ\^Nv¤‰t@Ï0=8 °¸'ürw-©Zö\¬×· F&üqqëÈ‹CÊ 1Ξã=êv$ç+X­¿ø &nÛ‘žÐQÂS¬È’nI«¸8Ò)”å Â4´8â�[ `!HÝÍ×cD'�žYépž¬q¶Òƒ'㆙ٟ–3RÏ¿EØ„ž=É}S–ó hsÌt꫽ŠPïzóÔÌ6#oºÈÞÉsñbУÞa6+KذF·;Ak�tp;°†u€5ò!ûžýH.¼Í %žE’,ò?’õÊñ#iX¬Ð:x7gë{a+]‚W=M‚óÑÄ6{Ø7¡”°6–•¼l¬»Shú¸Y~ÌZ~D%E}j`AËn™oYvë2ÁiI”TJæ%/Ý!ÉW�e�=ly$�Þæ EÚhpžžXüqv}%QÓ£¡Ìd�§ƒŸÏ3QÔpCAÚɺƒGFhÐÚÚ÷設5…¦¨!=°O#ŽQž;¬?úÞ¸ ¦Ÿš—M!ïµMV­ic‚]üjûšï¡.xœûÅö‹m‚™ˆ’FÐA±jƒ«[Ù^ÜþqBm;k”÷F/fÔq ͪxœJµÿ100644 settings.json­ä^’Ú\Äß2Téµg jp‹Éø40000 skills *È÷·í±m½2”ò«æçË eXù egƒÊTxœk`ºÅ8Qí ²ïâ¢DxœûÅvƒm‚ÆD¯6‘Éå‚ Ó;Ív©òš�ç¨{àî”[ÒÆ'Ó˜ò��é‚©+xœ[ÎÞɾ‘ë ÓäûL+yô’óSRÓ‹ 2ô¹zþ àUxœ ßÿØØ°Ø»¾ƒ�hëöŠGÛ¶õÓ¬�éV¬“ìlìЬxœL³ÿ40000 components¬«Iv¥  I³*¯Œœ»g100644 config.yamlÞ×óÜhÐ$s¡¦&–Ñ*çrê8¢xœ340031Q((M*.MÒ«LÌÍaP X·dÛS–—m�—òŸM_•ö½Ý¢¬¸$±$µ¸$¿(¢´ÄõÌí¢õ÷tZ8<ÿ8ž91ñÑFh#ˆ²xU�±Â0 D÷|E~ ­Z1e- ¨ìnADãX‰‰¿')/–ïtïd sÓ>‡JÎ@¾6®I-,ô€V< ÎJöÎ’C�,¬f˜�A )¬V’ââ(驈ü¢ŸX#pì5Xƒ÷l¦­'µùÚ³¤¬¾¼’.çì—I°ÄÌ+¢jšuº®[Ý}⺵ôK ¬ýéø(�UÓÇoGN}i€!xœûĸ†qBüÄ _iÖà‚gxœ»ÁvƒmÃ&—KüÉ™ý¼Q 3¦ßÝ켈±dŸÞL PÈÌK+JdØí—ï�&þøÓÛ.ó[]·-¾Øsrò¦ZŸ7î�²7xœ[À¸€q‚‹ÈšéïÌ)·/)k½Xû¹”¯+ùËÿ‰Ö½© x340031QrutñuÕËMaÈÞaw#g——éÔèY’çŒÔ“âcL €@!9?· ¿8•!uóú¯“ò=æ?2Ùû-`«JXÝí�)‰E ¿—GT½ØÌ!³5½É€‘œ¯ÍN’‹pÊøÛÌͲC�ýÐÉ “_:ÚŽǸhÆ.�=¥Üjˆ[Sš“­ƒlUÓäå¤òÒ$ôÈí'rÜÂ’“Dt4}òêyq™Þ¼”@BóæéþoÀ"40000 infra‡åidv,Iþô$ƒ8 ŒÙ#=W“ìluûM?ë±xœûÁøƒq‘üèÃkשœùPd~Ãa¡¦[ýO Êó¬î°xœ»Åx‹q‚¤Hhÿž#"ÜZ§æ îà+åcÔÕsÜ2Qw-£Ñ vº€xœåMoÇõ®_ñ²¢CÙÐ’þ€ ”+%–%‚”ÜiB,w‡äTËÝíÌ.%ÆV‘CÚSÛH. Z¤—¶ÇziþNþ@óúÞì,÷“”d § >˜3ï½yß3ëYsÖ‚}¸þö}û‚ }xÝnmù^k àÒ׿‰HýNWd >©q×Ës ÉYB¢7·¦LÖ?Uðá2`2F0Áöç�ËB樕±°<{–ÝŸ[ÜÃ’kmA +œeÖëÜ›«ùàA=]jLy8‹ÆÍ×MGIk:ŠÕÆrîn†V`æ˜ä4‰©c¥‡KäÃFn·¶¡/Ø‚y!Ì#7ä('ħÍqMÂDøs@=zÜ›‚äcyÌ�¤»Ü²}ÏŽ„`ž½$�¦Â�‚–Æ6�Ä5õÀ\“{f ü©`-0±\ɶ¶&æ\Jî{JH,¤[ ˜EŠ,û‚L¢¶~å�`L?Ö 2&M4:DãÈ #ÓµB&ÃØ„|Žl†æœ{QHTž;}Ù-œrØ;;:ÿ(ÞÉbPƒ·Yû±Lùð€M,îne6™=óÁÐTN™ã'ãÅ×ׯ:<Á&9,ü½ \ά8þVàx>�OÀüŒÚ›¢ã˜×|J‘”¬ü£rGyCåNÆöjÿ9„3æe˜HØþ᯿×>N).1X‚�ç‡0‰\wIéh§‘`Nú.³$SŠ/p¿»òæÝ•¯îªÒ’ç¨aäù¸âa.&'<«­ù…Øü¦Ù�rVÒ{­À…jÐ&wFBZ {†ÁÏ>\ �‹æ[JLÕ`�s?}úèg»‡‡%â)«c.<ÿÒÍ|Ê,ãÛpŽzBîVµäŠÊÆc`baΔ|$ûuDzÇ¢:GMÉBR9íŸ Û;¦,Âw_)Ķa>JWûXEÛÍp4‰ý{âŽYë^�`Br¶Ir\†‚Ûá2ü’-U¢EÆÚK&ïoåU‘¸(±ñÉ‹OÑ‘b �e_dta¬ŒT+$—÷߇u{͸ØS;áKV¨ZEª!ã60ù6°€:Y^í Ìë °’ëV‘7ÊéãÇï¾ùûÓ)�{T yx�•r±‘ACØÕ+–�FηÁ½põ{²Ž,¤¹Î€·wÒnÜ€ë#0�Ù¢ÁÑüÔk¹d[Ó ,)±ð:¦ îïjOvø",Äm» ±ç0¶�¦) øàƒz÷ô ž‹ërjÎîÚ‰URz9n)~ºžÄœC)3x,¤–‚òEZT+(�àž ˜‚fŒlâ|ˆ�ã¢éaFƒÇ¾ÿˆRfsöL¼­Š¬‰Nñ% —ØÖ ß㟓k¤}JÁ tÂL™úÓêtœ�îy<ä–EèM„ApĨXlî“0޾àä:³0ÄF«ÙÔ¥ #¯‰©<@I—–geÿoÒþ´@órñ ÕW%ä©«GT]V[©7Ëá ¼�cÚÉžYÞ-<áØ‡Á˜aŠdÈ>:PˆJÈáì�:§¯ú§Ã®Ê ö‘K#ÍPXlÂ/¨É‡üNlѪ [XAÆÙ¥ªt; GÙž:Šs©ê"é‚<\ŒoU&¥…þµ,ù<&ÎÚÚF‚Q#_Dêí�v÷µÌŸLPQÔýáÌ„=N^ÀœxÚ“‹ O“Á×_â¼’ñáV™e]Ó4FQÇÙhˆÝÇ"œùtlÈuÒ¬tPÛ)œ€5GÌêŸå½½ñà—äéµúz±nR/ÄM UÃZ��ç˜RKÐ4ù¢@ÔJá‹‹¼ì7ô÷Á'`<¸_b§–_@0ž?¯ ¤e—–ß+ûFáˆÚN¾tç·IµW–˜ÊõŒ[|¯u]¨¤ÎôÇiO@oªôÔŽÂe‡«Š�rHjÊúœ8ë|\xùÖ<þ[9îYœAçD=5ÜèÁ:Ë®÷`ã³ZE&nnˆËTý…CîªÿÍ"U„y1ÐWW@ºÇ§{©üÉòÎvÜÌé]M©RFœ�§Û‰¯•‡ìjò» ë ¹QÈí²%5ôN{7'©z²`.J‰kCÂ*Û[�wký�ÔÚ>Š ÙocçøÀ*-o\¨°îíëøæ<]8©Ðz “‹/ˆ‡š^jTÀÒùÛóìõgÞ_Pçzh%céÅ(5Ù8ê&;É1 F}ïV-PR+:¯öÛFžNáÁÍó£o}“3ßñ,sÍY%›¥w)a¹T×(8‘„–ë’�ytvҜӥA)6K"å`ݦá'Î(Ó/`EŠb;e!5?b&ìy€r�ýÐÄgÕ —g•;T®Dk<,w iŸ�§VÙ&ÄGcͧ‚¾>ró'Ö²? ‘oŽÂŠ&à¼?:8Þ#’¦c ‚1§šf¦/p0òdÜ”2³_$�#éFÀZøÜ� îºÔÊÆyD2±àv¡ð­õ�¿ûö èc~õÅ|Õ§ÁþÐ�VD+FÁÛZ¢ÔƒUãÎZ¾A¥%e–’Uå˜ýõß¡ÅZåêMJ ¢¯³p½2ôõÅþiç%öð�ãÞ¨û‹~wÐ{Õ=9Û;n3Ï»ÌÉ¡ôÏQ-ÃóN§;¶ã—€ìö6 X(–�Y¢€lþD½ª(ó£<fR,†žäd-ýŒf…ôcÑ;ÄצL_ä]‚"Ày@yÁcxRa’X#¤ŒtMÿ§ù¤Â0šj™”šÌ[˜ªÈѽ—’kó÷—ß*K€zºaNœÊŠœ”C/§×Ò}ý�³.n3ÀiF¾ýµ<•Šºf¢‘RK_Ø=­ é2ì3žn.Ï%§Ö³pV*ÞÃqX5o/v¨:(þÈe”#i—¶&TmŸ$â”»µêŠ�ýY<ÿü:èv‚qˆ\ôʲ2âÒ@·=tEâºþeƒosÓñ}×ñ/Õ¥¨ÂÇ W¿éö½kÇÈý-ÆQ,ÈŽö÷ ô´¢¾ú7üÜâar[®ƒ©Hº$ȶ¶éã[if@ÙH½ãbefIJ±“;] ãeúK½Uؽ˜§›F4&&—ÛŠÿ’Ï?Ô¿ ÊÅ>N˜Kúpçj ;s­%2…­úýŽþ,d;sÀ]? ÉâÞüiHzóÇ!)´þŠ"‹^|eÏîÝö�=‹³î¥= Sxk¿ùq}»‚­l³ðìa<dŠxÚˆ¤ÏJI>R¶T¡“ãJõÏVž¦"t�’ȹE™TüâšáúEú=Çuú¬+ª\̨=;ï‡U]Õþúç òî—xœë Xå±Á\ls•ØrÆÉÓ &ßãØÜ)ñ™u³¾¼"»ƒ $î½Xxœ[þÈ{;'¯sbrFªLþÃé;9‘Sjs2W¡”pBBBnjQnbf WzQbA†‚OÐäxµ‚É×Õô'ÏRWgNÍK™¨ x340031Qpq ðñ�ôuõ ÑËMa`-Ub&uUfÕþЇ…?ØðZx,7„(LLIÑÍK-×M,(©Œï�Å$y›»ÀÝÅAÚß/´e÷DqA PHL)bp~½èeÅ)•¬ ¢ò~J7ØWÞÙiÇ‘MÎÏKËLgX,Þ¿9oÑÉlñù KOv.3È(:QP\Z�ZT�_žZTÌÀ?ñ¢hÛ/+M5ѳVÇgj¤öi“ŒA×e€7xœÛÁX8¡…,l�¦>xœÛ'ÿH|Cëæ$Î6#’ªxœ340031QrutñuÕËMaÐ|ô!Ä�w×:Õ¶²Økµ_dª¦Tf›($ççä§2iÜíºÅöÕ‹ûý™S’Λšç@T¤ä'g§1¿P‰ºq½sÓÚiÎÿÒÔk="~nh�(()JLMËÌfxÑìk´'ä�*Äh›Cúë+c ¼ÕO_6¢á'�ƒxœm‘ÏJ#AƃQAAÖ‹ µä¤èûA² '1a÷²à´Ý•Lã¤{èîq"ž½õ\BìyaOûy/ž­‘ÁÄ?E_ú«¯~Õ|}»ñ÷Ë÷`Ç ã.*F)ÌU N*zÇ�pZÞ�2-ïý$ØήÓòš`ZXÉÞZÐ}‘¡s|ø:QÖ&·n�å.™¢�$C%WCþ1øá×›+=ÇœäÀ”áwåxÆáZ ä° ª=4’#œií¬3,«Í¹!šVaÇaØ1<‘(êž—0z�APÚ�À,ÕuSò@®ˆ…^á¶]/Ž£É¿† ¼j~õÃÅ5ÿüns}_h~Nf®G™¶¿B€½H50¬]‹íYêÔöWÍ­ïŸÚæÂýó&Ê u×¼ �~öO{݃“n²ºô'‡a?AÈŒ1SGãä@ræ�hU•KÓ2&�…˜YÌë�'Q†£~Kú“Zå©ÎEtŽE N-%�”Ï�!‰Z伂BÊ �» š<-o,<ƒ·Øææ‚xœ; úZhƒ.#ã”ÉñŒ:›?1ö3O^À*0ù3kùæ2¶-Œ† iùE ‰Å©‰E•‰y‰z¹•z™) ‰y)¨âå©I ‰Í«8Ęr_ƒ¤xœ340031Q(N.J,H-Ò«ÌÍaP©üÄYýµeÞno¶´µ\qo¸–O›cU–‘X”šV5+¾ WŠÕ±ÈÖL¸ñ^Íf«Í�ŠÝ ªJŠSÓ2³ÁÊZ9Þ»Lµ¼þÝLÍ…éî¥A!, XA#$13§89¨!ÅU›¥7s '$$ä¦å&f¦p¥%­ö š¯V0ùºšþäYêêÌ©y)“§h¸L>¥u R䀂®Sxœ�UÝn5V¢6F UEo¢ ŽHU’Ufv³ ùS[¶¡ *J” B\@Ç;ãÙ1™±§¶§Û•‚Vˆk„Ä<¯€”àžkž^Áñx&I@ìÕØ>çów¾óïoü½þËŸ3o�TøâY¦Âò�oé¸Ð¦Ý†÷aÍßÚö»°c„ÝÍÔ32}¾0{4ÛbéDs@ϽOš@9˜ûøú4ÏuG1ܵ1ï5 ü�‘‹öha’ Læ€\Yþ4—¿á`Ëùk·Þ #¸„„;w@äÙùõk+³ÙñÞÃÁ“Ï�WØgpÌ"®!”B°Ðp)`9Pvk§ÓIeHÓDj³³qws;[Zµ·â(}úÅÉ“Á^ÿxï$¨ p š�#¬>T̔ߑÛåú›ßNÛíJ“Ý£X¾`½²ÓnÁ�ê„\PnŽIHÕH‚*„�!¤ÝÞ« t(®Ø×C¸32,„͆ˆMŸ5Ç• Ÿ() ’±ë!b� WƒÔKKKƒ‡2,2& µªâ¹®æLàé‰1y#â´Rq½»½Ö‰d¨Œ®kŒéhÄÔKñMxïåð]=á«ø/Æ{c]ñ„¾Œl/¦­ÅÛ{ƒÇ\X·Ž¹I øˆ ¦SÜõÐ1å�­Å[x]»Ý¯Äï§<Ï'˜ÓغüµÕýÆå€ž'¤Ç”’Ê“Â+DFM˜°ÈË©1L¡*Kõ,ä,ä1_m²õ¦ësX]…�à=„1UÖFºü«µØ:B'ÎTùCëÖ´óU§‘£QgàG2¯cT¬˜ž2xZHÃô*¬u»�+ËzÌ#“¬BÏÓ9 fGØÄU0ŠòÔªÊ,£úŠqf.(7ç¦ !ÒÜŠ¬ÇŠ~SòUŠ€—VªôéW•ªöÒ ïšNd5œA¯Û[ß \ µ¡C,ÑH™† E–%&�@̨)æftCf!¢ÿüçùÎÜôÊø�"8ÜÅï<’Òê•ÊÅ©“˜?¿˜2H¨ˆðXiZÍyN'©¤‘¿*.ãžcÛ ©ØyDQ‘Ú+u¯Œ,o.l|­XŒ³%U3~Àž£þ8˜ûŒF('ö —û±’ìæ9Á.šK:–x!¸»­«æ({[Ê3nÊý…ûï^¾�«Ô.~¹guõüû…�™/›‰Ç×ë5æs0:¬,¾‡ 6èûþü÷·Ç³åá�›óÛ~o}ËßÚ8Ïn|53…º@ƒ©É!k>ôñBämfﯼ\ñ¸'hƤçÃ.ÖŠ•R á‡.†™ŒŠ”9ç�¸qKú»>¾ç#®‘„M±ç\ÄŠv*A5›Ö¸þ$K²î°©}ÊN™Š9BRÓ¤DÕf“p�]Þ‰¢,æ§ daÜà\Œ£C0. Mƒ‡šOsíO¨½{Ãaô»¬8Zµ)&)†�±T§Öƒºfá ž¢¼…NõM—^—u#+#–§r:TÀ¾„X ÷""y AKÝ\±q``àû™ùæ³=m>‚—v½sÏ>çví]>ZÖLÑ•ýÈ×Óý¥ªg_Vn×{8DFRæƒF565ȉ°7åêš$*8pc(ã…�@h£f)t‹�F£‡—]8–,™átò¿u¥6“pÉtf�‚Ç2F·ìÙÌ2B»Z¬×`(UD� Ä(#†ŽäfÛ+씉åšùÈ®íkaíWgŠg'™h’êÜ�ôû}BÒûÒvnïû-[ œƒÀ pj(h™(†.ªÁ‘š'b¾TØ�$v„A¶ê¢|`ßÊ�ô´Ò^¨ƒ³Pípõç8é´ú¾¸@¾j�=l�Cxœ»¢~B}à ÆÍ_)Ùg¡cxœ›©ñ@}Ãalà�oxœ ßÿØØ°Ø}©ÑÑfö;ßõGBÔ±iºèuÈ“ìlEãªxœ340031QrutñuÕËMaÐ|ô!Ä�w×:Õ¶²Økµ_dª¦Tf›($ççä§2|ˆÚµrgáõ›loŸßr“¸øÂaÙkˆŠ”üäìÔ"†â*Q7®wnZ;Íù_šz­GÄÏ -%E‰©i™Ù /š}�ö„Re˜msH}eL�·è9 ¤xœ340031Q(N.J,H-Ò«ÌÍaèë_ðç ë™/ziK"‰³\yݪ,#±(5¬jV|A¯«c‘­™p㽚ÍV›»AU•%¦¦efƒ•µr¼w™jyý»™š ÓÝKy¢¦´SþŸ,}á‘xœk`ýÍ2¡„-'±$µ¸dc=#<Oà�Lxœ ßÿØØ°Ø“ˆÆÚœ<ÖüÆoJ>wº8¥³ñ“ìlÂ(ªxœ340031QrutñuÕËMaÐ|ô!Ä�w×:Õ¶²Økµ_dª¦Tf›($ççä§2\Õ>i¨õ<¾¥¥¸ÈMÂ$¾[_X΢"%?9;µˆ¡ø…JÔ�ë�›ÖNsþ—¦^ëñsC DAIQbjZf6Ëf_£=!‡T&DÛÒ__Sà­­f4d¤xœ340031Q(N.J,H-Ò«ÌÍa8ZðüÂk�ý‡öH{Ùðˆ°Vȯê5„*ËH,JM«š_Ð+ÅêXdk&Üx¯f³ÕæGÅnPU%E‰©i™Ù`e­ï]¦Z^ÿn¦æÂt÷Rž¨éíz *Øà�žwxœ›Ç}’eB»…��‘yjêÄzÉÉŒy“}˜f$ù‡¸úÄ»Fø…¸Åû‡øÄ»ú¹ø{ú…Øf””Xéëç—äèæ¦–e&ë&%&g§æ¥X™šs)€�®Ø�`× 0Og×x?G_WÛâä¢Ä‚Ô"ÝÄ‚ÌÉ¡¬žBÇ(Lã€xœµŽÁJÃ@†©B|™[*M­…f©‚!/âMD¦ÛÙfé6»ÌN< =z5Ê÷ñ$¦}¿Ã üðü߇?GŸÙñ¬ŠûÛ¼™›÷ÈT xiv©ÓùÎÉ Ï�{½"6ÖÏ5c @(OŒdì ´¯Œ]ÖŒb}5¬ auh;6H<ïØ5.IÁ²ÔÜéÉ|”efªû×Ítæ Eéßtüï¤fó±) �”º$½RÚ ž“»‡<@¢kví¿0í-E‚�×èJE]¥ÙhØY’—�ÁVBü†NÁ8�{«]“¯EÁdŸ0 ŸZŠ Æ»$ ²¼bë F“¸íõ¾¶½ƒâ­ˆ�ªêö*xœûÁøƒqÂSáW}û¾ÞXmuÝ$Ô4sÞS›¬Èà Ÿæõ)xœ6ÉÿÚÚ�éz¤º„H�ìwYëjÿ»©*{ ‘-AÄ>HØ®;ó›å¶=/±ËfAýŒ‘‚X½Á¶ê‚ôHxœÛÆ>™�+±  X?=·\Ÿkƒ,Ód=&íÉÍLj\ZZúzÉ9‰¥)©›—2 2� Yk‚ÌWxœëxºAŽiòyÖcý„â‚©yxœm�ÁJÃ@†ÉA0{ò†ö „l‹xŃh±'O²f'fe³»ÌNl‹•¾ˆ/!¾ˆ/$˜¤¥'a`þa†ïŸ™ß£ŸãÓb~s÷8ƒm�o`�c¨=µŠ�12T•û:Y$Û¡5ƒé:W‹ÛaRUäcnƒ)Æ‘P€”ÎK$ò$½“�ë�UƒZÅŒä„Ø™ŒÀë�_å5ÂÒpsBfƒ$Ò°W ·rI†&YVfÅ;Çœã*�} É»¼ÕùZµ6_·öc"ĸùÈ¿ **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** Migrate the monorepo to moonrepo for centralized task orchestration, caching, and consistent dependency management across all 7 apps. **Architecture:** moonrepo sits as a task orchestration layer above the existing Nix build system. `.moon/tasks/` holds shared task definitions (TypeScript and Rust). Each app gets a `moon.yml` with tags and inter-project dependencies. Nix, Docker Compose, git submodules, and infra remain untouched. **Tech Stack:** moonrepo CLI, Node 22, Bun, TypeScript 5+, Cargo (Rust) --- ### Task 1: Install moonrepo CLI and scaffold .moon/ directory **Files:** - Create: `.moon/workspace.yml` - Create: `.moon/toolchain.yml` - Create: `.moon/tasks/` (directory) - [ ] **Step 1: Install moonrepo CLI via curl** ```bash curl -fsSL https://moonrepo.dev/install/moon.sh | bash ``` - [ ] **Step 2: Verify installation** Run: `moon --version` Expected: prints version number (e.g., `moon 1.x.x`) - [ ] **Step 3: Create .moon/ scaffold directories** ```bash mkdir -p .moon/tasks ``` - [ ] **Step 4: Commit** ```bash git add .moon/ git commit -m "chore: scaffold .moon/ directory for moonrepo" ``` --- ### Task 2: Configure workspace.yml **Files:** - Create: `.moon/workspace.yml` - [ ] **Step 1: Write .moon/workspace.yml** ```yaml # https://moonrepo.dev/docs/config/workspace $schema: "https://moonrepo.dev/schemas/workspace.json" projects: - "apps/*" vcs: manager: "git" defaultBranch: "main" runner: implicitDeps: # TypeScript apps: lint depends on build (for typecheck path) - "typescript-build.build" cacheTtl: 604800 ``` - [ ] **Step 2: Validate config structure** Run: `moon check` Expected: no errors (will warn about missing project configs — expected) - [ ] **Step 3: Commit** ```bash git add .moon/workspace.yml git commit -m "chore: configure moonrepo workspace with project glob" ``` --- ### Task 3: Configure toolchain.yml **Files:** - Create: `.moon/toolchain.yml` - [ ] **Step 1: Write .moon/toolchain.yml** ```yaml # https://moonrepo.dev/docs/config/toolchain $schema: "https://moonrepo.dev/schemas/toolchain.json" node: version: "22.11.0" packageManager: "bun" bun: version: "1.3.11" typescript: syncProjectReferences: true createMissingConfig: false routeOutDirToCache: false ``` - [ ] **Step 2: Commit** ```bash git add .moon/toolchain.yml git commit -m "chore: configure moonrepo toolchain (Node 22, Bun 1.3)" ``` --- ### Task 4: Create shared TypeScript task definitions **Files:** - Create: `.moon/tasks/typescript-build.yml` - Create: `.moon/tasks/typescript-lint.yml` - Create: `.moon/tasks/typescript-test.yml` - [ ] **Step 1: Write .moon/tasks/typescript-build.yml** ```yaml # https://moonrepo.dev/docs/config/tasks $schema: "https://moonrepo.dev/schemas/tasks.json" tasks: build: command: "bun run build" inputs: - "src/**/*" - "tsconfig.json" - "package.json" outputs: - ".next" - "dist" - ".output" options: cache: true dev: command: "bun run dev" local: true options: persistent: true ``` - [ ] **Step 2: Write .moon/tasks/typescript-lint.yml** ```yaml # https://moonrepo.dev/docs/config/tasks $schema: "https://moonrepo.dev/schemas/tasks.json" tasks: lint: command: "bun run lint" inputs: - "src/**/*" - "eslint.config.mjs" - "tsconfig.json" options: cache: false typecheck: command: "bun run check-types" inputs: - "src/**/*" - "tsconfig.json" options: cache: false ``` - [ ] **Step 3: Write .moon/tasks/typescript-test.yml** ```yaml # https://moonrepo.dev/docs/config/tasks $schema: "https://moonrepo.dev/schemas/tasks.json" tasks: test: command: "bun test" inputs: - "src/**/*" - "test/**/*" - "tests/**/*" - "vitest.config.ts" options: cache: false e2e: command: "noop" local: true options: cache: false ``` - [ ] **Step 4: Commit** ```bash git add .moon/tasks/typescript-build.yml .moon/tasks/typescript-lint.yml .moon/tasks/typescript-test.yml git commit -m "chore: add shared TypeScript task definitions" ``` --- ### Task 5: Create shared Rust task definitions **Files:** - Create: `.moon/tasks/rust-build.yml` - Create: `.moon/tasks/rust-test.yml` - Create: `.moon/tasks/rust-lint.yml` - [ ] **Step 1: Write .moon/tasks/rust-build.yml** ```yaml # https://moonrepo.dev/docs/config/tasks $schema: "https://moonrepo.dev/schemas/tasks.json" tasks: build: command: "cargo build --release" platform: system inputs: - "src/**/*" - "Cargo.toml" - "Cargo.lock" - "build.rs" outputs: - "target/release/*" options: cache: true envFile: false dev: command: "cargo run" platform: system local: true options: persistent: true envFile: false ``` - [ ] **Step 2: Write .moon/tasks/rust-test.yml** ```yaml # https://moonrepo.dev/docs/config/tasks $schema: "https://moonrepo.dev/schemas/tasks.json" tasks: test: command: "cargo test" platform: system inputs: - "src/**/*" - "Cargo.toml" - "Cargo.lock" - "tests/**/*" options: cache: false envFile: false ``` - [ ] **Step 3: Write .moon/tasks/rust-lint.yml** ```yaml # https://moonrepo.dev/docs/config/tasks $schema: "https://moonrepo.dev/schemas/tasks.json" tasks: lint: command: "cargo clippy -- -D warnings" platform: system inputs: - "src/**/*" - "Cargo.toml" options: cache: false envFile: false fmt-check: command: "cargo fmt --check" platform: system inputs: - "src/**/*" options: cache: false envFile: false ``` - [ ] **Step 4: Commit** ```bash git add .moon/tasks/rust-build.yml .moon/tasks/rust-test.yml .moon/tasks/rust-lint.yml git commit -m "chore: add shared Rust task definitions" ``` --- ### Task 6: Create per-app moon.yml for TypeScript apps **Files:** - Create: `apps/nextjs/moon.yml` - Create: `apps/elysia/moon.yml` - Create: `apps/solidjs/moon.yml` - [ ] **Step 1: Write apps/nextjs/moon.yml** ```yaml # https://moonrepo.dev/docs/config/project $schema: "https://moonrepo.dev/schemas/project.json" type: "application" language: "typescript" platform: "node" tags: - "lang:typescript" - "type:frontend" dependsOn: - id: "rust-auth" - id: "elysia" ``` - [ ] **Step 2: Write apps/elysia/moon.yml** ```yaml # https://moonrepo.dev/docs/config/project $schema: "https://moonrepo.dev/schemas/project.json" type: "application" language: "typescript" platform: "bun" tags: - "lang:typescript" - "type:backend" ``` - [ ] **Step 3: Write apps/solidjs/moon.yml** ```yaml # https://moonrepo.dev/docs/config/project $schema: "https://moonrepo.dev/schemas/project.json" type: "application" language: "typescript" platform: "bun" tags: - "lang:typescript" - "type:frontend" dependsOn: - id: "elysia" - id: "rust-auth" ``` - [ ] **Step 4: Commit** ```bash git add apps/nextjs/moon.yml apps/elysia/moon.yml apps/solidjs/moon.yml git commit -m "chore: add moon.yml for TypeScript apps (nextjs, elysia, solidjs)" ``` --- ### Task 7: Create per-app moon.yml for Rust apps **Files:** - Create: `apps/rust/moon.yml` - Create: `apps/rust-auth/moon.yml` - Create: `apps/leptos/moon.yml` - [ ] **Step 1: Write apps/rust/moon.yml** ```yaml # https://moonrepo.dev/docs/config/project $schema: "https://moonrepo.dev/schemas/project.json" type: "application" language: "rust" platform: "system" tags: - "lang:rust" - "type:backend" fileGroups: sources: - "src/**/*.rs" - "Cargo.toml" - "Cargo.lock" - "build.rs" - "rustfmt.toml" ``` - [ ] **Step 2: Write apps/rust-auth/moon.yml** ```yaml # https://moonrepo.dev/docs/config/project $schema: "https://moonrepo.dev/schemas/project.json" type: "application" language: "rust" platform: "system" tags: - "lang:rust" - "type:backend" fileGroups: sources: - "src/**/*.rs" - "Cargo.toml" - "Cargo.lock" ``` - [ ] **Step 3: Write apps/leptos/moon.yml** ```yaml # https://moonrepo.dev/docs/config/project $schema: "https://moonrepo.dev/schemas/project.json" type: "application" language: "rust" platform: "system" tags: - "lang:rust" - "type:frontend" dependsOn: - id: "rust" fileGroups: sources: - "src/**/*.rs" - "Cargo.toml" - "Cargo.lock" - "Trunk.toml" - "rust-toolchain.toml" ``` - [ ] **Step 4: Commit** ```bash git add apps/rust/moon.yml apps/rust-auth/moon.yml apps/leptos/moon.yml git commit -m "chore: add moon.yml for Rust apps (rust, rust-auth, leptos)" ``` --- ### Task 8: Create moon.yml for 9router **Files:** - Create: `apps/9router/moon.yml` - [ ] **Step 1: Write apps/9router/moon.yml** ```yaml # https://moonrepo.dev/docs/config/project $schema: "https://moonrepo.dev/schemas/project.json" type: "application" language: "unknown" platform: "system" tags: - "type:router" fileGroups: sources: - "src/**/*" - "next.config.mjs" - "package.json" ``` - [ ] **Step 2: Commit** ```bash git add apps/9router/moon.yml git commit -m "chore: add moon.yml for 9router" ``` --- ### Task 9: Update flake.nix — add moon CLI to devShell **Files:** - Modify: `flake.nix` - [ ] **Step 1: Add moon to nativeBuildInputs in flake.nix** Find the `devShells.default` block in `flake.nix`. Add `moon` to `nativeBuildInputs`: ``` devShells.default = pkgs.mkShell { name = "ultimate-asepharyana-dev"; nativeBuildInputs = with pkgs; [ rustToolchain bun nodejs_22 pkg-config openssl trunk wasm-bindgen-cli binaryen process-compose mysql84 redis minio-client gh git moon # <-- add this line ]; # ... shellHook unchanged }; ``` - [ ] **Step 2: Verify Nix can still evaluate the flake** Run: `nix flake check --no-build 2>&1 | head -20` Expected: no evaluation errors - [ ] **Step 3: Commit** ```bash git add flake.nix git commit -m "chore: add moon CLI to Nix devShell" ``` --- ### Task 10: Update .gitignore **Files:** - Modify: `.gitignore` - [ ] **Step 1: Add moonrepo cache entries to .gitignore** Append to `.gitignore`: ```gitignore # moonrepo .moon/cache .~moon ``` - [ ] **Step 2: Commit** ```bash git add .gitignore git commit -m "chore: add moonrepo cache entries to .gitignore" ``` --- ### Task 11: Validate installation with moon check **Files:** (none — validation only) - [ ] **Step 1: Run moon check** ```bash moon check ``` Expected: `OK` or zero errors. If warnings about unresolved project IDs appear, verify that `apps/*` glob in `workspace.yml` matches all project directories. - [ ] **Step 2: Run moon query projects** ```bash moon query projects ``` Expected: lists all 7 projects with their tags: nextjs, elysia, solidjs, rust, rust-auth, leptos, 9router - [ ] **Step 3: Verify tag queries work** ```bash moon query projects --tag lang:typescript ``` Expected: nextjs, elysia, solidjs ```bash moon query projects --tag lang:rust ``` Expected: rust, rust-auth, leptos - [ ] **Step 4: Commit (if any fixes were needed)** No commit needed if check passes clean. --- ### Task 12: Test — moon run build on TypeScript apps **Files:** (none — test only) - [ ] **Step 1: Build nextjs** ```bash moon run nextjs:build ``` Expected: `next build` runs successfully, outputs to `.next/` - [ ] **Step 2: Build elysia** ```bash moon run elysia:build ``` Expected: `bun build` runs successfully, outputs to `dist/` - [ ] **Step 3: Build solidjs** ```bash moon run solidjs:build ``` Expected: `vinxi build` runs successfully, outputs to `.output/` - [ ] **Step 4: Verify caching on second build (nextjs)** ```bash moon run nextjs:build ``` Expected: `Cached` — no rebuild, uses moonrepo cache --- ### Task 13: Test — moon run lint and test **Files:** (none — test only) - [ ] **Step 1: Run lint across TypeScript apps** ```bash moon run :lint ``` Expected: all apps with a `lint` task run it. Note failures as they exist pre-migration (not caused by moonrepo). - [ ] **Step 2: Run tests across TypeScript apps** ```bash moon run :test ``` Expected: all apps with a `test` task run it. - [ ] **Step 3: Run tag-scoped commands** ```bash moon run --tag lang:typescript :build ``` Expected: builds nextjs, elysia, solidjs only (not Rust apps). --- ### Task 14: Final commit and documentation **Files:** - Modify: `.gitignore` (if any final updates) - [ ] **Step 1: Final moon check** ```bash moon check ``` Expected: clean, no errors. - [ ] **Step 2: Commit any remaining changes** ```bash git status ``` If nothing outstanding, move on. - [ ] **Step 3: Verify the full workspace is clean** ```bash git status ``` Expected: working tree clean. (ŠûºéxšFe¹# PostgreSQL Migration Implementation Plan > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** Migrate elysia (Drizzle ORM + MySQL) and rust (SeaORM + MySQL) apps to PostgreSQL via direct cutover. **Architecture:** Export MySQL data, convert schema to PostgreSQL format, import into target PostgreSQL instance, update app drivers and connection strings, deploy and validate. **Tech Stack:** MySQL (source), PostgreSQL (target), Drizzle ORM (elysia), SeaORM (rust), pgloader or manual conversion for schema migration. --- ## File Structure ### Elysia App Changes - `apps/elysia/src/db/lib/database.ts` — Replace mysql2 driver with postgres driver - `apps/elysia/src/db/lib/schema.ts` — Replace mysqlTable with pgTable, update column types - `apps/elysia/package.json` — Replace mysql2 with pg dependency - `.env` or config file — Update DATABASE_URL to PostgreSQL connection string ### Rust App Changes - `apps/rust/Cargo.toml` — Replace sqlx-mysql feature with sqlx-postgres - `apps/rust/src/infra/db_setup.rs` — Update DbBackend::MySql to DbBackend::Postgres, adjust SQL syntax - Config/environment — Update DATABASE_URL to PostgreSQL connection string ### Migration Artifacts - `mysql_backup.sql` — MySQL dump (created during migration, not committed) - `converted.sql` — PostgreSQL-compatible dump (created during migration, not committed) --- ## Task Breakdown ### Task 1: Backup MySQL and Export Schema **Files:** - Create: `mysql_backup.sql` (temporary, not committed) - [ ] **Step 1: Export MySQL database** ```bash cd /mnt/code/bp3/ultimate-asepharyana.tech mysqldump -u -p -h > mysql_backup.sql ``` Expected: File created with full schema + data. Verify file size > 1MB (contains data). -[]**Step 2: Verify backup integrity** ```bash # Check row counts in backup grep "INSERT INTO" mysql_backup.sql | wc -l ``` Expected: Multiple INSERT statements present. Note row counts for later validation. - [ ] **Step 3: Document backup location** Store `mysql_backup.sql` in safe location (not in git). This is rollback insurance. --- ### Task 2: Convert MySQL Schema to PostgreSQL **Files:** - Create: `converted.sql` (temporary, not committed) - [ ] **Step 1: Install pgloader (if not present)** ```bash # macOS brew install pgloader # Linux (Ubuntu/Debian) sudo apt-get install pgloader # Or use Docker docker run --rm -v $(pwd):/data pgloader/pgloader pgloader /data/mysql_backup.sql postgresql://asephs:hunterz@100.108.1.124:5432/hub ``` - [ ] **Step 2: Convert MySQL dump to PostgreSQL** ```bash pgloader mysql_backup.sql postgresql://asephs:hunterz@100.108.1.124:5432/hub ``` Or manually convert if pgloader unavailable: - Replace `AUTO_INCREMENT` with `SERIAL` or `BIGSERIAL` - Replace `DATETIME` with `TIMESTAMP` - Replace backticks with double quotes - Update index syntax for PostgreSQL Expected: Conversion completes without errors. Check for warnings about type conversions. - [ ] **Step 3: Verify conversion output** ```bash # If using pgloader, it creates converted.sql automatically # If manual, save converted schema to file cat converted.sql | head -50 ``` Expected: PostgreSQL-compatible SQL syntax (no backticks, SERIAL types, TIMESTAMP). --- ### Task 3: Test PostgreSQL Import **Files:** - Target: PostgreSQL instance at `postgresql://asephs:hunterz@100.108.1.124:5432/hub` - [ ] **Step 1: Connect to target PostgreSQL** ```bash psql postgresql://asephs:hunterz@100.108.1.124:5432/hub ``` Expected: Connected to PostgreSQL. Prompt shows `hub=#`. - [ ] **Step 2: Import converted schema** ```bash psql postgresql://asephs:hunterz@100.108.1.124:5432/hub < converted.sql ``` Expected: Import completes. Check for errors (should be none). - [ ] **Step 3: Validate table creation** ```bash psql postgresql://asephs:hunterz@100.108.1.124:5432/hub -c "\dt" ``` Expected: All tables listed (User, Account, Session, Role, Permission, UserRole, ImageCache, etc.). - []**Step 4: Validate row counts** ```bash psql postgresql://asephs:hunterz@100.108.1.124:5432/hub -c "SELECT COUNT(*) FROM \"User\";" psql postgresql://asephs:hunterz@100.108.1.124:5432/hub -c "SELECT COUNT(*) FROM \"Account\";" ``` Expected: Row counts match MySQL backup (from Task 1, Step 2). - [ ] **Step 5: Validate indexes** ```bash psql postgresql://asephs:hunterz@100.108.1.124:5432/hub -c "\di" ``` Expected: All indexes present (email_idx, username_idx, userId_idx, sessionToken_idx, etc.). - [ ] **Step 6: Validate foreign keys** ```bash psql postgresql://asephs:hunterz@100.108.1.124:5432/hub -c "SELECT constraint_name, table_name FROM information_schema.table_constraints WHERE constraint_type = 'FOREIGN KEY';" ``` Expected: Foreign key constraints listed (User→Account, User→Session, etc.). --- ### Task 4: Update Elysia Database Driver **Files:** - Modify: `apps/elysia/src/db/lib/database.ts` - Modify: `apps/elysia/src/db/lib/schema.ts` - Modify: `apps/elysia/package.json` - [ ] **Step 1: Update package.json dependencies** Replace mysql2 with pg: ```json { "dependencies": { "drizzle-orm": "^0.45.2", "pg": "^8.11.0", "elysia": "^1.4.28" }, "devDependencies": { "drizzle-kit": "^0.31.10" } } ``` Run: `cd apps/elysia && bun install` Expected: pg installed, mysql2 removed from node_modules. - [ ] **Step 2: Update database.ts driver** Replace entire file: ```typescript import type { PostgresJsDatabase } from 'drizzle-orm/postgres-js' import { drizzle } from 'drizzle-orm/postgres-js' import postgres from 'postgres' import * as schema from './schema' export type Database = PostgresJsDatabase let dbInstance: Database | null = null let sqlInstance: ReturnType | null = null export function initializeDb(databaseUrl: string): Database { if (dbInstance) { return dbInstance } sqlInstance = postgres(databaseUrl) dbInstance = drizzle(sqlInstance, { schema, mode: 'default' }) return dbInstance } export function getDb(): Database { if (!dbInstance) { throw new Error('Database not initialized. Call initializeDb first.') } return dbInstance } export async function closeDb() { if (sqlInstance) { await sqlInstance.end() sqlInstance = null dbInstance = null } } ``` Expected: File updated. No syntax errors. - [ ] **Step 3: Update schema.ts imports** Replace: ```typescript import { index, int, mysqlTable, primaryKey, text, timestamp, varchar, } from 'drizzle-orm/mysql-core' ``` With: ```typescript import { index, integer, pgTable, primaryKey, text, timestamp, varchar, } from 'drizzle-orm/postgres-core' ``` - [ ] **Step 4: Update schema.ts table definitions** Replace all `mysqlTable` with `pgTable` and `int` with `integer`: ```typescript // Before export const users = mysqlTable( 'User', { id: varchar('id', { length: 255 }).primaryKey(), name: varchar('name', { length: 255 }), // ... }, // ... ) // After export const users = pgTable( 'User', { id: varchar('id', { length: 255 }).primaryKey(), name: varchar('name', { length: 255 }), // ... }, // ... ) ``` Do this for all tables: users, accounts, sessions, roles, permissions, userRoles, and any others. Expected: All `mysqlTable` → `pgTable`, all `int` → `integer`. - [ ] **Step 5: Update environment variable** Set DATABASE_URL in `.env` or deployment config: ```bash DATABASE_URL=postgresql://asephs:hunterz@100.108.1.124:5432/hub ``` Expected: Environment variable set and accessible to elysia app. - [ ] **Step 6: Test elysia connection** ```bash cd apps/elysia bun run src/index.ts ``` Expected: App starts without connection errors. Check logs for "Database initialized" or similar. - [ ] **Step 7: Commit elysia changes** ```bash cd /mnt/code/bp3/ultimate-asepharyana.tech git add apps/elysia/src/db/lib/database.ts apps/elysia/src/db/lib/schema.ts apps/elysia/package.json git commit -m "feat(elysia): migrate database driver from MySQL to PostgreSQL" ``` Expected: Commit created with message. --- ### Task 5: Update Rust Database Driver **Files:** - Modify: `apps/rust/Cargo.toml` - Modify: `apps/rust/src/infra/db_setup.rs` - [ ] **Step 1: Update Cargo.toml features** Replace: ```toml sea-orm = { version = "1.1.19", features = ["sqlx-mysql", "runtime-tokio-rustls", "macros", "with-chrono", "with-uuid"] } ``` With: ```toml sea-orm = { version = "1.1.19", features = ["sqlx-postgres", "runtime-tokio-rustls", "macros", "with-chrono", "with-uuid"] } ``` Expected: Cargo.toml updated. Feature changed from sqlx-mysql to sqlx-postgres. - [ ] **Step 2: Update db_setup.rs backend check** Replace: ```rust match backend { DbBackend::MySql => { // MySQL-specific logic } _ => { info!("ℹï¸� Skipping schema init for non-MySQL backend"); } } ``` With: ```rust match backend { DbBackend::Postgres => { // PostgreSQL-specific logic let tables = vec![( "ImageCache", schema .create_table_from_entity(image_cache::Entity) .if_not_exists() .to_owned(), )]; for (name, stmt) in tables { match db.execute(backend.build(&stmt)).await { Ok(_) => info!(" ✓ Table '{}' checked/created", name), Err(e) => { error!(" [!] Failed to create table '{}': {}", name, e); return Err(e); } } } // PostgreSQL index creation (different syntax) let index_sql = "CREATE INDEX IF NOT EXISTS idx_image_cache_cdn_url ON \"ImageCache\" (cdn_url)"; match db.execute(Statement::from_string(backend, index_sql)).await { Ok(_) => info!(" ✓ Index 'idx_image_cache_cdn_url' ensured"), Err(e) => { let err_str = e.to_string(); // PostgreSQL duplicate index error if err_str.contains("already exists") { info!(" ✓ Index 'idx_image_cache_cdn_url' already exists"); } else { error!(" [!] Failed to create index on ImageCache: {}", e); } } } info!("✅ Database schema initialization complete."); } _ => { info!("ℹï¸� Skipping schema init for non-PostgreSQL backend"); } } ``` Expected: db_setup.rs updated with PostgreSQL backend handling. - [ ] **Step 3: Update environment variable** Set DATABASE_URL in `.env` or deployment config: ```bash DATABASE_URL=postgresql://asephs:hunterz@100.108.1.124:5432/hub ``` Expected: Environment variable set and accessible to rust app. - [ ] **Step 4: Rebuild rust app** ```bash cd apps/rust cargo build --release ``` Expected: Build completes without errors. Compilation uses sqlx-postgres feature. - [ ] **Step 5: Test rust connection** ```bash cd apps/rust cargo run ``` Expected: App starts without connection errors. Check logs for "Database schema initialization complete" or similar. - [ ] **Step 6: Commit rust changes** ```bash cd /mnt/code/bp3/ultimate-asepharyana.tech git add apps/rust/Cargo.toml apps/rust/src/infra/db_setup.rs git commit -m "feat(rust): migrate database driver from MySQL to PostgreSQL" ``` Expected: Commit created with message. --- ### Task 6: Smoke Tests - Elysia App **Files:** - Test: Manual testing via HTTP requests or app UI - [ ] **Step 1: Start elysia app** ```bash cd apps/elysia bun run src/index.ts ``` Expected: App running on configured port (check logs for port). - [ ] **Step 2: Test user login** ```bash curl -X POST http://localhost:3000/auth/login \ -H "Content-Type: application/json" \ -d '{"email":"test@example.com","password":"password"}' ``` Expected: Response 200 or 401 (auth error is OK, connection error is not). -[]**Step 3: Test user creation (if endpoint exists)** ```bash curl -X POST http://localhost:3000/users \ -H "Content-Type: application/json" \ -d '{"name":"Test User","email":"newuser@example.com"}' ``` Expected: Response 200/201 or 400 (validation error is OK). - [ ] **Step 4: Test session retrieval** ```bash curl -X GET http://localhost:3000/sessions \ -H "Authorization: Bearer " ``` Expected: Response 200 with session data or 401 (auth error is OK). - [ ] **Step 5: Check database logs** ```bash # In elysia app logs, verify queries are executing against PostgreSQL # Look for connection strings or query logs showing PostgreSQL ``` Expected: Logs show PostgreSQL queries (not MySQL). --- ### Task 7: Smoke Tests - Rust App **Files:** - Test: Manual testing via HTTP requests or app UI - [ ] **Step 1: Start rust app** ```bash cd apps/rust cargo run --release ``` Expected: App running on configured port (check logs for port). - [ ] **Step 2: Test image cache endpoint (if exists)** ```bash curl -X GET http://localhost:8000/api/cache/status ``` Expected: Response 200 with cache status or 404 (endpoint may not exist). - [ ] **Step 3: Test scraping/CDN endpoint** ```bash curl -X GET http://localhost:8000/api/health ``` Expected: Response 200 with health status. - [ ] **Step 4: Check database logs** ```bash # In rust app logs, verify queries are executing against PostgreSQL # Look for connection strings or query logs showing PostgreSQL ``` Expected: Logs show PostgreSQL queries (not MySQL). --- ### Task 8: Data Integrity Validation **Files:** - Test: PostgreSQL queries - [] **Step 1: Verify user count** ```bash psql postgresql://asephs:hunterz@100.108.1.124:5432/hub -c "SELECT COUNT(*) as user_count FROM \"User\";" ``` Expected: Count matches MySQL backup count (from Task 1, Step 2). - [ ] **Step 2: Verify account count** ```bash psql postgresql://asephs:hunterz@100.108.1.124:5432/hub -c "SELECT COUNT(*) as account_count FROM \"Account\";" ``` Expected: Count matches MySQL backup. - [ ] **Step 3: Verify session count** ```bash psql postgresql://asephs:hunterz@100.108.1.124:5432/hub -c "SELECT COUNT(*) as session_count FROM \"Session\";" ``` Expected: Count matches MySQL backup. - [] **Step 4: Verify no orphaned foreign keys** ```bash psql postgresql://asephs:hunterz@100.108.1.124:5432/hub -c " SELECT a.id FROM \"Account\" a LEFT JOIN \"User\" u ON a.user_id = u.id WHERE u.id IS NULL; " ``` Expected: No rows returned (no orphaned accounts). - [ ] **Step 5: Verify role/permission relationships** ```bash psql postgresql://asephs:hunterz@100.108.1.124:5432/hub -c "SELECT COUNT(*) as role_count FROM \"Role\";" psql postgresql://asephs:hunterz@100.108.1.124:5432/hub -c "SELECT COUNT(*) as permission_count FROM \"Permission\";" ``` Expected: Counts match MySQL backup. --- ### Task 9: Performance Baseline **Files:** - Test: Query performance comparison - [ ] **Step 1: Benchmark user query on PostgreSQL** ```bash psql postgresql://asephs:hunterz@100.108.1.124:5432/hub -c "EXPLAIN ANALYZE SELECT * FROM \"User\" WHERE email = 'test@example.com';" ``` Expected: Query plan shows index usage (Seq Scan or Index Scan). Note execution time. - [ ] **Step 2: Benchmark account query on PostgreSQL** ```bash psql postgresql://asephs:hunterz@100.108.1.124:5432/hub -c "EXPLAIN ANALYZE SELECT * FROM \"Account\" WHERE user_id = 'user-123';" ``` Expected: Query plan shows index usage. Note execution time. - [ ] **Step 3: Compare with MySQL baseline (if available)** If MySQL is still running, run same queries and compare execution times. Expected: PostgreSQL performance similar or better than MySQL. --- ### Task 10: Cleanup and Documentation **Files:** - Create: `MIGRATION_LOG.md` (optional, for documentation) - [ ] **Step 1: Remove temporary files** ```bash rm mysql_backup.sql converted.sql ``` Expected: Temporary migration files deleted. - [ ] **Step 2: Document migration completion** Create `MIGRATION_LOG.md`: ```markdown # PostgreSQL Migration Log **Date:** 2026-05-25 **Status:** ✅ Complete ## Summary - Migrated elysia app from MySQL to PostgreSQL - Migrated rust app from MySQL to PostgreSQL - All data validated and integrity confirmed - Apps tested and operational ## Changes - elysia: Updated database driver (mysql2 → postgres), schema (mysqlTable → pgTable) - rust: Updated Cargo.toml feature (sqlx-mysql → sqlx-postgres), db_setup.rs backend handling ## Validation - Row counts match pre-migration - Foreign keys intact - Indexes present and performant - Auth flow functional - Session management working ## Rollback MySQL backup available at: [location if kept] To rollback: Restore MySQL from backup, revert connection strings, redeploy apps. ``` - [ ] **Step 3: Final commit** ```bash git add MIGRATION_LOG.md git commit -m "docs: add PostgreSQL migration completion log" ``` Expected: Commit created. - [ ] **Step 4: Verify all apps running** ```bash # Check elysia curl http://localhost:3000/health # Check rust curl http://localhost:8000/health ``` Expected: Both apps respond with 200 status. --- ## Self-Review **Spec Coverage:** - ✅ Pre-migration (backup, convert, test) — Tasks 1-3 - ✅ Elysia code updates (driver, schema, env) — Task 4 - ✅ Rust code updates (Cargo.toml, db_setup.rs, env) — Task 5 - ✅ Smoke tests (auth, endpoints, logs) — Tasks 6-7 - ✅ Data validation (row counts, foreign keys) — Task 8 - ✅ Performance baseline — Task 9 - ✅ Cleanup and documentation — Task 10 **Placeholder Scan:** - ✅ No TBD/TODO - ✅ All code blocks complete - ✅ All commands exact with expected output - ✅ All file paths exact **Type Consistency:** - ✅ Database type: `PostgresJsDatabase` (elysia), `DbBackend::Postgres` (rust) - ✅ Connection string format consistent: `postgresql://asephs:hunterz@100.108.1.124:5432/hub` - ✅ Table names consistent: "User", "Account", "Session", etc. ×9¹´xI3¶Ì# Production GitHub Actions Implementation Plan > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** Rework GitHub Actions build/deploy workflows into a production baseline with reliable React submodule updates, least-privilege permissions, clear deploy behavior, and current official action versions. **Architecture:** Keep two workflows: `docker-build-push.yml` for detect/build/manifest updates, and `deploy-docker.yml` for VPS deployment. Add dispatch submodule SHA readiness checks before parent pointer updates, and remove recursive submodule checkout from deploy runner. **Tech Stack:** GitHub Actions YAML, GitHub-hosted Ubuntu runners, Docker Buildx, GHCR, git submodules, Docker Compose over SSH. --- ## File Structure - Modify `.github/workflows/docker-build-push.yml`: add default permissions, validate repository dispatch payloads, wait for submodule SHAs, keep selective matrix builds, harden manifest update. - Modify `.github/workflows/deploy-docker.yml`: add default permissions, remove recursive checkout, keep auto deploy from successful build, make deploy logs clearer. - Modify `.github/dependabot.yml`: add GitHub Actions update config so official actions stay current. --- ### Task 1: Harden build workflow permissions and dispatch validation **Files:** - Modify: `.github/workflows/docker-build-push.yml` - [ ] **Step 1: Add workflow-level read permissions** At top level, after `concurrency`, add: ```yaml permissions: contents: read ``` Expected shape: ```yaml concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: false permissions: contents: read env: REGISTRY: ghcr.io ``` - [ ] **Step 2: Replace dispatch parser with payload validation** In `.github/workflows/docker-build-push.yml`, replace `Parse repository_dispatch payload` step body with: ```yaml - name: Parse repository_dispatch payload id: dispatch if: github.event_name == 'repository_dispatch' env: SERVICE: ${{ github.event.client_payload.service }} SHA: ${{ github.event.client_payload.sha }} run: | set -euo pipefail if [ -z "${SERVICE:-}" ]; then echo "::error::repository_dispatch payload missing service" exit 1 fi if [ -z "${SHA:-}" ]; then echo "::error::repository_dispatch payload missing sha" exit 1 fi case "$SERVICE" in rust-api|elysia-api|react-web|9router) ;; *) echo "::error::Unsupported service '$SERVICE'. Expected one of: rust-api, elysia-api, react-web, 9router" exit 1 ;; esac case "$SHA" in *[!0-9a-fA-F]*|???????????????????????????????????????|?????????????????????????????????????????*) echo "::error::Invalid sha '$SHA'. Expected 40 hex characters" exit 1 ;; esac declare -a SERVICES=("rust-api" "elysia-api" "react-web" "9router") for svc in "${SERVICES[@]}"; do if [ "$SERVICE" = "$svc" ]; then echo "${svc}=true" >> "$GITHUB_OUTPUT" else echo "${svc}=false" >> "$GITHUB_OUTPUT" fi done ``` - [ ] **Step 3: Run YAML syntax check** Run: ```bash python - <<'PY' from pathlib import Path import yaml for path in Path('.github/workflows').glob('*.yml'): yaml.safe_load(path.read_text()) print(f'OK {path}') PY ``` Expected: ```text OK .github/workflows/deploy-docker.yml OK .github/workflows/docker-build-push.yml ``` - [ ] **Step 4: Commit** ```bash git add .github/workflows/docker-build-push.yml git commit -m "ci: validate dispatch payloads" ``` --- ### Task 2: Add submodule SHA readiness wait before build/update **Files:** - Modify: `.github/workflows/docker-build-push.yml` - [ ] **Step 1: Add readiness job after changes job** Insert this job between `changes` and `build`: ```yaml wait-submodule-ref: needs: [changes] if: github.event_name == 'repository_dispatch' runs-on: ubuntu-latest steps: - name: Wait for submodule ref env: SERVICE: ${{ github.event.client_payload.service }} SHA: ${{ github.event.client_payload.sha }} run: | set -euo pipefail case "$SERVICE" in "rust-api") REPO="https://github.com/MythEclipse/ultimate-asepharyana-tech-rust.git" ;; "elysia-api") REPO="https://github.com/MythEclipse/ultimate-asepharyana-tech-elysia.git" ;; "react-web") REPO="https://github.com/MythEclipse/ultimate-asepharyana-tech-react.git" ;; "9router") REPO="https://github.com/MythEclipse/9router.git" ;; *) echo "::error::Unsupported service '$SERVICE'" exit 1 ;; esac echo "Waiting for $SERVICE ref $SHA in $REPO" for attempt in {1..30}; do if git ls-remote --exit-code "$REPO" "$SHA" >/dev/null 2>&1; then echo "Submodule ref $SHA is fetchable for $SERVICE" exit 0 fi echo "Attempt $attempt/30: $SHA not visible yet; waiting 10s" sleep 10 done echo "::error::Submodule ref $SHA for $SERVICE was not fetchable after 300s" exit 1 ``` - [ ] **Step 2: Make build wait for readiness job without blocking push/manual events** Change build job header from: ```yaml build: needs: [changes] ``` to: ```yaml build: needs: [changes, wait-submodule-ref] if: | always() && needs.changes.result == 'success' && (needs.wait-submodule-ref.result == 'success' || needs.wait-submodule-ref.result == 'skipped') && needs.changes.outputs.matrix != '[]' ``` Remove existing build-level line: ```yaml if: needs.changes.outputs.matrix != '[]' ``` - [ ] **Step 3: Make update-manifest wait for readiness job** Change update-manifest header from: ```yaml update-manifest: needs: [changes, build] if: | always() && (needs.build.result == 'success' || needs.build.result == 'skipped') ``` to: ```yaml update-manifest: needs: [changes, wait-submodule-ref, build] if: | always() && needs.changes.result == 'success' && (needs.wait-submodule-ref.result == 'success' || needs.wait-submodule-ref.result == 'skipped') && (needs.build.result == 'success' || needs.build.result == 'skipped') ``` - [ ] **Step 4: Run YAML syntax check** Run same command from Task 1 Step 3. Expected both workflow files print `OK`. - [ ] **Step 5: Commit** ```bash git add .github/workflows/docker-build-push.yml git commit -m "ci: wait for submodule refs before builds" ``` --- ### Task 3: Harden manifest update and submodule checkout **Files:** - Modify: `.github/workflows/docker-build-push.yml` - [ ] **Step 1: Add job permissions to build and manifest jobs** Ensure build job contains: ```yaml permissions: contents: read packages: write ``` Ensure update-manifest job contains: ```yaml permissions: contents: write ``` - [ ] **Step 2: Replace dispatch submodule checkout block** Inside `Update tags and submodules`, replace the repository_dispatch submodule update block with: ```bash if [ "${{ github.event_name }}" == "repository_dispatch" ] && [ "${{ github.event.client_payload.service }}" == "$id" ]; then SHA_DISPATCH="${{ github.event.client_payload.sha }}" SUB_PATH="${PATHS[$id]}" if [ -n "$SHA_DISPATCH" ]; then echo "Updating submodule $SUB_PATH to $SHA_DISPATCH" git submodule update --init "$SUB_PATH" git -C "$SUB_PATH" fetch origin "$SHA_DISPATCH" git -C "$SUB_PATH" checkout "$SHA_DISPATCH" git add "$SUB_PATH" CHANGED=true fi fi ``` - [ ] **Step 3: Add pull/rebase retry before push** Replace: ```bash git commit -m "chore: update manifests and submodules [skip ci]" git pull --rebase origin main git push origin main ``` with: ```bash git commit -m "chore: update manifests and submodules [skip ci]" for attempt in {1..3}; do if git pull --rebase origin main && git push origin main; then exit 0 fi echo "Manifest push attempt $attempt/3 failed; retrying" git rebase --abort || true git pull --rebase origin main || true sleep 5 done echo "::error::Failed to push manifest update after 3 attempts" exit 1 ``` - [ ] **Step 4: Run YAML syntax check** Run same command from Task 1 Step 3. Expected both workflow files print `OK`. - [ ] **Step 5: Commit** ```bash git add .github/workflows/docker-build-push.yml git commit -m "ci: harden manifest updates" ``` --- ### Task 4: Make deploy checkout submodule-free and least privilege **Files:** - Modify: `.github/workflows/deploy-docker.yml` - [ ] **Step 1: Add workflow-level read permissions** After `concurrency`, add: ```yaml permissions: contents: read ``` Expected shape: ```yaml concurrency: group: deploy-vps cancel-in-progress: false permissions: contents: read ``` If current `cancel-in-progress` is `true`, change it to `false`. - [ ] **Step 2: Make checkout non-recursive** Replace checkout step: ```yaml - name: Checkout repository uses: actions/checkout@v4 with: submodules: recursive ``` with: ```yaml - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 1 submodules: false ``` - [ ] **Step 3: Add deploy context log** At start of `Deploy with Docker Compose on VPS` run script, after `set -euo pipefail`, add: ```bash echo "Deploy event: ${{ github.event_name }}" echo "Deploy ref: ${{ github.ref }}" echo "Deploy sha: ${{ github.sha }}" ``` - [ ] **Step 4: Run YAML syntax check** Run same command from Task 1 Step 3. Expected both workflow files print `OK`. - [ ] **Step 5: Commit** ```bash git add .github/workflows/deploy-docker.yml git commit -m "ci: avoid submodule checkout during deploy" ``` --- ### Task 5: Add GitHub Actions Dependabot updates **Files:** - Modify: `.github/dependabot.yml` - [ ] **Step 1: Add github-actions ecosystem** Append this update entry under `updates:`: ```yaml - package-ecosystem: 'github-actions' directory: '/' schedule: interval: weekly groups: github-actions: patterns: - '*' ``` Expected file shape: ```yaml version: 2 updates: - package-ecosystem: 'devcontainers' directory: '/' schedule: interval: weekly - package-ecosystem: 'github-actions' directory: '/' schedule: interval: weekly groups: github-actions: patterns: - '*' ``` - [ ] **Step 2: Run YAML syntax check** Run: ```bash python - <<'PY' from pathlib import Path import yaml paths = [Path('.github/dependabot.yml'), *Path('.github/workflows').glob('*.yml')] for path in paths: yaml.safe_load(path.read_text()) print(f'OK {path}') PY ``` Expected: ```text OK .github/dependabot.yml OK .github/workflows/deploy-docker.yml OK .github/workflows/docker-build-push.yml ``` - [ ] **Step 3: Commit** ```bash git add .github/dependabot.yml git commit -m "ci: enable github actions dependency updates" ``` --- ### Task 6: Final validation **Files:** - Validate: `.github/workflows/docker-build-push.yml` - Validate: `.github/workflows/deploy-docker.yml` - Validate: `.github/dependabot.yml` - [ ] **Step 1: Run YAML syntax check** Run: ```bash python - <<'PY' from pathlib import Path import yaml paths = [Path('.github/dependabot.yml'), *Path('.github/workflows').glob('*.yml')] for path in paths: yaml.safe_load(path.read_text()) print(f'OK {path}') PY ``` Expected all files print `OK`. - [ ] **Step 2: Check workflows recognized by GitHub CLI** Run: ```bash gh workflow list ``` Expected output includes: ```text Build and Push Docker Images Deploy Docker to VPS ``` - [ ] **Step 3: Inspect final diff** Run: ```bash git diff -- .github/workflows .github/dependabot.yml ``` Expected: - `docker-build-push.yml` has dispatch validation, `wait-submodule-ref`, job permissions, and manifest push retry. - `deploy-docker.yml` has non-recursive checkout and read-only permissions. - `dependabot.yml` has `github-actions` updates. - [ ] **Step 4: Commit any final validation fixes** If Step 1 or Step 2 required fixes, commit them: ```bash git add .github/workflows .github/dependabot.yml git commit -m "ci: finalize production workflow hardening" ``` If no fixes were needed, do not create an empty commit. £Ó½xýø# React Direct Runtime and Images Implementation Plan > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** Serve the React SPA without nginx and remove frontend image-cache proxy calls so browser uses direct image/API URLs. **Architecture:** The React Docker image still builds with Bun/Vite, but runtime uses `vite preview` from Bun instead of nginx. `CachedImage` normalizes image URLs and renders them directly, keeping fallback/retry UI but removing `/proxy/image-cache` auditing. Traefik keeps routing `react-web:80`, so compose and dynamic routing stay stable. **Tech Stack:** Bun, Vite, React, TypeScript, Docker, Docker Compose, Traefik. --- ## Tasks ### Task 1: Switch React Runtime From nginx to Bun/Vite Preview Modify `infra/docker/react.Dockerfile` so runtime stage uses `oven/bun:1-alpine`, installs production deps, copies `/app/dist`, exposes 80, and runs `bunx vite preview --host 0.0.0.0 --port 80`. Verify nginx runtime/copy lines are gone and Vite preview command exists. ### Task 2: Remove Image Cache Proxy From CachedImage Modify `apps/react/src/components/ui/cached-image.tsx` to remove `API_BASE_URL` import, `/proxy/image-cache` POST, audit state/function, and auditing overlay. Keep direct normalized image URLs, retry behavior, and fallback image. ### Task 3: Verify Build and Config Run static checks for both tasks, `bun --cwd apps/react run build`, `docker build -f infra/docker/react.Dockerfile -t react-web:test .`, start test container on `18080:80`, curl root, clean container, and run `git diff --check`. ### Task 4: Commit and Push Commit changed files: `infra/docker/react.Dockerfile`, `apps/react/src/components/ui/cached-image.tsx`, `docs/superpowers/plans/2026-05-27-react-direct-runtime-and-images.md`. Push branch only after verification if user asks; do not push from worktree unless explicitly instructed. îDÊa®x340031Q0202Ó50Õ52ÑÍÍÏÏ+J-È×ÍÍL/J,ÉÌÏÓMI-ÎLÏÓËMapóÓÏÏü÷mÉWã_;\•©ß èdˆf„©nA~qIzQjqaVC>Õ7‰üS;.ôóÛ§·ÕS”¯µçKd¢b¦[”š›_–ª›—Y¡›’Ÿœ�Z¤›Ÿ—S‰ä–%ßä¿Oþ+ÅrCVùO¶ýªÞì’JtcÌu ŠòSJ“ÁÞHÏ,É(MÒMóŠ‘LºW¼Ê_ÏÉçÀ÷¹}·ÏFÔ³Û,Ã�b’¹®�%0`òòÁôYIÐÌÒ¢T$Cv™D¯ß¦ë½OGô’;µ=kâ ƒ?ì�xœ»Çt�iƒ£ÈÙ 1o^N—lèÝaªŸª¾ˆ÷çµ3 w¿Èx�pë# Moonrepo Migration Design **Date:** 2026-05-24 **Status:** approved ## Context Ultimate Asepharyana Tech is a polyglot monorepo with 7 applications managed as git submodules: nextjs (React/Next.js), elysia (Bun/Elysia), solidjs (SolidStart), rust (Axum), rust-auth (Axum auth service), leptos (Leptos WASM), and 9router. Nix flakes handle system dependencies and Docker image builds. Docker Compose manages deployment. ## Problem - No centralized task orchestration — running build/lint/test across all apps is manual and error-prone - No dependency caching — builds are not incremental across apps - Inconsistent developer experience — each app has its own conventions, onboarding is slow ## Goal Adopt moonrepo for task orchestration, caching, and dependency graph management across all 7 apps while preserving the existing Nix build system, Docker Compose deployment, and git submodule structure. ## Architecture ### Directory Structure ``` ultimate-asepharyana.tech/ ├── .moon/ │ ├── workspace.yml │ ├── toolchain.yml │ └── tasks/ │ ├── typescript-build.yml │ ├── typescript-lint.yml │ ├── typescript-test.yml │ ├── rust-build.yml │ ├── rust-test.yml │ └── rust-lint.yml ├── apps/ │ ├── nextjs/moon.yml │ ├── elysia/moon.yml │ ├── solidjs/moon.yml │ ├── rust/moon.yml │ ├── rust-auth/moon.yml │ ├── leptos/moon.yml │ └── 9router/moon.yml ├── .moon/workspace.yml # unchanged — Nix build + deployment ├── flake.nix # unchanged ├── infra/ # unchanged — Docker Compose, Traefik, nginx └── scripts/ # unchanged ``` ### Tag Taxonomy | Tag | Projects | |-----|----------| | `lang:typescript` | nextjs, elysia, solidjs | | `lang:rust` | rust, rust-auth, leptos | | `type:frontend` | nextjs, solidjs, leptos | | `type:backend` | rust, elysia, rust-auth | | `type:router` | 9router | ### Toolchain - moonrepo manages Node 22, Bun, and TypeScript versions via `.moon/toolchain.yml` for consistent access across all TypeScript apps - Rust toolchain remains managed by Nix/devShell — moonrepo does not touch Rust installation - Nix devShell gains the moon CLI binary ### Project Dependencies - **nextjs** depends on `rust-auth` and `elysia` (frontend consumes both APIs) - **solidjs** depends on `elysia` and `rust-auth` - **leptos** depends on `rust` (CSR frontend consumes rust backend API) - **elysia**, **rust**, **rust-auth**, **9router** — no project dependencies ## Task Definitions ### Shared Tasks: TypeScript All TypeScript apps inherit from `.moon/tasks/typescript-*.yml`: | Task | Command | Inputs | Outputs | |------|---------|--------|---------| | `build` | `bun run build` | `src/**/*`, `tsconfig.json`, `package.json` | `.next`, `dist`, `.output` | | `lint` | `bun run lint` | `src/**/*`, `eslint.config.mjs`, `tsconfig.json` | — | | `typecheck` | `bun run check-types` | `src/**/*`, `tsconfig.json` | — | | `test` | `bun test` | `src/**/*`, `test/**/*` | — | | `e2e` | overridden per app | — | — | ### Shared Tasks: Rust All Rust apps inherit from `.moon/tasks/rust-*.yml`, using system tasks: | Task | Command | Inputs | Outputs | |------|---------|--------|---------| | `build` | `cargo build --release` | `src/**/*`, `Cargo.toml`, `Cargo.lock`, `build.rs` | `target/release/*` | | `test` | `cargo test` | `src/**/*`, `Cargo.toml`, `Cargo.lock`, `tests/**/*` | — | | `lint` | `cargo clippy -- -D warnings` | `src/**/*`, `Cargo.toml` | — | | `fmt-check` | `cargo fmt --check` | `src/**/*` | — | ### Implicit Dependencies Configured in `workspace.yml`: `lint` implicitly depends on `build` for TypeScript apps (typecheck path), and `build` propagates to dependents when source inputs change. ## Key Commands ```bash moon run :build # build all changed apps + dependents moon run :lint # lint all moon run :test # test all moon run --tag lang:rust :test # test Rust apps only moon run --affected :build # build only what changed moon query projects --tag lang:typescript # list TypeScript projects ``` ## What Does NOT Change - **Nix flakes** — system dependencies, Docker image builds, devShell remain as-is - **Docker Compose** — deployment continues through existing compose files in `infra/compose/` - **Git submodules** — all 7 app repos stay as submodules under `apps/` - **infra/** — Traefik and Docker Compose deployment remain under `infra/`; legacy Grafana/Prometheus/Alertmanager configs have been removed - **scripts/** — existing utility scripts unchanged ## Migration Steps (High-Level) 1. Install moonrepo CLI, create `.moon/` scaffolding 2. Create shared task definitions in `.moon/tasks/` 3. Configure `workspace.yml` with project list, tags, and dependency constraints 4. Configure `toolchain.yml` for Node 22 + Bun 5. Add `moon.yml` to each of the 7 app directories 6. Validate: `moon check`, `moon run :build`, `moon run :lint`, `moon run :test` 7. Add moon CLI to Nix devShell 8. Commit and document ü DºìxÊ5é# PostgreSQL Migration Design **Date:** 2026-05-25 **Scope:** Migrate elysia (Drizzle ORM + MySQL) and rust (SeaORM + MySQL) apps to PostgreSQL **Approach:** Direct cutover (Approach B) **Connection String:** `postgresql://asephs:hunterz@100.108.1.124:5432/hub` --- ## Current State ### Elysia App - **ORM:** Drizzle ORM v0.45.2 - **Driver:** mysql2 v3.20.0 - **Schema Location:** `apps/elysia/src/db/lib/schema.ts` - **Tables:** users, accounts, sessions, roles, permissions, userRoles, and related junction tables - **Database File:** `apps/elysia/src/db/lib/database.ts` ### Rust App - **ORM:** SeaORM v1.1.19 - **Feature:** sqlx-mysql - **DB Setup:** `apps/rust/src/infra/db_setup.rs` - **Tables:** ImageCache (primary table managed by app) - **Config:** Environment-based connection string ### Apps NOT Migrating - 9router (uses SQLite runtime, excluded per requirements) - nextjs (frontend, minimal DB usage) - leptos, solidjs, rust-auth (frontends, no DB) --- ## Migration Steps ### Phase 1: Pre-Migration (Preparation) 1. **Backup MySQL** ```bash mysqldump -u -p > mysql_backup.sql ``` 2. **Convert MySQL dump to PostgreSQL** - Use `pgloader` or manual conversion for schema compatibility - Handle type conversions: - `INT` → `INTEGER` - `VARCHAR(n)` → `VARCHAR(n)` (PostgreSQL compatible) - `DATETIME` → `TIMESTAMP` - `AUTO_INCREMENT` → `SERIAL` or `BIGSERIAL` - Verify indexes and foreign keys convert correctly 3. **Test import into target PostgreSQL** ```bash psql postgresql://asephs:hunterz@100.108.1.124:5432/hub < converted.sql ``` 4. **Validate data integrity** - Row counts match MySQL - Indexes exist - Foreign key constraints enforced ### Phase 2: Code Updates #### Elysia App 1. **Update `apps/elysia/src/db/lib/database.ts`** - Replace `mysql2` import with `postgres` driver - Change Drizzle dialect from `drizzle-orm/mysql2` to `drizzle-orm/postgres` - Update connection string format 2. **Update `apps/elysia/src/db/lib/schema.ts`** - Replace `drizzle-orm/mysql-core` imports with `drizzle-orm/postgres-core` - Change `mysqlTable` to `pgTable` - Adjust column types if needed (e.g., `int` → `integer`) 3. **Update `apps/elysia/package.json`** - Replace `mysql2` with `pg` (PostgreSQL driver) - Keep `drizzle-orm` and `drizzle-kit` versions 4. **Update environment/config** - Change `DATABASE_URL` to PostgreSQL connection string #### Rust App 1. **Update `apps/rust/Cargo.toml`** - Replace `sqlx-mysql` feature with `sqlx-postgres` in sea-orm dependency - Add `postgres` feature if needed 2. **Update `apps/rust/src/infra/db_setup.rs`** - Change `DbBackend::MySql` check to `DbBackend::Postgres` - Adjust SQL syntax for PostgreSQL (e.g., index creation) - Update error code handling (PostgreSQL uses different error codes) 3. **Update config/environment** - Change `DATABASE_URL` to PostgreSQL connection string ### Phase 3: Cutover (Execution) 1. **Stop all apps** ```bash # Stop elysia # Stop rust app ``` 2. **Export MySQL data** ```bash mysqldump -u -p > final_backup.sql ``` 3. **Convert and import to PostgreSQL** ```bash # Convert dump # Import to PostgreSQL psql postgresql://asephs:hunterz@100.108.1.124:5432/hub < converted.sql ``` 4. **Deploy updated apps** - Deploy elysia with PostgreSQL driver - Deploy rust with PostgreSQL feature 5. **Verify connectivity** - Test database queries from both apps - Check auth flow (users table) - Verify session management ### Phase 4: Validation 1. **Smoke tests** - User login/logout - Session creation and retrieval - Role/permission queries - ImageCache operations (rust app) 2. **Data integrity checks** - Row counts match pre-migration - No orphaned foreign keys - Indexes performing as expected 3. **Performance baseline** - Compare query times MySQL vs PostgreSQL - Monitor connection pool usage ### Phase 5: Rollback Plan (if needed) 1. **Stop apps** 2. **Restore MySQL from backup** ```bash mysql -u -p < mysql_backup.sql ``` 3. **Revert connection strings in apps** 4. **Redeploy with MySQL drivers** 5. **Restart apps** --- ## Technical Details ### Elysia Driver Change **Before:** ```typescript import { drizzle } from 'drizzle-orm/mysql2' import { createPool } from 'mysql2/promise' ``` **After:** ```typescript import { drizzle } from 'drizzle-orm/postgres-js' import postgres from 'postgres' ``` ### Rust Feature Change **Before:** ```toml sea-orm = { version = "1.1.19", features = ["sqlx-mysql", ...] } ``` **After:** ```toml sea-orm = { version = "1.1.19", features = ["sqlx-postgres", ...] } ``` --- ## Risk Assessment | Risk | Mitigation | |------|-----------| | Data loss during migration | Full MySQL backup before cutover; test import first | | App downtime | Cutover during low-traffic window; rollback plan ready | | Connection string misconfiguration | Test connection before deploying apps | | Schema incompatibilities | Pre-test conversion; validate indexes/constraints | | Performance regression | Baseline MySQL performance; monitor PostgreSQL after cutover | --- ## Success Criteria - ✅ All data migrated to PostgreSQL (row counts match) - ✅ Elysia app connects and queries work - ✅ Rust app connects and queries work - ✅ Auth flow functional (login/logout) - ✅ No orphaned foreign keys - ✅ Indexes present and performant - ✅ Rollback plan tested and documented --- ## Timeline - **Pre-migration:** 30 min (backup, convert, test) - **Code updates:** 1-2 hours (driver changes, testing) - **Cutover:** 15-30 min (stop apps, migrate data, restart) - **Validation:** 30 min (smoke tests, data checks) - **Total:** ~3-4 hours (including buffer) ~�|µÅ ÇÇ+ÙiO{j @ÕD±…Ô‰¡Ø88(²Ô.-1û ’W€/zuà O˜'é7\îjW–�(¾±D g†3g¾áº(‹R˪¤¹4V×±­µ<¥:³*V†ÂÈj%ôZbde¼¢Oÿû?õÃU½‚Ã×>=<¤çÇÏ� �Ââ;+lmxyRUºü(,¾½-¤æµ_zj‚àÉúUÄéR—u‘Á¥.×2%U(2r!³:/Ö‚R"=è_DŸþü‹·ÔbEy{6¸¿äÍÊ(üÃQ é�*–$ªL¥Â¨#X»Ñ‚£�" G””i�˺ßQPmU¦ìšL¬Ue͈^ - AgÊž× *õ’¢‹µ]MãLUFF”ò¯ Q29‚½¼¤e^Z‰UiȪD¤´PFP¢Dj$t^J�Õøš‰´NaT»¼°GÄ>°Á\ÂùAÆJc¡ÁÍ5‚¤ëÕÈ…ò¬™ ‚“Ò:�O„V�†/•õÃù�‚ç#:Umº˜%eœJæ€ÅR6ŽY™ÉºÊJ‘¸˜��ÈaðÝf3 *Ua!�–ÊFdêE^&u&é Î$h2@éYðýˆ®«ÁFÆD”ÈbéÂฺF”)‚.x:ŠË|Üó~|ÿìµ ¸‘¢Q§t[êô&+oÍ¥eq£–5Ò �{°”ÄA4Á#z§DÅiiaBY™ŠÌ¡`5JdÈ&`‡\¾µU/›8y�•ËÒ;�@O+­¨ YImÅJ0wÔÊÜÑ¥°+ºc°µ r§¿ îÂöÏÚ,ø CÓl ïhr9ƒ’HT•K·¹ï›{Þ §?ìÄ e.P÷J—Èa‘tš4/VQ+ÅÇŠq�‚Ö\)þþY9v¦6–&µ Ks"�•P`峊ú’÷“‘¨ã}Wv„®¼t‚.ü…h�5¼'cxÙ+Ü”ëö¦´’ýëãä¸"¾R¸‚1×yúÞS`š*Q-S[jõ,h…·,< êjà÷õIއFë<‹XßP¨¯xK¤Ù¿­æ¥ Ö ×ÓæEÊú‚]<, .P÷bÔ wìªM ‡Ä­5­­Õ'~�Ýð55Ç%RÅ’AòŠ.=pÀõõŽ^KÎô®kɈ*t:T•ÑSE\\`ikŒ“ÍueÙ�)šO'//¦£†_œA¿_�÷ÚÉ8žu­�rµÔª² ƒ³óógÔLµî@ËÐc;4·-†aìªÊqÎ#Î3~¾Ûàˆê”S¿ÙÞËÐvïÙÞ´¿UwÓÃ[¹ØÃèpÏþ6}%Ùó¨Û»ö·ÛÕª}ÎÚvL·g›MÙn™`c˜)ø�/ÄÏš*µTúM`·J†ï¿=}£ti z†Å'y�µÊ’�éWדf“³éû7“‹éûË9ŠÅ¢Sо¼+0÷ôKÑ6R¹“ 92&­¤�‰aŒ¢#Šúä�žêºÂy=ÿÍ St+” ;~¢œƒþ:þÞ«* ¸Ž÷/Xo§2ª‹æ©Œaž3ÒVÇqâôO©ïd[ Þ²›µqmy:S^?Þ žaRKUlâ2Œ:C_s0O;ºaÏ1êJZÖÖ›÷gébÒz0 ü£†6‘AƒÝà( IÚI#Î…Ÿ9ylüsb…¼Ü?Nƒ ŠÐÄTðßÎ/ú¶Ç¯¿ý=øÆUóŸ� _Ò‚oj�ÑÏ´²¶2§ãñL/­=.Îdæ¾9W¶¶­¹Å¯4æöî¶å‹Õ¶5¿ü•öüîÝ»â¶m³ûá+­vû�]äÒaaú‡Œ1ï£!VOb¥”=Š® ï¦܆\lh?õ¶×¼ ÊíUbW: öFáqì�¶Ñ†>¡ºl“:,m³4e[cC6è.5c¯Kü¸°.¨m¶ö�#çå§•~³y�Ýá4ª|ï%Úø¹„êÂÖ©{£Áu@“xúÔ=�p“ðQøs~ j¹Dð7=}CUç�Uxœ›­ù\uÃkæÉ•,ΓÙY§L~É,ͨ?Y›E‰QòÅÉÓXåù4ÒSsòs“óÒ 57oeÝÎ29Œ»br—Àä0G΢ÔÄäÝòÔ¤É<î“ÏqóƒD7;ñ83ªë($¤æTg&ê&d&è($ÀÕ‚9¥Å%º‰¥%“[x§è(”¤æ¤–ää'¦¤é( 4ê(Àµé( 4iò’®©“/ŠtMœüŠb† ‰ ÅÉE‰©EV\\ ™y™“ÕŠ7 Nc’„Ê—&åæ§”æ¤*h@•jNÞ.üñM{‚« x340031QrutñuÕËMa˜§|ùÿöPÛ'²Öéùjšô)¾p11…äüÜ‚üâT†G÷y¦Þa<özõüõ+ÓsöVï…©ÈKËLgèñײ±áû²†M öaâUǤ �¿k! Rò“³S‹ÚgŸd¹*ÃØÏiÁ]ºDôÔÓ‰%E‰©i™Ù g®³Þ râ ÿw-m³ÿúÌ ÞþrY›MAãî€*xœáÿ««�3èÿ�—+ުœè…xøRõýœé‘Gdêi5xœ; ºKxƒ.#ã”ÉñŒ:›?1ö3O^À*0ù3kùæ26/¸! 4¤xœ340031Q(N.J,H-Ò«ÌÍaHWca\²¹fúެÉóR4Þ-öS9¬eU–‘X”šV5Ùõì³eïø–(ÿbý¯·ÕNq×=±&¨ª’¢ÄÔ´Ìl°²m²�…”N¥Ÿ?óœ3 ì`Ð\ÏÛ-j…©xœûÉü‘iÂóÉùŒ]}ôí…¦{xœ»%}NjÃLŽÍ¡œbŒÜŽÁ®ŽA‘Ž~Ž“³¸rPøWÑøÜùÈüÍë¸u˜¯¯o x ßÿ40000 mysqlÕ÷—϶}Ãtï}¥§ÁÎPoÝ<×t£x#Üÿ40000 init.sqlÅô¡B:9teman-teman adakah info magang sebagai admin disekitaran mendalo

', 0, 1, 66, '2026-01-31 05:46:15', '2026-02-28 01:12:31'), (2, 1, 'Isi kuesioner ', '

Silahkan isi kuesioner tahunan kalian

', 0, 0, 42, '2026-01-31 06:11:51', '2026-02-28 01:12:58'), (3, 1, 'Info Pengambilan Ijazah', '

Yang posisi lagi di jambi, kalo mau ambil ijazah tunggu masuk kuliah tanggal 22

note: bawa kelengkapan berkas

', 1, 0, 10, '2026-02-01 03:22:35', '2026-02-28 01:12:13'); -- -------------------------------------------------------- -- -- Table structure for table `imports` -- CREATE TABLE `imports` ( `id` bigint UNSIGNED NOT NULL, `completed_at` timestamp NULL DEFAULT NULL, `file_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `file_path` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `importer` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `processed_rows` int UNSIGNED NOT NULL DEFAULT '0', `total_rows` int UNSIGNED NOT NULL, `successful_rows` int UNSIGNED NOT NULL DEFAULT '0', `user_id` bigint UNSIGNED NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `imports` -- INSERT INTO `imports` (`id`, `completed_at`, `file_name`, `file_path`, `importer`, `processed_rows`, `total_rows`, `successful_rows`, `user_id`, `created_at`, `updated_at`) VALUES (1, '2025-12-28 14:25:08', 'alumni_import.csv', 'D:\\laragon\\www\\sisfor_alumni2\\filament-starter\\storage\\app/private\\livewire-tmp/cWfV2xhlYy2Rxr9PHGGeXoHjYZ0VLH-metaYWx1bW5pX2ltcG9ydC5jc3Y=-.csv', 'App\\Filament\\Imports\\AlumniImporter', 10, 10, 10, 1, '2025-12-28 14:25:02', '2025-12-28 14:25:08'), (2, '2026-01-02 22:24:17', 'alumni_import.csv', 'D:\\laragon\\www\\sisfor_alumni2\\filament-starter\\storage\\app/private\\livewire-tmp/Qw3Se9MhdU3K7qQjEknAkuRtbZPM75-metaYWx1bW5pX2ltcG9ydC5jc3Y=-.csv', 'App\\Filament\\Imports\\AlumniImporter', 10, 10, 10, 1, '2026-01-02 22:24:08', '2026-01-02 22:24:17'), (5, '2026-01-13 03:06:34', 'template_import_alumni.csv', 'D:\\laragon\\www\\sisfor_alumni2\\filament-starter\\storage\\app/private\\livewire-tmp/q03r9qdRsjBSWJSeLmTidKfSoxeXSc-metadGVtcGxhdGVfaW1wb3J0X2FsdW1uaS5jc3Y=-.csv', 'App\\Filament\\Imports\\AlumniImporter', 5, 5, 5, 1, '2026-01-13 03:06:29', '2026-01-13 03:06:34'), (7, '2026-02-27 21:36:09', 'test1.csv', 'D:\\laragon\\www\\sisfor_alumni2\\filament-starter\\storage\\app/private\\livewire-tmp/a6mIDStEO7yGVnbdW4Nq5PGkARAMZL-metadGVzdDEuY3N2-.csv', 'App\\Filament\\Imports\\AlumniImporter', 5, 5, 5, 1, '2026-02-27 21:36:02', '2026-02-27 21:36:09'); -- -------------------------------------------------------- -- -- Table structure for table `internships` -- CREATE TABLE `internships` ( `id` bigint UNSIGNED NOT NULL, `user_id` bigint UNSIGNED NOT NULL, `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `company` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `location` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `description` text COLLATE utf8mb4_unicode_ci NOT NULL, `requirements` text COLLATE utf8mb4_unicode_ci, `duration` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `deadline` date DEFAULT NULL, `contact_info` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `internships` -- INSERT INTO `internships` (`id`, `user_id`, `title`, `company`, `location`, `description`, `requirements`, `duration`, `deadline`, `contact_info`, `created_at`, `updated_at`) VALUES (1, 18, 'Magang Web Developer', 'PT Teknologi Maju Bersama', 'Yogyakarta, DI Yogyakarta', '

 PT Teknologi Maju Bersama membuka program magang Web Developer bagi fresh graduate yang ingin mengembangkan kemampuan dalam pengembangan aplikasi berbasis web. Peserta magang akan terlibat langsung dalam proyek pengembangan internal perusahaan. 

', '
  • Mahasiswa aktif atau fresh graduate jurusan Sistem Informasi / Teknik Informatika
  • Menguasai dasar HTML, CSS, dan JavaScript
  • Memahami framework Laravel menjadi nilai tambah
  • Bersedia bekerja secara tim dan mengikuti jadwal magang
', '6 bulan', '2026-02-05', 'internship@teknologimaju.co.id', '2026-01-02 23:13:14', '2026-01-02 23:13:14'); -- -------------------------------------------------------- -- -- Table structure for table `jobs` -- CREATE TABLE `jobs` ( `id` bigint UNSIGNED NOT NULL, `queue` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `payload` longtext COLLATE utf8mb4_unicode_ci NOT NULL, `attempts` tinyint UNSIGNED NOT NULL, `reserved_at` int UNSIGNED DEFAULT NULL, `available_at` int UNSIGNED NOT NULL, `created_at` int UNSIGNED NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -------------------------------------------------------- -- -- Table structure for table `job_batches` -- CREATE TABLE `job_batches` ( `id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `total_jobs` int NOT NULL, `pending_jobs` int NOT NULL, `failed_jobs` int NOT NULL, `failed_job_ids` longtext COLLATE utf8mb4_unicode_ci NOT NULL, `options` mediumtext COLLATE utf8mb4_unicode_ci, `cancelled_at` int DEFAULT NULL, `created_at` int NOT NULL, `finished_at` int DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `job_batches` -- INSERT INTO `job_batches` (`id`, `name`, `total_jobs`, `pending_jobs`, `failed_jobs`, `failed_job_ids`, `options`, `cancelled_at`, `created_at`, `finished_at`) VALUES ('a0b40b37-4a90-4670-a51d-f6fd8076b373', '', 1, 0, 0, '[]', 'a:2:{s:13:\"allowFailures\";b:1;s:7:\"finally\";a:1:{i:0;O:47:\"Laravel\\SerializableClosure\\SerializableClosure\":1:{s:12:\"serializable\";O:46:\"Laravel\\SerializableClosure\\Serializers\\Signed\":2:{s:12:\"serializable\";s:3952:\"O:46:\"Laravel\\SerializableClosure\\Serializers\\Native\":5:{s:3:\"use\";a:4:{s:9:\"columnMap\";a:17:{s:3:\"nim\";s:3:\"nim\";s:8:\"username\";s:8:\"username\";s:11:\"birth_place\";s:11:\"birth_place\";s:10:\"birth_date\";s:10:\"birth_date\";s:6:\"gender\";s:6:\"gender\";s:7:\"address\";s:7:\"address\";s:12:\"phone_number\";s:12:\"phone_number\";s:5:\"email\";s:5:\"email\";s:3:\"gpa\";s:3:\"gpa\";s:7:\"faculty\";s:7:\"faculty\";s:5:\"major\";s:5:\"major\";s:10:\"entry_year\";s:10:\"entry_year\";s:15:\"graduation_year\";s:15:\"graduation_year\";s:6:\"status\";s:6:\"status\";s:12:\"job_position\";s:12:\"job_position\";s:12:\"company_name\";s:12:\"company_name\";s:4:\"foto\";s:4:\"foto\";}s:6:\"import\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Imports\\Models\\Import\";s:2:\"id\";i:1;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:13:\"jobConnection\";N;s:7:\"options\";a:0:{}}s:8:\"function\";s:2925:\"function () use ($columnMap, $import, $jobConnection, $options) {\n $import->touch(\'completed_at\');\n\n event(new \\Filament\\Actions\\Imports\\Events\\ImportCompleted($import, $columnMap, $options));\n\n if (! $import->user instanceof \\Illuminate\\Contracts\\Auth\\Authenticatable) {\n return;\n }\n\n $failedRowsCount = $import->getFailedRowsCount();\n\n \\Filament\\Notifications\\Notification::make()\n ->title($import->importer::getCompletedNotificationTitle($import))\n ->body($import->importer::getCompletedNotificationBody($import))\n ->when(\n ! $failedRowsCount,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->success(),\n )\n ->when(\n $failedRowsCount && ($failedRowsCount < $import->total_rows),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->warning(),\n )\n ->when(\n $failedRowsCount === $import->total_rows,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->danger(),\n )\n ->when(\n $failedRowsCount,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->actions([\n \\Filament\\Notifications\\Actions\\Action::make(\'downloadFailedRowsCsv\')\n ->label(trans_choice(\'filament-actions::import.notifications.completed.actions.download_failed_rows_csv.label\', $failedRowsCount, [\n \'count\' => \\Illuminate\\Support\\Number::format($failedRowsCount),\n ]))\n ->color(\'danger\')\n ->url(route(\'filament.imports.failed-rows.download\', [\'import\' => $import], absolute: false), shouldOpenInNewTab: true)\n ->markAsRead(),\n ]),\n )\n ->when(\n ($jobConnection === \'sync\') ||\n (blank($jobConnection) && (config(\'queue.default\') === \'sync\')),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification\n ->persistent()\n ->send(),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->sendToDatabase($import->user, isEventDispatched: true),\n );\n }\";s:5:\"scope\";s:36:\"Filament\\Tables\\Actions\\ImportAction\";s:4:\"this\";N;s:4:\"self\";s:32:\"0000000000000e0e0000000000000000\";}\";s:4:\"hash\";s:44:\"Il55kOM50sNFDkx0J1btTaCHBmZXRBPm1BERwLmAvMg=\";}}}}', NULL, 1766951427, 1766951432), ('a0b40b6c-e64b-4a5c-bed9-73d2ff339213', '', 2, 0, 0, '[]', 'a:2:{s:13:\"allowFailures\";b:1;s:7:\"finally\";a:1:{i:0;O:47:\"Laravel\\SerializableClosure\\SerializableClosure\":1:{s:12:\"serializable\";O:46:\"Laravel\\SerializableClosure\\Serializers\\Signed\":2:{s:12:\"serializable\";s:7132:\"O:46:\"Laravel\\SerializableClosure\\Serializers\\Native\":5:{s:3:\"use\";a:1:{s:4:\"next\";O:46:\"Filament\\Actions\\Exports\\Jobs\\ExportCompletion\":7:{s:11:\"\0*\0exporter\";O:35:\"App\\Filament\\Exports\\AlumniExporter\":3:{s:9:\"\0*\0export\";O:38:\"Filament\\Actions\\Exports\\Models\\Export\":33:{s:13:\"\0*\0connection\";s:5:\"mysql\";s:8:\"\0*\0table\";N;s:13:\"\0*\0primaryKey\";s:2:\"id\";s:10:\"\0*\0keyType\";s:3:\"int\";s:12:\"incrementing\";b:1;s:7:\"\0*\0with\";a:0:{}s:12:\"\0*\0withCount\";a:0:{}s:19:\"preventsLazyLoading\";b:0;s:10:\"\0*\0perPage\";i:15;s:6:\"exists\";b:1;s:18:\"wasRecentlyCreated\";b:1;s:28:\"\0*\0escapeWhenCastingToString\";b:0;s:13:\"\0*\0attributes\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:35:\"App\\Filament\\Exports\\AlumniExporter\";s:10:\"total_rows\";i:10;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2025-12-28 19:51:01\";s:10:\"created_at\";s:19:\"2025-12-28 19:51:01\";s:2:\"id\";i:1;s:9:\"file_name\";s:16:\"export-1-alumnis\";}s:11:\"\0*\0original\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:35:\"App\\Filament\\Exports\\AlumniExporter\";s:10:\"total_rows\";i:10;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2025-12-28 19:51:01\";s:10:\"created_at\";s:19:\"2025-12-28 19:51:01\";s:2:\"id\";i:1;s:9:\"file_name\";s:16:\"export-1-alumnis\";}s:10:\"\0*\0changes\";a:1:{s:9:\"file_name\";s:16:\"export-1-alumnis\";}s:11:\"\0*\0previous\";a:0:{}s:8:\"\0*\0casts\";a:4:{s:12:\"completed_at\";s:9:\"timestamp\";s:14:\"processed_rows\";s:7:\"integer\";s:10:\"total_rows\";s:7:\"integer\";s:15:\"successful_rows\";s:7:\"integer\";}s:17:\"\0*\0classCastCache\";a:0:{}s:21:\"\0*\0attributeCastCache\";a:0:{}s:13:\"\0*\0dateFormat\";N;s:10:\"\0*\0appends\";a:0:{}s:19:\"\0*\0dispatchesEvents\";a:0:{}s:14:\"\0*\0observables\";a:0:{}s:12:\"\0*\0relations\";a:0:{}s:10:\"\0*\0touches\";a:0:{}s:27:\"\0*\0relationAutoloadCallback\";N;s:26:\"\0*\0relationAutoloadContext\";N;s:10:\"timestamps\";b:1;s:13:\"usesUniqueIds\";b:0;s:9:\"\0*\0hidden\";a:0:{}s:10:\"\0*\0visible\";a:0:{}s:11:\"\0*\0fillable\";a:0:{}s:10:\"\0*\0guarded\";a:0:{}}s:12:\"\0*\0columnMap\";a:18:{s:7:\"user_id\";s:7:\"User id\";s:3:\"nim\";s:3:\"Nim\";s:8:\"username\";s:8:\"Username\";s:11:\"birth_place\";s:11:\"Birth place\";s:10:\"birth_date\";s:10:\"Birth date\";s:6:\"gender\";s:6:\"Gender\";s:7:\"address\";s:7:\"Address\";s:12:\"phone_number\";s:12:\"Phone number\";s:5:\"email\";s:5:\"Email\";s:3:\"gpa\";s:3:\"Gpa\";s:7:\"faculty\";s:7:\"Faculty\";s:5:\"major\";s:5:\"Major\";s:10:\"entry_year\";s:10:\"Entry year\";s:15:\"graduation_year\";s:15:\"Graduation year\";s:6:\"status\";s:6:\"Status\";s:12:\"job_position\";s:12:\"Job position\";s:12:\"company_name\";s:12:\"Company name\";s:4:\"foto\";s:4:\"Foto\";}s:10:\"\0*\0options\";a:0:{}}s:9:\"\0*\0export\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Exports\\Models\\Export\";s:2:\"id\";i:1;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:12:\"\0*\0columnMap\";a:18:{s:7:\"user_id\";s:7:\"User id\";s:3:\"nim\";s:3:\"Nim\";s:8:\"username\";s:8:\"Username\";s:11:\"birth_place\";s:11:\"Birth place\";s:10:\"birth_date\";s:10:\"Birth date\";s:6:\"gender\";s:6:\"Gender\";s:7:\"address\";s:7:\"Address\";s:12:\"phone_number\";s:12:\"Phone number\";s:5:\"email\";s:5:\"Email\";s:3:\"gpa\";s:3:\"Gpa\";s:7:\"faculty\";s:7:\"Faculty\";s:5:\"major\";s:5:\"Major\";s:10:\"entry_year\";s:10:\"Entry year\";s:15:\"graduation_year\";s:15:\"Graduation year\";s:6:\"status\";s:6:\"Status\";s:12:\"job_position\";s:12:\"Job position\";s:12:\"company_name\";s:12:\"Company name\";s:4:\"foto\";s:4:\"Foto\";}s:10:\"\0*\0formats\";a:2:{i:0;E:47:\"Filament\\Actions\\Exports\\Enums\\ExportFormat:Csv\";i:1;E:48:\"Filament\\Actions\\Exports\\Enums\\ExportFormat:Xlsx\";}s:10:\"\0*\0options\";a:0:{}s:7:\"chained\";a:1:{i:0;s:3217:\"O:44:\"Filament\\Actions\\Exports\\Jobs\\CreateXlsxFile\":4:{s:11:\"\0*\0exporter\";O:35:\"App\\Filament\\Exports\\AlumniExporter\":3:{s:9:\"\0*\0export\";O:38:\"Filament\\Actions\\Exports\\Models\\Export\":33:{s:13:\"\0*\0connection\";s:5:\"mysql\";s:8:\"\0*\0table\";N;s:13:\"\0*\0primaryKey\";s:2:\"id\";s:10:\"\0*\0keyType\";s:3:\"int\";s:12:\"incrementing\";b:1;s:7:\"\0*\0with\";a:0:{}s:12:\"\0*\0withCount\";a:0:{}s:19:\"preventsLazyLoading\";b:0;s:10:\"\0*\0perPage\";i:15;s:6:\"exists\";b:1;s:18:\"wasRecentlyCreated\";b:1;s:28:\"\0*\0escapeWhenCastingToString\";b:0;s:13:\"\0*\0attributes\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:35:\"App\\Filament\\Exports\\AlumniExporter\";s:10:\"total_rows\";i:10;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2025-12-28 19:51:01\";s:10:\"created_at\";s:19:\"2025-12-28 19:51:01\";s:2:\"id\";i:1;s:9:\"file_name\";s:16:\"export-1-alumnis\";}s:11:\"\0*\0original\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:35:\"App\\Filament\\Exports\\AlumniExporter\";s:10:\"total_rows\";i:10;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2025-12-28 19:51:01\";s:10:\"created_at\";s:19:\"2025-12-28 19:51:01\";s:2:\"id\";i:1;s:9:\"file_name\";s:16:\"export-1-alumnis\";}s:10:\"\0*\0changes\";a:1:{s:9:\"file_name\";s:16:\"export-1-alumnis\";}s:11:\"\0*\0previous\";a:0:{}s:8:\"\0*\0casts\";a:4:{s:12:\"completed_at\";s:9:\"timestamp\";s:14:\"processed_rows\";s:7:\"integer\";s:10:\"total_rows\";s:7:\"integer\";s:15:\"successful_rows\";s:7:\"integer\";}s:17:\"\0*\0classCastCache\";a:0:{}s:21:\"\0*\0attributeCastCache\";a:0:{}s:13:\"\0*\0dateFormat\";N;s:10:\"\0*\0appends\";a:0:{}s:19:\"\0*\0dispatchesEvents\";a:0:{}s:14:\"\0*\0observables\";a:0:{}s:12:\"\0*\0relations\";a:0:{}s:10:\"\0*\0touches\";a:0:{}s:27:\"\0*\0relationAutoloadCallback\";N;s:26:\"\0*\0relationAutoloadContext\";N;s:10:\"timestamps\";b:1;s:13:\"usesUniqueIds\";b:0;s:9:\"\0*\0hidden\";a:0:{}s:10:\"\0*\0visible\";a:0:{}s:11:\"\0*\0fillable\";a:0:{}s:10:\"\0*\0guarded\";a:0:{}}s:12:\"\0*\0columnMap\";a:18:{s:7:\"user_id\";s:7:\"User id\";s:3:\"nim\";s:3:\"Nim\";s:8:\"username\";s:8:\"Username\";s:11:\"birth_place\";s:11:\"Birth place\";s:10:\"birth_date\";s:10:\"Birth date\";s:6:\"gender\";s:6:\"Gender\";s:7:\"address\";s:7:\"Address\";s:12:\"phone_number\";s:12:\"Phone number\";s:5:\"email\";s:5:\"Email\";s:3:\"gpa\";s:3:\"Gpa\";s:7:\"faculty\";s:7:\"Faculty\";s:5:\"major\";s:5:\"Major\";s:10:\"entry_year\";s:10:\"Entry year\";s:15:\"graduation_year\";s:15:\"Graduation year\";s:6:\"status\";s:6:\"Status\";s:12:\"job_position\";s:12:\"Job position\";s:12:\"company_name\";s:12:\"Company name\";s:4:\"foto\";s:4:\"Foto\";}s:10:\"\0*\0options\";a:0:{}}s:9:\"\0*\0export\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Exports\\Models\\Export\";s:2:\"id\";i:1;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:12:\"\0*\0columnMap\";a:18:{s:7:\"user_id\";s:7:\"User id\";s:3:\"nim\";s:3:\"Nim\";s:8:\"username\";s:8:\"Username\";s:11:\"birth_place\";s:11:\"Birth place\";s:10:\"birth_date\";s:10:\"Birth date\";s:6:\"gender\";s:6:\"Gender\";s:7:\"address\";s:7:\"Address\";s:12:\"phone_number\";s:12:\"Phone number\";s:5:\"email\";s:5:\"Email\";s:3:\"gpa\";s:3:\"Gpa\";s:7:\"faculty\";s:7:\"Faculty\";s:5:\"major\";s:5:\"Major\";s:10:\"entry_year\";s:10:\"Entry year\";s:15:\"graduation_year\";s:15:\"Graduation year\";s:6:\"status\";s:6:\"Status\";s:12:\"job_position\";s:12:\"Job position\";s:12:\"company_name\";s:12:\"Company name\";s:4:\"foto\";s:4:\"Foto\";}s:10:\"\0*\0options\";a:0:{}}\";}s:19:\"chainCatchCallbacks\";a:0:{}}}s:8:\"function\";s:266:\"function (\\Illuminate\\Bus\\Batch $batch) use ($next) {\n if (! $batch->cancelled()) {\n \\Illuminate\\Container\\Container::getInstance()->make(\\Illuminate\\Contracts\\Bus\\Dispatcher::class)->dispatch($next);\n }\n }\";s:5:\"scope\";s:27:\"Illuminate\\Bus\\ChainedBatch\";s:4:\"this\";N;s:4:\"self\";s:32:\"00000000000009740000000000000000\";}\";s:4:\"hash\";s:44:\"pqKSC78MefRaewEgLAWwiqS7IqmCa0ZSeZu8cYc6PjU=\";}}}}', NULL, 1766951462, 1766951462), ('a0b42d0a-679b-4f32-a8b2-105969130d4c', '', 1, 0, 0, '[]', 'a:2:{s:13:\"allowFailures\";b:1;s:7:\"finally\";a:1:{i:0;O:47:\"Laravel\\SerializableClosure\\SerializableClosure\":1:{s:12:\"serializable\";O:46:\"Laravel\\SerializableClosure\\Serializers\\Signed\":2:{s:12:\"serializable\";s:3952:\"O:46:\"Laravel\\SerializableClosure\\Serializers\\Native\":5:{s:3:\"use\";a:4:{s:9:\"columnMap\";a:17:{s:3:\"nim\";s:3:\"nim\";s:8:\"username\";s:8:\"username\";s:11:\"birth_place\";s:11:\"birth_place\";s:10:\"birth_date\";s:10:\"birth_date\";s:6:\"gender\";s:6:\"gender\";s:7:\"address\";s:7:\"address\";s:12:\"phone_number\";s:12:\"phone_number\";s:5:\"email\";s:5:\"email\";s:3:\"gpa\";s:3:\"gpa\";s:7:\"faculty\";s:7:\"faculty\";s:5:\"major\";s:5:\"major\";s:10:\"entry_year\";s:10:\"entry_year\";s:15:\"graduation_year\";s:15:\"graduation_year\";s:6:\"status\";s:6:\"status\";s:12:\"job_position\";s:12:\"job_position\";s:12:\"company_name\";s:12:\"company_name\";s:4:\"foto\";s:4:\"foto\";}s:6:\"import\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Imports\\Models\\Import\";s:2:\"id\";i:1;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:13:\"jobConnection\";N;s:7:\"options\";a:0:{}}s:8:\"function\";s:2925:\"function () use ($columnMap, $import, $jobConnection, $options) {\n $import->touch(\'completed_at\');\n\n event(new \\Filament\\Actions\\Imports\\Events\\ImportCompleted($import, $columnMap, $options));\n\n if (! $import->user instanceof \\Illuminate\\Contracts\\Auth\\Authenticatable) {\n return;\n }\n\n $failedRowsCount = $import->getFailedRowsCount();\n\n \\Filament\\Notifications\\Notification::make()\n ->title($import->importer::getCompletedNotificationTitle($import))\n ->body($import->importer::getCompletedNotificationBody($import))\n ->when(\n ! $failedRowsCount,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->success(),\n )\n ->when(\n $failedRowsCount && ($failedRowsCount < $import->total_rows),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->warning(),\n )\n ->when(\n $failedRowsCount === $import->total_rows,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->danger(),\n )\n ->when(\n $failedRowsCount,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->actions([\n \\Filament\\Notifications\\Actions\\Action::make(\'downloadFailedRowsCsv\')\n ->label(trans_choice(\'filament-actions::import.notifications.completed.actions.download_failed_rows_csv.label\', $failedRowsCount, [\n \'count\' => \\Illuminate\\Support\\Number::format($failedRowsCount),\n ]))\n ->color(\'danger\')\n ->url(route(\'filament.imports.failed-rows.download\', [\'import\' => $import], absolute: false), shouldOpenInNewTab: true)\n ->markAsRead(),\n ]),\n )\n ->when(\n ($jobConnection === \'sync\') ||\n (blank($jobConnection) && (config(\'queue.default\') === \'sync\')),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification\n ->persistent()\n ->send(),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->sendToDatabase($import->user, isEventDispatched: true),\n );\n }\";s:5:\"scope\";s:36:\"Filament\\Tables\\Actions\\ImportAction\";s:4:\"this\";N;s:4:\"self\";s:32:\"0000000000000e0e0000000000000000\";}\";s:4:\"hash\";s:44:\"Il55kOM50sNFDkx0J1btTaCHBmZXRBPm1BERwLmAvMg=\";}}}}', NULL, 1766957102, 1766957107), ('a0b6c30f-c73e-47c8-98e4-1902f8eafaa8', '', 2, 0, 0, '[]', 'a:2:{s:13:\"allowFailures\";b:1;s:7:\"finally\";a:1:{i:0;O:47:\"Laravel\\SerializableClosure\\SerializableClosure\":1:{s:12:\"serializable\";O:46:\"Laravel\\SerializableClosure\\Serializers\\Signed\":2:{s:12:\"serializable\";s:6182:\"O:46:\"Laravel\\SerializableClosure\\Serializers\\Native\":5:{s:3:\"use\";a:1:{s:4:\"next\";O:46:\"Filament\\Actions\\Exports\\Jobs\\ExportCompletion\":7:{s:11:\"\0*\0exporter\";O:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\":3:{s:9:\"\0*\0export\";O:38:\"Filament\\Actions\\Exports\\Models\\Export\":33:{s:13:\"\0*\0connection\";s:5:\"mysql\";s:8:\"\0*\0table\";N;s:13:\"\0*\0primaryKey\";s:2:\"id\";s:10:\"\0*\0keyType\";s:3:\"int\";s:12:\"incrementing\";b:1;s:7:\"\0*\0with\";a:0:{}s:12:\"\0*\0withCount\";a:0:{}s:19:\"preventsLazyLoading\";b:0;s:10:\"\0*\0perPage\";i:15;s:6:\"exists\";b:1;s:18:\"wasRecentlyCreated\";b:1;s:28:\"\0*\0escapeWhenCastingToString\";b:0;s:13:\"\0*\0attributes\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:2;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2025-12-30 04:16:06\";s:10:\"created_at\";s:19:\"2025-12-30 04:16:05\";s:2:\"id\";i:2;s:9:\"file_name\";s:32:\"export-2-questionnaire-responses\";}s:11:\"\0*\0original\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:2;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2025-12-30 04:16:06\";s:10:\"created_at\";s:19:\"2025-12-30 04:16:05\";s:2:\"id\";i:2;s:9:\"file_name\";s:32:\"export-2-questionnaire-responses\";}s:10:\"\0*\0changes\";a:2:{s:10:\"updated_at\";s:19:\"2025-12-30 04:16:06\";s:9:\"file_name\";s:32:\"export-2-questionnaire-responses\";}s:11:\"\0*\0previous\";a:1:{s:10:\"updated_at\";s:19:\"2025-12-30 04:16:05\";}s:8:\"\0*\0casts\";a:4:{s:12:\"completed_at\";s:9:\"timestamp\";s:14:\"processed_rows\";s:7:\"integer\";s:10:\"total_rows\";s:7:\"integer\";s:15:\"successful_rows\";s:7:\"integer\";}s:17:\"\0*\0classCastCache\";a:0:{}s:21:\"\0*\0attributeCastCache\";a:0:{}s:13:\"\0*\0dateFormat\";N;s:10:\"\0*\0appends\";a:0:{}s:19:\"\0*\0dispatchesEvents\";a:0:{}s:14:\"\0*\0observables\";a:0:{}s:12:\"\0*\0relations\";a:0:{}s:10:\"\0*\0touches\";a:0:{}s:27:\"\0*\0relationAutoloadCallback\";N;s:26:\"\0*\0relationAutoloadContext\";N;s:10:\"timestamps\";b:1;s:13:\"usesUniqueIds\";b:0;s:9:\"\0*\0hidden\";a:0:{}s:10:\"\0*\0visible\";a:0:{}s:11:\"\0*\0fillable\";a:0:{}s:10:\"\0*\0guarded\";a:0:{}}s:12:\"\0*\0columnMap\";a:6:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0options\";a:0:{}}s:9:\"\0*\0export\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Exports\\Models\\Export\";s:2:\"id\";i:2;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:12:\"\0*\0columnMap\";a:6:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0formats\";a:2:{i:0;E:47:\"Filament\\Actions\\Exports\\Enums\\ExportFormat:Csv\";i:1;E:48:\"Filament\\Actions\\Exports\\Enums\\ExportFormat:Xlsx\";}s:10:\"\0*\0options\";a:0:{}s:7:\"chained\";a:1:{i:0;s:2742:\"O:44:\"Filament\\Actions\\Exports\\Jobs\\CreateXlsxFile\":4:{s:11:\"\0*\0exporter\";O:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\":3:{s:9:\"\0*\0export\";O:38:\"Filament\\Actions\\Exports\\Models\\Export\":33:{s:13:\"\0*\0connection\";s:5:\"mysql\";s:8:\"\0*\0table\";N;s:13:\"\0*\0primaryKey\";s:2:\"id\";s:10:\"\0*\0keyType\";s:3:\"int\";s:12:\"incrementing\";b:1;s:7:\"\0*\0with\";a:0:{}s:12:\"\0*\0withCount\";a:0:{}s:19:\"preventsLazyLoading\";b:0;s:10:\"\0*\0perPage\";i:15;s:6:\"exists\";b:1;s:18:\"wasRecentlyCreated\";b:1;s:28:\"\0*\0escapeWhenCastingToString\";b:0;s:13:\"\0*\0attributes\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:2;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2025-12-30 04:16:06\";s:10:\"created_at\";s:19:\"2025-12-30 04:16:05\";s:2:\"id\";i:2;s:9:\"file_name\";s:32:\"export-2-questionnaire-responses\";}s:11:\"\0*\0original\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:2;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2025-12-30 04:16:06\";s:10:\"created_at\";s:19:\"2025-12-30 04:16:05\";s:2:\"id\";i:2;s:9:\"file_name\";s:32:\"export-2-questionnaire-responses\";}s:10:\"\0*\0changes\";a:2:{s:10:\"updated_at\";s:19:\"2025-12-30 04:16:06\";s:9:\"file_name\";s:32:\"export-2-questionnaire-responses\";}s:11:\"\0*\0previous\";a:1:{s:10:\"updated_at\";s:19:\"2025-12-30 04:16:05\";}s:8:\"\0*\0casts\";a:4:{s:12:\"completed_at\";s:9:\"timestamp\";s:14:\"processed_rows\";s:7:\"integer\";s:10:\"total_rows\";s:7:\"integer\";s:15:\"successful_rows\";s:7:\"integer\";}s:17:\"\0*\0classCastCache\";a:0:{}s:21:\"\0*\0attributeCastCache\";a:0:{}s:13:\"\0*\0dateFormat\";N;s:10:\"\0*\0appends\";a:0:{}s:19:\"\0*\0dispatchesEvents\";a:0:{}s:14:\"\0*\0observables\";a:0:{}s:12:\"\0*\0relations\";a:0:{}s:10:\"\0*\0touches\";a:0:{}s:27:\"\0*\0relationAutoloadCallback\";N;s:26:\"\0*\0relationAutoloadContext\";N;s:10:\"timestamps\";b:1;s:13:\"usesUniqueIds\";b:0;s:9:\"\0*\0hidden\";a:0:{}s:10:\"\0*\0visible\";a:0:{}s:11:\"\0*\0fillable\";a:0:{}s:10:\"\0*\0guarded\";a:0:{}}s:12:\"\0*\0columnMap\";a:6:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0options\";a:0:{}}s:9:\"\0*\0export\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Exports\\Models\\Export\";s:2:\"id\";i:2;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:12:\"\0*\0columnMap\";a:6:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0options\";a:0:{}}\";}s:19:\"chainCatchCallbacks\";a:0:{}}}s:8:\"function\";s:266:\"function (\\Illuminate\\Bus\\Batch $batch) use ($next) {\n if (! $batch->cancelled()) {\n \\Illuminate\\Container\\Container::getInstance()->make(\\Illuminate\\Contracts\\Bus\\Dispatcher::class)->dispatch($next);\n }\n }\";s:5:\"scope\";s:27:\"Illuminate\\Bus\\ChainedBatch\";s:4:\"this\";N;s:4:\"self\";s:32:\"00000000000008fd0000000000000000\";}\";s:4:\"hash\";s:44:\"LYnbg9f8eVk3HQiI2EPE64SkSGp8Ss/aI1Ho8geoFDI=\";}}}}', NULL, 1767068170, 1767068171), ('a0bee752-6f7c-4ad8-a672-301fa493da46', '', 1, 0, 0, '[]', 'a:2:{s:13:\"allowFailures\";b:1;s:7:\"finally\";a:1:{i:0;O:47:\"Laravel\\SerializableClosure\\SerializableClosure\":1:{s:12:\"serializable\";O:46:\"Laravel\\SerializableClosure\\Serializers\\Signed\":2:{s:12:\"serializable\";s:3952:\"O:46:\"Laravel\\SerializableClosure\\Serializers\\Native\":5:{s:3:\"use\";a:4:{s:9:\"columnMap\";a:17:{s:3:\"nim\";s:3:\"nim\";s:8:\"username\";s:8:\"username\";s:11:\"birth_place\";s:11:\"birth_place\";s:10:\"birth_date\";s:10:\"birth_date\";s:6:\"gender\";s:6:\"gender\";s:7:\"address\";s:7:\"address\";s:12:\"phone_number\";s:12:\"phone_number\";s:5:\"email\";s:5:\"email\";s:3:\"gpa\";s:3:\"gpa\";s:7:\"faculty\";s:7:\"faculty\";s:5:\"major\";s:5:\"major\";s:10:\"entry_year\";s:10:\"entry_year\";s:15:\"graduation_year\";s:15:\"graduation_year\";s:6:\"status\";s:6:\"status\";s:12:\"job_position\";s:12:\"job_position\";s:12:\"company_name\";s:12:\"company_name\";s:4:\"foto\";s:4:\"foto\";}s:6:\"import\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Imports\\Models\\Import\";s:2:\"id\";i:2;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:13:\"jobConnection\";N;s:7:\"options\";a:0:{}}s:8:\"function\";s:2925:\"function () use ($columnMap, $import, $jobConnection, $options) {\n $import->touch(\'completed_at\');\n\n event(new \\Filament\\Actions\\Imports\\Events\\ImportCompleted($import, $columnMap, $options));\n\n if (! $import->user instanceof \\Illuminate\\Contracts\\Auth\\Authenticatable) {\n return;\n }\n\n $failedRowsCount = $import->getFailedRowsCount();\n\n \\Filament\\Notifications\\Notification::make()\n ->title($import->importer::getCompletedNotificationTitle($import))\n ->body($import->importer::getCompletedNotificationBody($import))\n ->when(\n ! $failedRowsCount,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->success(),\n )\n ->when(\n $failedRowsCount && ($failedRowsCount < $import->total_rows),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->warning(),\n )\n ->when(\n $failedRowsCount === $import->total_rows,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->danger(),\n )\n ->when(\n $failedRowsCount,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->actions([\n \\Filament\\Notifications\\Actions\\Action::make(\'downloadFailedRowsCsv\')\n ->label(trans_choice(\'filament-actions::import.notifications.completed.actions.download_failed_rows_csv.label\', $failedRowsCount, [\n \'count\' => \\Illuminate\\Support\\Number::format($failedRowsCount),\n ]))\n ->color(\'danger\')\n ->url(route(\'filament.imports.failed-rows.download\', [\'import\' => $import], absolute: false), shouldOpenInNewTab: true)\n ->markAsRead(),\n ]),\n )\n ->when(\n ($jobConnection === \'sync\') ||\n (blank($jobConnection) && (config(\'queue.default\') === \'sync\')),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification\n ->persistent()\n ->send(),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->sendToDatabase($import->user, isEventDispatched: true),\n );\n }\";s:5:\"scope\";s:36:\"Filament\\Tables\\Actions\\ImportAction\";s:4:\"this\";N;s:4:\"self\";s:32:\"0000000000000e0e0000000000000000\";}\";s:4:\"hash\";s:44:\"GCZAyQdkaHJYMqjhOd28P1Xgsw5xrUOo6jYQ3ta+7s8=\";}}}}', NULL, 1767417852, 1767417857), ('a0d35e04-f74d-41a6-aef0-e8e37eafc79e', '', 2, 0, 0, '[]', 'a:2:{s:13:\"allowFailures\";b:1;s:7:\"finally\";a:1:{i:0;O:47:\"Laravel\\SerializableClosure\\SerializableClosure\":1:{s:12:\"serializable\";O:46:\"Laravel\\SerializableClosure\\Serializers\\Signed\":2:{s:12:\"serializable\";s:7984:\"O:46:\"Laravel\\SerializableClosure\\Serializers\\Native\":5:{s:3:\"use\";a:1:{s:4:\"next\";O:46:\"Filament\\Actions\\Exports\\Jobs\\ExportCompletion\":7:{s:11:\"\0*\0exporter\";O:35:\"App\\Filament\\Exports\\AlumniExporter\":3:{s:9:\"\0*\0export\";O:38:\"Filament\\Actions\\Exports\\Models\\Export\":33:{s:13:\"\0*\0connection\";s:5:\"mysql\";s:8:\"\0*\0table\";N;s:13:\"\0*\0primaryKey\";s:2:\"id\";s:10:\"\0*\0keyType\";s:3:\"int\";s:12:\"incrementing\";b:1;s:7:\"\0*\0with\";a:0:{}s:12:\"\0*\0withCount\";a:0:{}s:19:\"preventsLazyLoading\";b:0;s:10:\"\0*\0perPage\";i:15;s:6:\"exists\";b:1;s:18:\"wasRecentlyCreated\";b:1;s:28:\"\0*\0escapeWhenCastingToString\";b:0;s:13:\"\0*\0attributes\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:35:\"App\\Filament\\Exports\\AlumniExporter\";s:10:\"total_rows\";i:13;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-01-13 09:32:35\";s:10:\"created_at\";s:19:\"2026-01-13 09:32:33\";s:2:\"id\";i:3;s:9:\"file_name\";s:16:\"export-3-alumnis\";}s:11:\"\0*\0original\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:35:\"App\\Filament\\Exports\\AlumniExporter\";s:10:\"total_rows\";i:13;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-01-13 09:32:35\";s:10:\"created_at\";s:19:\"2026-01-13 09:32:33\";s:2:\"id\";i:3;s:9:\"file_name\";s:16:\"export-3-alumnis\";}s:10:\"\0*\0changes\";a:2:{s:10:\"updated_at\";s:19:\"2026-01-13 09:32:35\";s:9:\"file_name\";s:16:\"export-3-alumnis\";}s:11:\"\0*\0previous\";a:1:{s:10:\"updated_at\";s:19:\"2026-01-13 09:32:33\";}s:8:\"\0*\0casts\";a:4:{s:12:\"completed_at\";s:9:\"timestamp\";s:14:\"processed_rows\";s:7:\"integer\";s:10:\"total_rows\";s:7:\"integer\";s:15:\"successful_rows\";s:7:\"integer\";}s:17:\"\0*\0classCastCache\";a:0:{}s:21:\"\0*\0attributeCastCache\";a:0:{}s:13:\"\0*\0dateFormat\";N;s:10:\"\0*\0appends\";a:0:{}s:19:\"\0*\0dispatchesEvents\";a:0:{}s:14:\"\0*\0observables\";a:0:{}s:12:\"\0*\0relations\";a:0:{}s:10:\"\0*\0touches\";a:0:{}s:27:\"\0*\0relationAutoloadCallback\";N;s:26:\"\0*\0relationAutoloadContext\";N;s:10:\"timestamps\";b:1;s:13:\"usesUniqueIds\";b:0;s:9:\"\0*\0hidden\";a:0:{}s:10:\"\0*\0visible\";a:0:{}s:11:\"\0*\0fillable\";a:0:{}s:10:\"\0*\0guarded\";a:0:{}}s:12:\"\0*\0columnMap\";a:21:{s:2:\"id\";s:2:\"ID\";s:3:\"nim\";s:3:\"NIM\";s:8:\"username\";s:11:\"Nama Alumni\";s:11:\"birth_place\";s:12:\"Tempat Lahir\";s:10:\"birth_date\";s:13:\"Tanggal Lahir\";s:6:\"gender\";s:13:\"Jenis Kelamin\";s:7:\"address\";s:6:\"Alamat\";s:12:\"phone_number\";s:5:\"No HP\";s:5:\"email\";s:5:\"Email\";s:3:\"gpa\";s:3:\"IPK\";s:7:\"faculty\";s:8:\"Fakultas\";s:5:\"major\";s:13:\"Program Studi\";s:10:\"entry_year\";s:11:\"Tahun Masuk\";s:15:\"graduation_year\";s:11:\"Tahun Lulus\";s:6:\"status\";s:6:\"Status\";s:14:\"category_field\";s:15:\"Kategori Bidang\";s:14:\"waiting_period\";s:11:\"Masa Tunggu\";s:12:\"job_position\";s:16:\"Posisi Pekerjaan\";s:12:\"company_name\";s:24:\"Nama Instansi/Perusahaan\";s:10:\"created_at\";s:14:\"Tanggal dibuat\";s:10:\"updated_at\";s:18:\"Tanggal diperbarui\";}s:10:\"\0*\0options\";a:0:{}}s:9:\"\0*\0export\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Exports\\Models\\Export\";s:2:\"id\";i:3;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:12:\"\0*\0columnMap\";a:21:{s:2:\"id\";s:2:\"ID\";s:3:\"nim\";s:3:\"NIM\";s:8:\"username\";s:11:\"Nama Alumni\";s:11:\"birth_place\";s:12:\"Tempat Lahir\";s:10:\"birth_date\";s:13:\"Tanggal Lahir\";s:6:\"gender\";s:13:\"Jenis Kelamin\";s:7:\"address\";s:6:\"Alamat\";s:12:\"phone_number\";s:5:\"No HP\";s:5:\"email\";s:5:\"Email\";s:3:\"gpa\";s:3:\"IPK\";s:7:\"faculty\";s:8:\"Fakultas\";s:5:\"major\";s:13:\"Program Studi\";s:10:\"entry_year\";s:11:\"Tahun Masuk\";s:15:\"graduation_year\";s:11:\"Tahun Lulus\";s:6:\"status\";s:6:\"Status\";s:14:\"category_field\";s:15:\"Kategori Bidang\";s:14:\"waiting_period\";s:11:\"Masa Tunggu\";s:12:\"job_position\";s:16:\"Posisi Pekerjaan\";s:12:\"company_name\";s:24:\"Nama Instansi/Perusahaan\";s:10:\"created_at\";s:14:\"Tanggal dibuat\";s:10:\"updated_at\";s:18:\"Tanggal diperbarui\";}s:10:\"\0*\0formats\";a:2:{i:0;E:47:\"Filament\\Actions\\Exports\\Enums\\ExportFormat:Csv\";i:1;E:48:\"Filament\\Actions\\Exports\\Enums\\ExportFormat:Xlsx\";}s:10:\"\0*\0options\";a:0:{}s:7:\"chained\";a:1:{i:0;s:3643:\"O:44:\"Filament\\Actions\\Exports\\Jobs\\CreateXlsxFile\":4:{s:11:\"\0*\0exporter\";O:35:\"App\\Filament\\Exports\\AlumniExporter\":3:{s:9:\"\0*\0export\";O:38:\"Filament\\Actions\\Exports\\Models\\Export\":33:{s:13:\"\0*\0connection\";s:5:\"mysql\";s:8:\"\0*\0table\";N;s:13:\"\0*\0primaryKey\";s:2:\"id\";s:10:\"\0*\0keyType\";s:3:\"int\";s:12:\"incrementing\";b:1;s:7:\"\0*\0with\";a:0:{}s:12:\"\0*\0withCount\";a:0:{}s:19:\"preventsLazyLoading\";b:0;s:10:\"\0*\0perPage\";i:15;s:6:\"exists\";b:1;s:18:\"wasRecentlyCreated\";b:1;s:28:\"\0*\0escapeWhenCastingToString\";b:0;s:13:\"\0*\0attributes\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:35:\"App\\Filament\\Exports\\AlumniExporter\";s:10:\"total_rows\";i:13;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-01-13 09:32:35\";s:10:\"created_at\";s:19:\"2026-01-13 09:32:33\";s:2:\"id\";i:3;s:9:\"file_name\";s:16:\"export-3-alumnis\";}s:11:\"\0*\0original\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:35:\"App\\Filament\\Exports\\AlumniExporter\";s:10:\"total_rows\";i:13;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-01-13 09:32:35\";s:10:\"created_at\";s:19:\"2026-01-13 09:32:33\";s:2:\"id\";i:3;s:9:\"file_name\";s:16:\"export-3-alumnis\";}s:10:\"\0*\0changes\";a:2:{s:10:\"updated_at\";s:19:\"2026-01-13 09:32:35\";s:9:\"file_name\";s:16:\"export-3-alumnis\";}s:11:\"\0*\0previous\";a:1:{s:10:\"updated_at\";s:19:\"2026-01-13 09:32:33\";}s:8:\"\0*\0casts\";a:4:{s:12:\"completed_at\";s:9:\"timestamp\";s:14:\"processed_rows\";s:7:\"integer\";s:10:\"total_rows\";s:7:\"integer\";s:15:\"successful_rows\";s:7:\"integer\";}s:17:\"\0*\0classCastCache\";a:0:{}s:21:\"\0*\0attributeCastCache\";a:0:{}s:13:\"\0*\0dateFormat\";N;s:10:\"\0*\0appends\";a:0:{}s:19:\"\0*\0dispatchesEvents\";a:0:{}s:14:\"\0*\0observables\";a:0:{}s:12:\"\0*\0relations\";a:0:{}s:10:\"\0*\0touches\";a:0:{}s:27:\"\0*\0relationAutoloadCallback\";N;s:26:\"\0*\0relationAutoloadContext\";N;s:10:\"timestamps\";b:1;s:13:\"usesUniqueIds\";b:0;s:9:\"\0*\0hidden\";a:0:{}s:10:\"\0*\0visible\";a:0:{}s:11:\"\0*\0fillable\";a:0:{}s:10:\"\0*\0guarded\";a:0:{}}s:12:\"\0*\0columnMap\";a:21:{s:2:\"id\";s:2:\"ID\";s:3:\"nim\";s:3:\"NIM\";s:8:\"username\";s:11:\"Nama Alumni\";s:11:\"birth_place\";s:12:\"Tempat Lahir\";s:10:\"birth_date\";s:13:\"Tanggal Lahir\";s:6:\"gender\";s:13:\"Jenis Kelamin\";s:7:\"address\";s:6:\"Alamat\";s:12:\"phone_number\";s:5:\"No HP\";s:5:\"email\";s:5:\"Email\";s:3:\"gpa\";s:3:\"IPK\";s:7:\"faculty\";s:8:\"Fakultas\";s:5:\"major\";s:13:\"Program Studi\";s:10:\"entry_year\";s:11:\"Tahun Masuk\";s:15:\"graduation_year\";s:11:\"Tahun Lulus\";s:6:\"status\";s:6:\"Status\";s:14:\"category_field\";s:15:\"Kategori Bidang\";s:14:\"waiting_period\";s:11:\"Masa Tunggu\";s:12:\"job_position\";s:16:\"Posisi Pekerjaan\";s:12:\"company_name\";s:24:\"Nama Instansi/Perusahaan\";s:10:\"created_at\";s:14:\"Tanggal dibuat\";s:10:\"updated_at\";s:18:\"Tanggal diperbarui\";}s:10:\"\0*\0options\";a:0:{}}s:9:\"\0*\0export\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Exports\\Models\\Export\";s:2:\"id\";i:3;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:12:\"\0*\0columnMap\";a:21:{s:2:\"id\";s:2:\"ID\";s:3:\"nim\";s:3:\"NIM\";s:8:\"username\";s:11:\"Nama Alumni\";s:11:\"birth_place\";s:12:\"Tempat Lahir\";s:10:\"birth_date\";s:13:\"Tanggal Lahir\";s:6:\"gender\";s:13:\"Jenis Kelamin\";s:7:\"address\";s:6:\"Alamat\";s:12:\"phone_number\";s:5:\"No HP\";s:5:\"email\";s:5:\"Email\";s:3:\"gpa\";s:3:\"IPK\";s:7:\"faculty\";s:8:\"Fakultas\";s:5:\"major\";s:13:\"Program Studi\";s:10:\"entry_year\";s:11:\"Tahun Masuk\";s:15:\"graduation_year\";s:11:\"Tahun Lulus\";s:6:\"status\";s:6:\"Status\";s:14:\"category_field\";s:15:\"Kategori Bidang\";s:14:\"waiting_period\";s:11:\"Masa Tunggu\";s:12:\"job_position\";s:16:\"Posisi Pekerjaan\";s:12:\"company_name\";s:24:\"Nama Instansi/Perusahaan\";s:10:\"created_at\";s:14:\"Tanggal dibuat\";s:10:\"updated_at\";s:18:\"Tanggal diperbarui\";}s:10:\"\0*\0options\";a:0:{}}\";}s:19:\"chainCatchCallbacks\";a:0:{}}}s:8:\"function\";s:266:\"function (\\Illuminate\\Bus\\Batch $batch) use ($next) {\n if (! $batch->cancelled()) {\n \\Illuminate\\Container\\Container::getInstance()->make(\\Illuminate\\Contracts\\Bus\\Dispatcher::class)->dispatch($next);\n }\n }\";s:5:\"scope\";s:27:\"Illuminate\\Bus\\ChainedBatch\";s:4:\"this\";N;s:4:\"self\";s:32:\"00000000000008fd0000000000000000\";}\";s:4:\"hash\";s:44:\"eMaUhkuyXG6iehMNkJX6EIaLtEgZoE5Cwa2qF4TWSfM=\";}}}}', NULL, 1768296759, 1768296760), ('a0d36a1f-1bef-439d-b045-3647f3b37b25', '', 1, 0, 0, '[]', 'a:2:{s:13:\"allowFailures\";b:1;s:7:\"finally\";a:1:{i:0;O:47:\"Laravel\\SerializableClosure\\SerializableClosure\":1:{sÿÿ:12:\"serializable\";O:46:\"Laravel\\SerializableClosure\\Serializers\\Signed\":2:{s:12:\"serializable\";s:4040:\"O:46:\"Laravel\\SerializableClosure\\Serializers\\Native\":5:{s:3:\"use\";a:4:{s:9:\"columnMap\";a:19:{s:3:\"nim\";s:3:\"nim\";s:8:\"username\";s:8:\"username\";s:11:\"birth_place\";s:11:\"birth_place\";s:10:\"birth_date\";s:10:\"birth_date\";s:6:\"gender\";s:6:\"gender\";s:7:\"address\";s:7:\"address\";s:12:\"phone_number\";s:12:\"phone_number\";s:5:\"email\";s:5:\"email\";s:3:\"gpa\";s:3:\"gpa\";s:7:\"faculty\";s:7:\"faculty\";s:5:\"major\";s:5:\"major\";s:10:\"entry_year\";s:10:\"entry_year\";s:15:\"graduation_year\";s:15:\"graduation_year\";s:6:\"status\";s:6:\"status\";s:14:\"category_field\";s:14:\"category_field\";s:14:\"waiting_period\";s:14:\"waiting_period\";s:12:\"job_position\";s:12:\"job_position\";s:12:\"company_name\";s:12:\"company_name\";s:4:\"foto\";s:4:\"foto\";}s:6:\"import\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Imports\\Models\\Import\";s:2:\"id\";i:5;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:13:\"jobConnection\";N;s:7:\"options\";a:0:{}}s:8:\"function\";s:2925:\"function () use ($columnMap, $import, $jobConnection, $options) {\n $import->touch(\'completed_at\');\n\n event(new \\Filament\\Actions\\Imports\\Events\\ImportCompleted($import, $columnMap, $options));\n\n if (! $import->user instanceof \\Illuminate\\Contracts\\Auth\\Authenticatable) {\n return;\n }\n\n $failedRowsCount = $import->getFailedRowsCount();\n\n \\Filament\\Notifications\\Notification::make()\n ->title($import->importer::getCompletedNotificationTitle($import))\n ->body($import->importer::getCompletedNotificationBody($import))\n ->when(\n ! $failedRowsCount,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->success(),\n )\n ->when(\n $failedRowsCount && ($failedRowsCount < $import->total_rows),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->warning(),\n )\n ->when(\n $failedRowsCount === $import->total_rows,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->danger(),\n )\n ->when(\n $failedRowsCount,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->actions([\n \\Filament\\Notifications\\Actions\\Action::make(\'downloadFailedRowsCsv\')\n ->label(trans_choice(\'filament-actions::import.notifications.completed.actions.download_failed_rows_csv.label\', $failedRowsCount, [\n \'count\' => \\Illuminate\\Support\\Number::format($failedRowsCount),\n ]))\n ->color(\'danger\')\n ->url(route(\'filament.imports.failed-rows.download\', [\'import\' => $import], absolute: false), shouldOpenInNewTab: true)\n ->markAsRead(),\n ]),\n )\n ->when(\n ($jobConnection === \'sync\') ||\n (blank($jobConnection) && (config(\'queue.default\') === \'sync\')),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification\n ->persistent()\n ->send(),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->sendToDatabase($import->user, isEventDispatched: true),\n );\n }\";s:5:\"scope\";s:36:\"Filament\\Tables\\Actions\\ImportAction\";s:4:\"this\";N;s:4:\"self\";s:32:\"0000000000000ea30000000000000000\";}\";s:4:\"hash\";s:44:\"GW5zTMvFxTdGGeVixyQBmL8UQ2Z5B8pP4RkvrmLwlwg=\";}}}}', NULL, 1768298789, 1768298794); INSERT INTO `job_batches` (`id`, `name`, `total_jobs`, `pending_jobs`, `failed_jobs`, `failed_job_ids`, `options`, `cancelled_at`, `created_at`, `finished_at`) VALUES ('a0ef7ec8-8c61-4a5d-b019-79294f90db93', '', 2, 0, 0, '[]', 'a:2:{s:13:\"allowFailures\";b:1;s:7:\"finally\";a:1:{i:0;O:47:\"Laravel\\SerializableClosure\\SerializableClosure\":1:{s:12:\"serializable\";O:46:\"Laravel\\SerializableClosure\\Serializers\\Signed\":2:{s:12:\"serializable\";s:6006:\"O:46:\"Laravel\\SerializableClosure\\Serializers\\Native\":5:{s:3:\"use\";a:1:{s:4:\"next\";O:46:\"Filament\\Actions\\Exports\\Jobs\\ExportCompletion\":7:{s:11:\"\0*\0exporter\";O:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\":3:{s:9:\"\0*\0export\";O:38:\"Filament\\Actions\\Exports\\Models\\Export\":33:{s:13:\"\0*\0connection\";s:5:\"mysql\";s:8:\"\0*\0table\";N;s:13:\"\0*\0primaryKey\";s:2:\"id\";s:10:\"\0*\0keyType\";s:3:\"int\";s:12:\"incrementing\";b:1;s:7:\"\0*\0with\";a:0:{}s:12:\"\0*\0withCount\";a:0:{}s:19:\"preventsLazyLoading\";b:0;s:10:\"\0*\0perPage\";i:15;s:6:\"exists\";b:1;s:18:\"wasRecentlyCreated\";b:1;s:28:\"\0*\0escapeWhenCastingToString\";b:0;s:13:\"\0*\0attributes\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:10;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-01-27 09:07:22\";s:10:\"created_at\";s:19:\"2026-01-27 09:07:22\";s:2:\"id\";i:4;s:9:\"file_name\";s:32:\"export-4-questionnaire-responses\";}s:11:\"\0*\0original\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:10;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-01-27 09:07:22\";s:10:\"created_at\";s:19:\"2026-01-27 09:07:22\";s:2:\"id\";i:4;s:9:\"file_name\";s:32:\"export-4-questionnaire-responses\";}s:10:\"\0*\0changes\";a:1:{s:9:\"file_name\";s:32:\"export-4-questionnaire-responses\";}s:11:\"\0*\0previous\";a:0:{}s:8:\"\0*\0casts\";a:4:{s:12:\"completed_at\";s:9:\"timestamp\";s:14:\"processed_rows\";s:7:\"integer\";s:10:\"total_rows\";s:7:\"integer\";s:15:\"successful_rows\";s:7:\"integer\";}s:17:\"\0*\0classCastCache\";a:0:{}s:21:\"\0*\0attributeCastCache\";a:0:{}s:13:\"\0*\0dateFormat\";N;s:10:\"\0*\0appends\";a:0:{}s:19:\"\0*\0dispatchesEvents\";a:0:{}s:14:\"\0*\0observables\";a:0:{}s:12:\"\0*\0relations\";a:0:{}s:10:\"\0*\0touches\";a:0:{}s:27:\"\0*\0relationAutoloadCallback\";N;s:26:\"\0*\0relationAutoloadContext\";N;s:10:\"timestamps\";b:1;s:13:\"usesUniqueIds\";b:0;s:9:\"\0*\0hidden\";a:0:{}s:10:\"\0*\0visible\";a:0:{}s:11:\"\0*\0fillable\";a:0:{}s:10:\"\0*\0guarded\";a:0:{}}s:12:\"\0*\0columnMap\";a:6:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0options\";a:0:{}}s:9:\"\0*\0export\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Exports\\Models\\Export\";s:2:\"id\";i:4;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:12:\"\0*\0columnMap\";a:6:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0formats\";a:2:{i:0;E:47:\"Filament\\Actions\\Exports\\Enums\\ExportFormat:Csv\";i:1;E:48:\"Filament\\Actions\\Exports\\Enums\\ExportFormat:Xlsx\";}s:10:\"\0*\0options\";a:0:{}s:7:\"chained\";a:1:{i:0;s:2654:\"O:44:\"Filament\\Actions\\Exports\\Jobs\\CreateXlsxFile\":4:{s:11:\"\0*\0exporter\";O:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\":3:{s:9:\"\0*\0export\";O:38:\"Filament\\Actions\\Exports\\Models\\Export\":33:{s:13:\"\0*\0connection\";s:5:\"mysql\";s:8:\"\0*\0table\";N;s:13:\"\0*\0primaryKey\";s:2:\"id\";s:10:\"\0*\0keyType\";s:3:\"int\";s:12:\"incrementing\";b:1;s:7:\"\0*\0with\";a:0:{}s:12:\"\0*\0withCount\";a:0:{}s:19:\"preventsLazyLoading\";b:0;s:10:\"\0*\0perPage\";i:15;s:6:\"exists\";b:1;s:18:\"wasRecentlyCreated\";b:1;s:28:\"\0*\0escapeWhenCastingToString\";b:0;s:13:\"\0*\0attributes\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:10;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-01-27 09:07:22\";s:10:\"created_at\";s:19:\"2026-01-27 09:07:22\";s:2:\"id\";i:4;s:9:\"file_name\";s:32:\"export-4-questionnaire-responses\";}s:11:\"\0*\0original\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:10;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-01-27 09:07:22\";s:10:\"created_at\";s:19:\"2026-01-27 09:07:22\";s:2:\"id\";i:4;s:9:\"file_name\";s:32:\"export-4-questionnaire-responses\";}s:10:\"\0*\0changes\";a:1:{s:9:\"file_name\";s:32:\"export-4-questionnaire-responses\";}s:11:\"\0*\0previous\";a:0:{}s:8:\"\0*\0casts\";a:4:{s:12:\"completed_at\";s:9:\"timestamp\";s:14:\"processed_rows\";s:7:\"integer\";s:10:\"total_rows\";s:7:\"integer\";s:15:\"successful_rows\";s:7:\"integer\";}s:17:\"\0*\0classCastCache\";a:0:{}s:21:\"\0*\0attributeCastCache\";a:0:{}s:13:\"\0*\0dateFormat\";N;s:10:\"\0*\0appends\";a:0:{}s:19:\"\0*\0dispatchesEvents\";a:0:{}s:14:\"\0*\0observables\";a:0:{}s:12:\"\0*\0relations\";a:0:{}s:10:\"\0*\0touches\";a:0:{}s:27:\"\0*\0relationAutoloadCallback\";N;s:26:\"\0*\0relationAutoloadContext\";N;s:10:\"timestamps\";b:1;s:13:\"usesUniqueIds\";b:0;s:9:\"\0*\0hidden\";a:0:{}s:10:\"\0*\0visible\";a:0:{}s:11:\"\0*\0fillable\";a:0:{}s:10:\"\0*\0guarded\";a:0:{}}s:12:\"\0*\0columnMap\";a:6:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0options\";a:0:{}}s:9:\"\0*\0export\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Exports\\Models\\Export\";s:2:\"id\";i:4;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:12:\"\0*\0columnMap\";a:6:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0options\";a:0:{}}\";}s:19:\"chainCatchCallbacks\";a:0:{}}}s:8:\"function\";s:266:\"function (\\Illuminate\\Bus\\Batch $batch) use ($next) {\n if (! $batch->cancelled()) {\n \\Illuminate\\Container\\Container::getInstance()->make(\\Illuminate\\Contracts\\Bus\\Dispatcher::class)->dispatch($next);\n }\n }\";s:5:\"scope\";s:27:\"Illuminate\\Bus\\ChainedBatch\";s:4:\"this\";N;s:4:\"self\";s:32:\"00000000000009260000000000000000\";}\";s:4:\"hash\";s:44:\"71kZRCoXQupQTIZKNNfO0c89dX8YTVq8Sxk7a46ap2A=\";}}}}', NULL, 1769504847, 1769504847), ('a0f39b8e-ec88-46f2-84f1-7fee5144d044', '', 2, 0, 0, '[]', 'a:2:{s:13:\"allowFailures\";b:1;s:7:\"finally\";a:1:{i:0;O:47:\"Laravel\\SerializableClosure\\SerializableClosure\":1:{s:12:\"serializable\";O:46:\"Laravel\\SerializableClosure\\Serializers\\Signed\":2:{s:12:\"serializable\";s:6182:\"O:46:\"Laravel\\SerializableClosure\\Serializers\\Native\":5:{s:3:\"use\";a:1:{s:4:\"next\";O:46:\"Filament\\Actions\\Exports\\Jobs\\ExportCompletion\":7:{s:11:\"\0*\0exporter\";O:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\":3:{s:9:\"\0*\0export\";O:38:\"Filament\\Actions\\Exports\\Models\\Export\":33:{s:13:\"\0*\0connection\";s:5:\"mysql\";s:8:\"\0*\0table\";N;s:13:\"\0*\0primaryKey\";s:2:\"id\";s:10:\"\0*\0keyType\";s:3:\"int\";s:12:\"incrementing\";b:1;s:7:\"\0*\0with\";a:0:{}s:12:\"\0*\0withCount\";a:0:{}s:19:\"preventsLazyLoading\";b:0;s:10:\"\0*\0perPage\";i:15;s:6:\"exists\";b:1;s:18:\"wasRecentlyCreated\";b:1;s:28:\"\0*\0escapeWhenCastingToString\";b:0;s:13:\"\0*\0attributes\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:7;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-01-29 10:11:06\";s:10:\"created_at\";s:19:\"2026-01-29 10:11:05\";s:2:\"id\";i:5;s:9:\"file_name\";s:32:\"export-5-questionnaire-responses\";}s:11:\"\0*\0original\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:7;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-01-29 10:11:06\";s:10:\"created_at\";s:19:\"2026-01-29 10:11:05\";s:2:\"id\";i:5;s:9:\"file_name\";s:32:\"export-5-questionnaire-responses\";}s:10:\"\0*\0changes\";a:2:{s:10:\"updated_at\";s:19:\"2026-01-29 10:11:06\";s:9:\"file_name\";s:32:\"export-5-questionnaire-responses\";}s:11:\"\0*\0previous\";a:1:{s:10:\"updated_at\";s:19:\"2026-01-29 10:11:05\";}s:8:\"\0*\0casts\";a:4:{s:12:\"completed_at\";s:9:\"timestamp\";s:14:\"processed_rows\";s:7:\"integer\";s:10:\"total_rows\";s:7:\"integer\";s:15:\"successful_rows\";s:7:\"integer\";}s:17:\"\0*\0classCastCache\";a:0:{}s:21:\"\0*\0attributeCastCache\";a:0:{}s:13:\"\0*\0dateFormat\";N;s:10:\"\0*\0appends\";a:0:{}s:19:\"\0*\0dispatchesEvents\";a:0:{}s:14:\"\0*\0observables\";a:0:{}s:12:\"\0*\0relations\";a:0:{}s:10:\"\0*\0touches\";a:0:{}s:27:\"\0*\0relationAutoloadCallback\";N;s:26:\"\0*\0relationAutoloadContext\";N;s:10:\"timestamps\";b:1;s:13:\"usesUniqueIds\";b:0;s:9:\"\0*\0hidden\";a:0:{}s:10:\"\0*\0visible\";a:0:{}s:11:\"\0*\0fillable\";a:0:{}s:10:\"\0*\0guarded\";a:0:{}}s:12:\"\0*\0columnMap\";a:6:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0options\";a:0:{}}s:9:\"\0*\0export\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Exports\\Models\\Export\";s:2:\"id\";i:5;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:12:\"\0*\0columnMap\";a:6:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0formats\";a:2:{i:0;E:47:\"Filament\\Actions\\Exports\\Enums\\ExportFormat:Csv\";i:1;E:48:\"Filament\\Actions\\Exports\\Enums\\ExportFormat:Xlsx\";}s:10:\"\0*\0options\";a:0:{}s:7:\"chained\";a:1:{i:0;s:2742:\"O:44:\"Filament\\Actions\\Exports\\Jobs\\CreateXlsxFile\":4:{s:11:\"\0*\0exporter\";O:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\":3:{s:9:\"\0*\0export\";O:38:\"Filament\\Actions\\Exports\\Models\\Export\":33:{s:13:\"\0*\0connection\";s:5:\"mysql\";s:8:\"\0*\0table\";N;s:13:\"\0*\0primaryKey\";s:2:\"id\";s:10:\"\0*\0keyType\";s:3:\"int\";s:12:\"incrementing\";b:1;s:7:\"\0*\0with\";a:0:{}s:12:\"\0*\0withCount\";a:0:{}s:19:\"preventsLazyLoading\";b:0;s:10:\"\0*\0perPage\";i:15;s:6:\"exists\";b:1;s:18:\"wasRecentlyCreated\";b:1;s:28:\"\0*\0escapeWhenCastingToString\";b:0;s:13:\"\0*\0attributes\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:7;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-01-29 10:11:06\";s:10:\"created_at\";s:19:\"2026-01-29 10:11:05\";s:2:\"id\";i:5;s:9:\"file_name\";s:32:\"export-5-questionnaire-responses\";}s:11:\"\0*\0original\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:7;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-01-29 10:11:06\";s:10:\"created_at\";s:19:\"2026-01-29 10:11:05\";s:2:\"id\";i:5;s:9:\"file_name\";s:32:\"export-5-questionnaire-responses\";}s:10:\"\0*\0changes\";a:2:{s:10:\"updated_at\";s:19:\"2026-01-29 10:11:06\";s:9:\"file_name\";s:32:\"export-5-questionnaire-responses\";}s:11:\"\0*\0previous\";a:1:{s:10:\"updated_at\";s:19:\"2026-01-29 10:11:05\";}s:8:\"\0*\0casts\";a:4:{s:12:\"completed_at\";s:9:\"timestamp\";s:14:\"processed_rows\";s:7:\"integer\";s:10:\"total_rows\";s:7:\"integer\";s:15:\"successful_rows\";s:7:\"integer\";}s:17:\"\0*\0classCastCache\";a:0:{}s:21:\"\0*\0attributeCastCache\";a:0:{}s:13:\"\0*\0dateFormat\";N;s:10:\"\0*\0appends\";a:0:{}s:19:\"\0*\0dispatchesEvents\";a:0:{}s:14:\"\0*\0observables\";a:0:{}s:12:\"\0*\0relations\";a:0:{}s:10:\"\0*\0touches\";a:0:{}s:27:\"\0*\0relationAutoloadCallback\";N;s:26:\"\0*\0relationAutoloadContext\";N;s:10:\"timestamps\";b:1;s:13:\"usesUniqueIds\";b:0;s:9:\"\0*\0hidden\";a:0:{}s:10:\"\0*\0visible\";a:0:{}s:11:\"\0*\0fillable\";a:0:{}s:10:\"\0*\0guarded\";a:0:{}}s:12:\"\0*\0columnMap\";a:6:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0options\";a:0:{}}s:9:\"\0*\0export\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Exports\\Models\\Export\";s:2:\"id\";i:5;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:12:\"\0*\0columnMap\";a:6:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0options\";a:0:{}}\";}s:19:\"chainCatchCallbacks\";a:0:{}}}s:8:\"function\";s:266:\"function (\\Illuminate\\Bus\\Batch $batch) use ($next) {\n if (! $batch->cancelled()) {\n \\Illuminate\\Container\\Container::getInstance()->make(\\Illuminate\\Contracts\\Bus\\Dispatcher::class)->dispatch($next);\n }\n }\";s:5:\"scope\";s:27:\"Illuminate\\Bus\\ChainedBatch\";s:4:\"this\";N;s:4:\"self\";s:32:\"00000000000009260000000000000000\";}\";s:4:\"hash\";s:44:\"I6qGVrctjDxayuzSurnIBrRG8ApwB6fGyFaEQnmp9Fg=\";}}}}', NULL, 1769681473, 1769681474), ('a0f9d38d-45c0-47a3-b613-419b978c68fe', '', 2, 0, 0, '[]', 'a:2:{s:13:\"allowFailures\";b:1;s:7:\"finally\";a:1:{i:0;O:47:\"Laravel\\SerializableClosure\\SerializableClosure\":1:{s:12:\"serializable\";O:46:\"Laravel\\SerializableClosure\\Serializers\\Signed\":2:{s:12:\"serializable\";s:6646:\"O:46:\"Laravel\\SerializableClosure\\Serializers\\Native\":5:{s:3:\"use\";a:1:{s:4:\"next\";O:46:\"Filament\\Actions\\Exports\\Jobs\\ExportCompletion\":7:{s:11:\"\0*\0exporter\";O:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\":3:{s:9:\"\0*\0export\";O:38:\"Filament\\Actions\\Exports\\Models\\Export\":33:{s:13:\"\0*\0connection\";s:5:\"mysql\";s:8:\"\0*\0table\";N;s:13:\"\0*\0primaryKey\";s:2:\"id\";s:10:\"\0*\0keyType\";s:3:\"int\";s:12:\"incrementing\";b:1;s:7:\"\0*\0with\";a:0:{}s:12:\"\0*\0withCount\";a:0:{}s:19:\"preventsLazyLoading\";b:0;s:10:\"\0*\0perPage\";i:15;s:6:\"exists\";b:1;s:18:\"wasRecentlyCreated\";b:1;s:28:\"\0*\0escapeWhenCastingToString\";b:0;s:13:\"\0*\0attributes\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:1;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-02-01 12:22:40\";s:10:\"created_at\";s:19:\"2026-02-01 12:22:39\";s:2:\"id\";i:6;s:9:\"file_name\";s:32:\"ekspor-6-questionnaire-responses\";}s:11:\"\0*\0original\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:1;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-02-01 12:22:40\";s:10:\"created_at\";s:19:\"2026-02-01 12:22:39\";s:2:\"id\";i:6;s:9:\"file_name\";s:32:\"ekspor-6-questionnaire-responses\";}s:10:\"\0*\0changes\";a:2:{s:10:\"updated_at\";s:19:\"2026-02-01 12:22:40\";s:9:\"file_name\";s:32:\"ekspor-6-questionnaire-responses\";}s:11:\"\0*\0previous\";a:1:{s:10:\"updated_at\";s:19:\"2026-02-01 12:22:39\";}s:8:\"\0*\0casts\";a:4:{s:12:\"completed_at\";s:9:\"timestamp\";s:14:\"processed_rows\";s:7:\"integer\";s:10:\"total_rows\";s:7:\"integer\";s:15:\"successful_rows\";s:7:\"integer\";}s:17:\"\0*\0classCastCache\";a:0:{}s:21:\"\0*\0attributeCastCache\";a:0:{}s:13:\"\0*\0dateFormat\";N;s:10:\"\0*\0appends\";a:0:{}s:19:\"\0*\0dispatchesEvents\";a:0:{}s:14:\"\0*\0observables\";a:0:{}s:12:\"\0*\0relations\";a:0:{}s:10:\"\0*\0touches\";a:0:{}s:27:\"\0*\0relationAutoloadCallback\";N;s:26:\"\0*\0relationAutoloadContext\";N;s:10:\"timestamps\";b:1;s:13:\"usesUniqueIds\";b:0;s:9:\"\0*\0hidden\";a:0:{}s:10:\"\0*\0visible\";a:0:{}s:11:\"\0*\0fillable\";a:0:{}s:10:\"\0*\0guarded\";a:0:{}}s:12:\"\0*\0columnMap\";a:9:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:11:\"total_point\";s:10:\"Total Poin\";s:16:\"point_percentage\";s:10:\"Persentase\";s:14:\"point_category\";s:8:\"Kategori\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0options\";a:0:{}}s:9:\"\0*\0export\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Exports\\Models\\Export\";s:2:\"id\";i:6;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:12:\"\0*\0columnMap\";a:9:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:11:\"total_point\";s:10:\"Total Poin\";s:16:\"point_percentage\";s:10:\"Persentase\";s:14:\"point_category\";s:8:\"Kategori\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0formats\";a:2:{i:0;E:47:\"Filament\\Actions\\Exports\\Enums\\ExportFormat:Csv\";i:1;E:48:\"Filament\\Actions\\Exports\\Enums\\ExportFormat:Xlsx\";}s:10:\"\0*\0options\";a:0:{}s:7:\"chained\";a:1:{i:0;s:2974:\"O:44:\"Filament\\Actions\\Exports\\Jobs\\CreateXlsxFile\":4:{s:11:\"\0*\0exporter\";O:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\":3:{s:9:\"\0*\0export\";O:38:\"Filament\\Actions\\Exports\\Models\\Export\":33:{s:13:\"\0*\0connection\";s:5:\"mysql\";s:8:\"\0*\0table\";N;s:13:\"\0*\0primaryKey\";s:2:\"id\";s:10:\"\0*\0keyType\";s:3:\"int\";s:12:\"incrementing\";b:1;s:7:\"\0*\0with\";a:0:{}s:12:\"\0*\0withCount\";a:0:{}s:19:\"preventsLazyLoading\";b:0;s:10:\"\0*\0perPage\";i:15;s:6:\"exists\";b:1;s:18:\"wasRecentlyCreated\";b:1;s:28:\"\0*\0escapeWhenCastingToString\";b:0;s:13:\"\0*\0attributes\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:1;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-02-01 12:22:40\";s:10:\"created_at\";s:19:\"2026-02-01 12:22:39\";s:2:\"id\";i:6;s:9:\"file_name\";s:32:\"ekspor-6-questionnaire-responses\";}s:11:\"\0*\0original\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:1;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-02-01 12:22:40\";s:10:\"created_at\";s:19:\"2026-02-01 12:22:39\";s:2:\"id\";i:6;s:9:\"file_name\";s:32:\"ekspor-6-questionnaire-responses\";}s:10:\"\0*\0changes\";a:2:{s:10:\"updated_at\";s:19:\"2026-02-01 12:22:40\";s:9:\"file_name\";s:32:\"ekspor-6-questionnaire-responses\";}s:11:\"\0*\0previous\";a:1:{s:10:\"updated_at\";s:19:\"2026-02-01 12:22:39\";}s:8:\"\0*\0casts\";a:4:{s:12:\"completed_at\";s:9:\"timestamp\";s:14:\"processed_rows\";s:7:\"integer\";s:10:\"total_rows\";s:7:\"integer\";s:15:\"successful_rows\";s:7:\"integer\";}s:17:\"\0*\0classCastCache\";a:0:{}s:21:\"\0*\0attributeCastCache\";a:0:{}s:13:\"\0*\0dateFormat\";N;s:10:\"\0*\0appends\";a:0:{}s:19:\"\0*\0dispatchesEvents\";a:0:{}s:14:\"\0*\0observables\";a:0:{}s:12:\"\0*\0relations\";a:0:{}s:10:\"\0*\0touches\";a:0:{}s:27:\"\0*\0relationAutoloadCallback\";N;s:26:\"\0*\0relationAutoloadContext\";N;s:10:\"timestamps\";b:1;s:13:\"usesUniqueIds\";b:0;s:9:\"\0*\0hidden\";a:0:{}s:10:\"\0*\0visible\";a:0:{}s:11:\"\0*\0fillable\";a:0:{}s:10:\"\0*\0guarded\";a:0:{}}s:12:\"\0*\0columnMap\";a:9:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:11:\"total_point\";s:10:\"Total Poin\";s:16:\"point_percentage\";s:10:\"Persentase\";s:14:\"point_category\";s:8:\"Kategori\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0options\";a:0:{}}s:9:\"\0*\0export\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Exports\\Models\\Export\";s:2:\"id\";i:6;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:12:\"\0*\0columnMap\";a:9:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:11:\"total_point\";s:10:\"Total Poin\";s:16:\"point_percentage\";s:10:\"Persentase\";s:14:\"point_category\";s:8:\"Kategori\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0options\";a:0:{}}\";}s:19:\"chainCatchCallbacks\";a:0:{}}}s:8:\"function\";s:266:\"function (\\Illuminate\\Bus\\Batch $batch) use ($next) {\n if (! $batch->cancelled()) {\n \\Illuminate\\Container\\Container::getInstance()->make(\\Illuminate\\Contracts\\Bus\\Dispatcher::class)->dispatch($next);\n }\n }\";s:5:\"scope\";s:27:\"Illuminate\\Bus\\ChainedBatch\";s:4:\"this\";N;s:4:\"self\";s:32:\"00000000000009360000000000000000\";}\";s:4:\"hash\";s:44:\"JkwpW1GemcJFNo8+DB1runfLgpqhc0OmIaN+AA/i1cI=\";}}}}', NULL, 1769948565, 1769948566), ('a12f7d37-1b1d-48be-afba-eeb5c33f232f', '', 1, 0, 0, '[]', 'a:2:{s:13:\"allowFailures\";b:1;s:7:\"finally\";a:1:{i:0;O:47:\"Laravel\\SerializableClosure\\SerializableClosure\":1:{s:12:\"serializable\";O:46:\"Laravel\\SerializableClosure\\Serializers\\Signed\":2:{s:12:\"serializable\";s:4040:\"O:46:\"Laravel\\SerializableClosure\\Serializers\\Native\":5:{s:3:\"use\";a:4:{s:9:\"columnMap\";a:19:{s:3:\"nim\";s:3:\"nim\";s:8:\"username\";s:8:\"username\";s:11:\"birth_place\";s:11:\"birth_place\";s:10:\"birth_date\";s:10:\"birth_date\";s:6:\"gender\";s:6:\"gender\";s:7:\"address\";s:7:\"address\";s:12:\"phone_number\";s:12:\"phone_number\";s:5:\"email\";s:5:\"email\";s:3:\"gpa\";s:3:\"gpa\";s:7:\"faculty\";s:7:\"faculty\";s:5:\"major\";s:5:\"major\";s:10:\"entry_year\";s:10:\"entry_year\";s:15:\"graduation_year\";s:15:\"graduation_year\";s:6:\"status\";s:6:\"status\";s:14:\"category_field\";s:14:\"category_field\";s:14:\"waiting_period\";s:14:\"waiting_period\";s:12:\"job_position\";s:12:\"job_position\";s:12:\"company_name\";s:12:\"company_name\";s:4:\"foto\";s:4:\"foto\";}s:6:\"import\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Imports\\Models\\Import\";s:2:\"id\";i:7;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:13:\"jobConnection\";N;s:7:\"options\";a:0:{}}s:8:\"function\";s:2925:\"function () use ($columnMap, $import, $jobConnection, $options) {\n $import->touch(\'completed_at\');\n\n event(new \\Filament\\Actions\\Imports\\Events\\ImportCompleted($import, $columnMap, $options));\n\n if (! $import->user instanceof \\Illuminate\\Contracts\\Auth\\Authenticatable) {\n return;\n }\n\n $failedRowsCount = $import->getFailedRowsCount();\n\n \\Filament\\Notifications\\Notification::make()\n ->title($import->importer::getCompletedNotificationTitle($import))\n ->body($import->importer::getCompletedNotificationBody($import))\n ->when(\n ! $failedRowsCount,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->success(),\n )\n ->when(\n $failedRowsCount && ($failedRowsCount < $import->total_rows),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->warning(),\n )\n ->when(\n $failedRowsCount === $import->total_rows,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->danger(),\n )\n ->when(\n $failedRowsCount,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->actions([\n \\Filament\\Notifications\\Actions\\Action::make(\'downloadFailedRowsCsv\')\n ->label(trans_choice(\'filament-actions::import.notifications.completed.actions.download_failed_rows_csv.label\', $failedRowsCount, [\n \'count\' => \\Illuminate\\Support\\Number::format($failedRowsCount),\n ]))\n ->color(\'danger\')\n ->url(route(\'filament.imports.failed-rows.download\', [\'import\' => $import], absolute: false), shouldOpenInNewTab: true)\n ->markAsRead(),\n ]),\n )\n ->when(\n ($jobConnection === \'sync\') ||\n (blank($jobConnection) && (config(\'queue.default\') === \'sync\')),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification\n ->persistent()\n ->send(),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->sendToDatabase($import->user, isEventDispatched: true),\n );\n }\";s:5:\"scope\";s:36:\"Filament\\Tables\\Actions\\ImportAction\";s:4:\"this\";N;s:4:\"self\";s:32:\"0000000000000ee00000000000000000\";}\";s:4:\"hash\";s:44:\"kimKbbWMUdhF8ZpjeuAEs3Uv23Hmwap8FBf6DnJnGtU=\";}}}}', NULL, 1772253363, 1772253369); -- -------------------------------------------------------- -- -- Table structure for table `job_opportunities` -- CREATE TABLE `job_opportunities` ( `id` bigint UNSIGNED NOT NULL, `user_id` bigint UNSIGNED NOT NULL, `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `company` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `location` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `description` text COLLATE utf8mb4_unicode_ci NOT NULL, `requirements` text COLLATE utf8mb4_unicode_ci, `salary_range` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `deadline` date DEFAULT NULL, `contact_info` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `job_opportunities` -- INSERT INTO `job_opportunities` (`id`, `user_id`, `title`, `company`, `location`, `description`, `requirements`, `salary_range`, `deadline`, `contact_info`, `created_at`, `updated_at`) VALUES (1, 1, 'Junior Web Developer', 'PT Digital Solusi Nusantara', 'Bandung, Jawa Barat', '

 PT Digital Solusi Nusantara membuka kesempatan bagi lulusan baru untuk bergabung sebagai Junior Web Developer. Posisi ini bertanggung jawab dalam pengembangan dan pemeliharaan aplikasi berbasis web menggunakan teknologi modern. 

', '
  • Lulusan D3/S1 Teknik Informatika atau Sistem Informasi
  • Menguasai dasar HTML, CSS, dan JavaScript
  • Familiar dengan framework Laravel atau React
  • Mampu bekerja dalam tim dan memiliki kemauan belajar tinggi
', 'Rp 5.000.000 – Rp 7.000.000 per bulan', '2026-01-10', 'hrd@digitalsolusi.co.id', '2025-12-28 13:12:36', '2025-12-28 13:12:36'), (3, 1, 'System Analyst Junior', 'PT Solusi Informatika Global', 'Jakarta Barat', '
 Perusahaan membuka posisi System Analyst Junior untuk membantu analisis kebutuhan sistem, pembuatan dokumentasi, dan koordinasi dengan tim developer dalam pengembangan aplikasi perusahaan. 
', '
  • Lulusan S1 Sistem Informasi
  • Memahami SDLC dan UML
  • Mampu membuat dokumen kebutuhan sistem
  • Memiliki kemampuan komunikasi yang baik
', 'Rp 5.000.000 – Rp 7.000.000 per bulan', '2026-03-19', 'recruitment@siginfo.co.id', '2026-01-18 03:39:09', '2026-01-18 03:39:09'), (4, 1, 'Junior Web Developer', 'PT Digital Solusi Nusantara', 'Bandung, Jawa Barat', '
 PT Digital Solusi Nusantara membuka kesempatan bagi lulusan baru untuk bergabung sebagai Junior Web Developer. Posisi ini bertanggung jawab dalam pengembangan dan pemeliharaan aplikasi berbasis web menggunakan teknologi modern. 
', '
  • Lulusan S1 Sistem Informasi
  • Menguasai dasar HTML, CSS, dan JavaScript
  • Familiar dengan framework Laravel atau React
  • Mampu bekerja dalam tim dan memiliki kemauan belajar tinggi
', 'Rp 8.000.000 – Rp 10.000.000 per bulan', '2026-04-03', '0812-3456-7890', '2026-01-18 03:42:37', '2026-01-18 03:42:37'); -- -------------------------------------------------------- -- -- Table structure for table `migrations` -- CREATE TABLE `migrations` ( `id` int UNSIGNED NOT NULL, `migration` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `batch` int NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `migrations` -- INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (33, '0001_01_01_000000_create_users_table', 1), (34, '0001_01_01_000001_create_cache_table', 1), (35, '0001_01_01_000002_create_jobs_table', 1), (36, '2025_12_12_042503_create_alumnis_table', 1), (37, '2025_12_23_034532_create_permission_tables', 1), (38, '2025_12_23_051722_create_questionnaires_table', 1), (39, '2025_12_23_074959_create_questionnaire_questions_table', 1), (40, '2025_12_23_075229_create_questionnaire_responses_table', 1), (41, '2025_12_23_075712_create_response_answers_table', 1), (42, '2025_12_23_151007_create_notifications_table', 1), (43, '2025_12_23_151222_create_imports_table', 1), (44, '2025_12_23_151223_create_exports_table', 1), (45, '2025_12_23_151224_create_failed_import_rows_table', 1), (46, '2025_12_24_081956_create_job_opportunities_table', 1), (47, '2025_12_24_082547_create_scholarships_table', 1), (48, '2025_12_24_083203_create_internships_table', 1), (50, '2026_01_11_084609_add_category_field_and_waiting_period_to_alumnis_table', 2), (51, '2026_01_31_111857_create_forum_topics_table', 3), (52, '2026_01_31_112014_create_forum_replies_table', 3), (53, '2026_02_01_111402_add_max_point_to_questionnaire_questions_table', 4), (54, '2026_02_01_111552_add_point_to_response_answers_table', 4); -- -------------------------------------------------------- -- -- Table structure for table `model_has_permissions` -- CREATE TABLE `model_has_permissions` ( `permission_id` bigint UNSIGNED NOT NULL, `model_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `model_id` bigint UNSIGNED NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -------------------------------------------------------- -- -- Table structure for table `model_has_roles` -- CREATE TABLE `model_has_roles` ( `role_id` bigint UNSIGNED NOT NULL, `model_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `model_id` bigint UNSIGNED NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `model_has_roles` -- INSERT INTO `model_has_roles` (`role_id`, `model_type`, `model_id`) VALUES (1, 'App\\Models\\User', 1), (2, 'App\\Models\\User', 12), (2, 'App\\Models\\User', 13), (2, 'App\\Models\\User', 14), (2, 'App\\Models\\User', 15), (2, 'App\\Models\\User', 16), (2, 'App\\Models\\User', 17), (2, 'App\\Models\\User', 18), (2, 'App\\Models\\User', 19), (2, 'App\\Models\\User', 20), (2, 'App\\Models\\User', 21), (2, 'App\\Models\\User', 22), (2, 'App\\Models\\User', 23), (2, 'App\\Models\\User', 24), (2, 'App\\Models\\User', 50), (2, 'App\\Models\\User', 68), (2, 'App\\Models\\User', 69), (2, 'App\\Models\\User', 70), (2, 'App\\Models\\User', 71), (2, 'App\\Models\\User', 72), (2, 'App\\Models\\User', 77), (2, 'App\\Models\\User', 78), (2, 'App\\Models\\User', 79), (2, 'App\\Models\\User', 80), (2, 'App\\Models\\User', 81), (2, 'App\\Models\\User', 82), (2, 'App\\Models\\User', 83), (2, 'App\\Models\\User', 84), (2, 'App\\Models\\User', 85); -- -------------------------------------------------------- -- -- Table structure for table `notifications` -- CREATE TABLE `notifications` ( `id` char(36) COLLATE utf8mb4_unicode_ci NOT NULL, `type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `notifiable_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `notifiable_id` bigint UNSIGNED NOT NULL, `data` text COLLATE utf8mb4_unicode_ci NOT NULL, `read_at` timestamp NULL DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `notifications` -- INSERT INTO `notifications` (`id`, `type`, `notifiable_type`, `notifiable_id`, `data`, `read_at`, `created_at`, `updated_at`) VALUES ('00fa1033-a30d-43ab-ae0a-3e1ddac62529', 'Filament\\Notifications\\DatabaseNotification', 'App\\Models\\User', 1, '{\"actions\":[{\"name\":\"download_csv\",\"color\":null,\"event\":null,\"eventData\":[],\"dispatchDirection\":false,\"dispatchToComponent\":null,\"extraAttributes\":[],\"icon\":null,\"iconPosition\":\"before\",\"iconSize\":null,\"isOutlined\":false,\"isDisabled\":false,\"label\":\"Unduh .csv\",\"shouldClose\":false,\"shouldMarkAsRead\":true,\"shouldMarkAsUnread\":false,\"shouldOpenUrlInNewTab\":true,\"size\":\"sm\",\"tooltip\":null,\"url\":\"\\/filament\\/exports\\/6\\/download?format=csv\",\"view\":\"filament-actions::link-action\"},{\"name\":\"download_xlsx\",\"color\":null,\"event\":null,\"eventData\":[],\"dispatchDirection\":false,\"dispatchToComponent\":null,\"extraAttributes\":[],\"icon\":null,\"iconPosition\":\"before\",\"iconSize\":null,\"isOutlined\":false,\"isDisabled\":false,\"label\":\"Unduh .xlsx\",\"shouldClose\":false,\"shouldMarkAsRead\":true,\"shouldMarkAsUnread\":false,\"shouldOpenUrlInNewTab\":true,\"size\":\"sm\",\"tooltip\":null,\"url\":\"\\/filament\\/exports\\/6\\/download?format=xlsx\",\"view\":\"filament-actions::link-action\"}],\"body\":\"Your questionnaire response export has completed and 1 row exported.\",\"color\":null,\"duration\":\"persistent\",\"icon\":\"heroicon-o-check-circle\",\"iconColor\":\"success\",\"status\":\"success\",\"title\":\"Ekspor selesai\",\"view\":\"filament-notifications::notification\",\"viewData\":[],\"format\":\"filament\"}', '2026-02-01 05:23:14', '2026-02-01 05:22:47', '2026-02-01 05:23:14'), ('0b9c790f-376c-4b81-b5f7-1165999518b2', 'Filament\\Notifications\\DatabaseNotification', 'App\\Models\\User', 1, '{\"actions\":[],\"body\":\"Import alumni selesai dan 5 baris berhasil diimpor.\",\"color\":null,\"duration\":\"persistent\",\"icon\":\"heroicon-o-check-circle\",\"iconColor\":\"success\",\"status\":\"success\",\"title\":\"Import completed\",\"view\":\"filament-notifications::notification\",\"viewData\":[],\"format\":\"filament\"}', NULL, '2026-01-13 03:06:34', '2026-01-13 03:06:34'), ('15278e54-0040-48c1-aec9-0edce500b5cb', 'Filament\\Notifications\\DatabaseNotification', 'App\\Models\\User', 1, '{\"actions\":[],\"body\":\"Import alumni selesai dan 10 baris berhasil diimpor.\",\"color\":null,\"duration\":\"persistent\",\"icon\":\"heroicon-o-check-circle\",\"iconColor\":\"success\",\"status\":\"success\",\"title\":\"Import completed\",\"view\":\"filament-notifications::notification\",\"viewData\":[],\"format\":\"filament\"}', NULL, '2025-12-28 12:50:32', '2025-12-28 12:50:32'), ('16637fea-3ab9-4642-bd33-41aff0a227b6', 'Filament\\Notifications\\DatabaseNotification', 'App\\Models\\User', 1, '{\"actions\":[],\"body\":\"Import alumni selesai dan 5 baris berhasil diimpor.\",\"color\":null,\"duration\":\"persistent\",\"icon\":\"heroicon-o-check-circle\",\"iconColor\":\"success\",\"status\":\"success\",\"title\":\"Impor selesai\",\"view\":\"filament-notifications::notification\",\"viewData\":[],\"format\":\"filament\"}', NULL, '2026-02-27 21:36:10', '2026-02-27 21:36:10'), ('1cb7a1d9-e051-43e6-9090-d96f485543f3', 'Filament\\Notifications\\DatabaseNotification', 'App\\Models\\User', 1, '{\"actions\":[{\"name\":\"download_csv\",\"color\":null,\"event\":null,\"eventData\":[],\"dispatchDirection\":false,\"dispatchToComponent\":null,\"extraAttributes\":[],\"icon\":null,\"iconPosition\":\"before\",\"iconSize\":null,\"isOutlined\":false,\"isDisabled\":false,\"label\":\"Download .csv\",\"shouldClose\":false,\"shouldMarkAsRead\":true,\"shouldMarkAsUnread\":false,\"shouldOpenUrlInNewTab\":true,\"size\":\"sm\",\"tooltip\":null,\"url\":\"\\/filament\\/exports\\/1\\/download?format=csv\",\"view\":\"filament-actions::link-action\"},{\"name\":\"download_xlsx\",\"color\":null,\"event\":null,\"eventData\":[],\"dispatchDirection\":false,\"dispatchToComponent\":null,\"extraAttributes\":[],\"icon\":null,\"iconPosition\":\"before\",\"iconSize\":null,\"isOutlined\":false,\"isDisabled\":false,\"label\":\"Download .xlsx\",\"shouldClose\":false,\"shouldMarkAsRead\":true,\"shouldMarkAsUnread\":false,\"shouldOpenUrlInNewTab\":true,\"size\":\"sm\",\"tooltip\":null,\"url\":\"\\/filament\\/exports\\/1\\/download?format=xlsx\",\"view\":\"filament-actions::link-action\"}],\"body\":\"Your alumni export has completed and 10 rows exported.\",\"color\":null,\"duration\":\"persistent\",\"icon\":\"heroicon-o-check-circle\",\"iconColor\":\"success\",\"status\":\"success\",\"title\":\"Export completed\",\"view\":\"filament-notifications::notification\",\"viewData\":[],\"format\":\"filament\"}', '2025-12-28 12:51:13', '2025-12-28 12:51:02', '2025-12-28 12:51:13'), ('2dd902d2-9c84-48a6-88d7-c02f43655e38', 'Filament\\Notifications\\DatabaseNotification', 'App\\Models\\User', 1, '{\"actions\":[{\"name\":\"download_csv\",\"color\":null,\"event\":null,\"eventData\":[],\"dispatchDirection\":false,\"dispatchToComponent\":null,\"extraAttributes\":[],\"icon\":null,\"iconPosition\":\"before\",\"iconSize\":null,\"isOutlined\":false,\"isDisabled\":false,\"label\":\"Download .csv\",\"shouldClose\":false,\"shouldMarkAsRead\":true,\"shouldMarkAsUnread\":false,\"shouldOpenUrlInNewTab\":true,\"size\":\"sm\",\"tooltip\":null,\"url\":\"\\/filament\\/exports\\/5\\/download?format=csv\",\"view\":\"filament-actions::link-action\"},{\"name\":\"download_xlsx\",\"color\":null,\"event\":null,\"eventData\":[],\"dispatchDirection\":false,\"dispatchToComponent\":null,\"extraAttributes\":[],\"icon\":null,\"iconPosition\":\"before\",\"iconSize\":null,\"isOutlined\":false,\"isDisabled\":false,\"label\":\"Download .xlsx\",\"shouldClose\":false,\"shouldMarkAsRead\":true,\"shouldMarkAsUnread\":false,\"shouldOpenUrlInNewTab\":true,\"size\":\"sm\",\"tooltip\":null,\"url\":\"\\/filament\\/exports\\/5\\/download?format=xlsx\",\"view\":\"filament-actions::link-action\"}],\"body\":\"Your questionnaire response export has completed and 7 rows exported.\",\"color\":null,\"duration\":\"persistent\",\"icon\":\"heroicon-o-check-circle\",\"iconColor\":\"success\",\"status\":\"success\",\"title\":\"Export completed\",\"view\":\"filament-notifications::notification\",\"viewData\":[],\"format\":\"filament\"}', '2026-01-29 03:11:32', '2026-01-29 03:11:15', '2026-01-29 03:11:32'), ('4d6bef7e-bfef-445f-b0b6-b6977daf00bd', 'Filament\\Notifications\\DatabaseNotification', 'App\\Models\\User', 1, '{\"actions\":[{\"name\":\"download_csv\",\"color\":null,\"event\":null,\"eventData\":[],\"dispatchDirection\":false,\"dispatchToComponent\":null,\"extraAttributes\":[],\"icon\":null,\"iconPosition\":\"before\",\"iconSize\":null,\"isOutlined\":false,\"isDisabled\":false,\"label\":\"Download .csv\",\"shouldClose\":false,\"shouldMarkAsRead\":true,\"shouldMarkAsUnread\":false,\"shouldOpenUrlInNewTab\":true,\"size\":\"sm\",\"tooltip\":null,\"url\":\"\\/filament\\/exports\\/2\\/download?format=csv\",\"view\":\"filament-actions::link-action\"},{\"name\":\"download_xlsx\",\"color\":null,\"event\":null,\"eventData\":[],\"dispatchDirection\":false,\"dispatchToComponent\":null,\"extraAttributes\":[],\"icon\":null,\"iconPosition\":\"before\",\"iconSize\":null,\"isOutlined\":false,\"isDisabled\":false,\"label\":\"Download .xlsx\",\"shouldClose\":false,\"shouldMarkAsRead\":true,\"shouldMarkAsUnread\":false,\"shouldOpenUrlInNewTab\":true,\"size\":\"sm\",\"tooltip\":null,\"url\":\"\\/filament\\/exports\\/2\\/download?format=xlsx\",\"view\":\"filament-actions::link-action\"}],\"body\":\"Your questionnaire response export has completed and 2 rows exported.\",\"color\":null,\"duration\":\"persistent\",\"icon\":\"heroicon-o-check-circle\",\"iconColor\":\"success\",\"status\":\"success\",\"title\":\"Export completed\",\"view\":\"filament-notifications::notification\",\"viewData\":[],\"format\":\"filament\"}', '2025-12-29 21:16:42', '2025-12-29 21:16:12', '2025-12-29 21:16:42'), ('a5fe8313-831f-4962-be14-3104c1bb7a1e', 'Filament\\Notifications\\DatabaseNotification', 'App\\Models\\User', 1, '{\"actions\":[{\"name\":\"download_csv\",\"color\":null,\"event\":null,\"eventData\":[],\"dispatchDirection\":false,\"dispatchToComponent\":null,\"extraAttributes\":[],\"icon\":null,\"iconPosition\":\"before\",\"iconSize\":null,\"isOutlined\":false,\"isDisabled\":false,\"label\":\"Download .csv\",\"shouldClose\":false,\"shouldMarkAsRead\":true,\"shouldMarkAsUnread\":false,\"shouldOpenUrlInNewTab\":true,\"size\":\"sm\",\"tooltip\":null,\"url\":\"\\/filament\\/exports\\/4\\/download?format=csv\",\"view\":\"filament-actions::link-action\"},{\"name\":\"download_xlsx\",\"color\":null,\"event\":null,\"eventData\":[],\"dispatchDirection\":false,\"dispatchToComponent\":null,\"extraAttributes\":[],\"icon\":null,\"iconPosition\":\"before\",\"iconSize\":null,\"isOutlined\":false,\"isDisabled\":false,\"label\":\"Download .xlsx\",\"shouldClose\":false,\"shouldMarkAsRead\":true,\"shouldMarkAsUnread\":false,\"shouldOpenUrlInNewTab\":true,\"size\":\"sm\",\"tooltip\":null,\"url\":\"\\/filament\\/exports\\/4\\/download?format=xlsx\",\"view\":\"filament-actions::link-action\"}],\"body\":\"Your questionnaire response export has completed and 10 rows exported.\",\"color\":null,\"duration\":\"persistent\",\"icon\":\"heroicon-o-check-circle\",\"iconColor\":\"success\",\"status\":\"success\",\"title\":\"Export completed\",\"view\":\"filament-notifications::notification\",\"viewData\":[],\"format\":\"filament\"}', NULL, '2026-01-27 02:07:28', '2026-01-27 02:07:28'), ('a9827db2-a578-4d6f-98d9-59d12da1eb41', 'Filament\\Notifications\\DatabaseNotification', 'App\\Models\\User', 1, '{\"actions\":[],\"body\":\"Import alumni selesai dan 10 baris berhasil diimpor.\",\"color\":null,\"duration\":\"persistent\",\"icon\":\"heroicon-o-check-circle\",\"iconColor\":\"success\",\"status\":\"success\",\"title\":\"Import completed\",\"view\":\"filament-notifications::notification\",\"viewData\":[],\"format\":\"filament\"}', NULL, '2026-01-02 22:24:18', '2026-01-02 22:24:18'), ('d212c38d-6d78-4336-aa89-b374455a302e', 'Filament\\Notifications\\DatabaseNotification', 'App\\Models\\User', 1, '{\"actions\":[{\"name\":\"download_csv\",\"color\":null,\"event\":null,\"eventData\":[],\"dispatchDirection\":false,\"dispatchToComponent\":null,\"extraAttributes\":[],\"icon\":null,\"iconPosition\":\"before\",\"iconSize\":null,\"isOutlined\":false,\"isDisabled\":false,\"label\":\"Download .csv\",\"shouldClose\":false,\"shouldMarkAsRead\":true,\"shouldMarkAsUnread\":false,\"shouldOpenUrlInNewTab\":true,\"size\":\"sm\",\"tooltip\":null,\"url\":\"\\/filament\\/exports\\/3\\/download?format=csv\",\"view\":\"filament-actions::link-action\"},{\"name\":\"download_xlsx\",\"color\":null,\"event\":null,\"eventData\":[],\"dispatchDirection\":false,\"dispatchToComponent\":null,\"extraAttributes\":[],\"icon\":null,\"iconPosition\":\"before\",\"iconSize\":null,\"isOutlined\":false,\"isDisabled\":false,\"label\":\"Download .xlsx\",\"shouldClose\":false,\"shouldMarkAsRead\":true,\"shouldMarkAsUnread\":false,\"shouldOpenUrlInNewTab\":true,\"size\":\"sm\",\"tooltip\":null,\"url\":\"\\/filament\\/exports\\/3\\/download?format=xlsx\",\"view\":\"filament-actions::link-action\"}],\"body\":\"Your alumni export has completed and 13 rows exported.\",\"color\":null,\"duration\":\"persistent\",\"icon\":\"heroicon-o-check-circle\",\"iconColor\":\"success\",\"status\":\"success\",\"title\":\"Export completed\",\"view\":\"filament-notifications::notification\",\"viewData\":[],\"format\":\"filament\"}', '2026-01-13 02:33:00', '2026-01-13 02:32:41', '2026-01-13 02:33:00'), ('f8296e68-1d49-4391-b406-bf0a840b2eb6', 'Filament\\Notifications\\DatabaseNotification', 'App\\Models\\User', 1, '{\"actions\":[],\"body\":\"Import alumni selesai dan 10 baris berhasil diimpor.\",\"color\":null,\"duration\":\"persistent\",\"icon\":\"heroicon-o-check-circle\",\"iconColor\":\"success\",\"status\":\"success\",\"title\":\"Import completed\",\"view\":\"filament-notifications::notification\",\"viewData\":[],\"format\":\"filament\"}', NULL, '2025-12-28 14:25:08', '2025-12-28 14:25:08'); -- -------------------------------------------------------- -- -- Table structure for table `password_reset_tokens` -- CREATE TABLE `password_reset_tokens` ( `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `token` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -------------------------------------------------------- -- -- Table structure for table `permissions` -- CREATE TABLE `permissions` ( `id` bigint UNSIGNED NOT NULL, `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `guard_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `permissions` -- INSERT INTO `permissions` (`id`, `name`, `guard_name`, `created_at`, `updated_at`) VALUES (1, 'view_alumni', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (2, 'create_alumni', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (3, 'edit_alumni', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (4, 'delete_alumni', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (5, 'import_alumni', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (6, 'export_alumni', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (7, 'view_questionnaire', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (8, 'create_questionnaire', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (9, 'edit_questionnaire', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (10, 'delete_questionnaire', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (11, 'view_responses', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (12, 'export_responses', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (13, 'fill_questionnaire', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (14, 'view_job', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (15, 'create_job', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (16, 'edit_own_job', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (17, 'delete_own_job', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (18, 'view_scholarship', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (19, 'create_scholarship', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (20, 'edit_own_scholarship', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (21, 'delete_own_scholarship', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (22, 'view_internship', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (23, 'create_internship', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (24, 'edit_own_internship', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (25, 'delete_own_internship', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (26, 'view_admin_dashboard', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (27, 'view_alumni_dashboard', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (28, 'view_forum', 'web', '2026-01-31 05:39:48', '2026-01-31 05:39:48'), (29, 'create_forum_topic', 'web', '2026-01-31 05:39:49', '2026-01-31 05:39:49'), (30, 'edit_own_forum_topic', 'web', '2026-01-31 05:39:49', '2026-01-31 05:39:49'), (31, 'delete_own_forum_topic', 'web', '2026-01-31 05:39:49', '2026-01-31 05:39:49'), (32, 'reply_forum_topic', 'web', '2026-01-31 05:39:49', '2026-01-31 05:39:49'), (33, 'moderate_forum', 'web', '2026-01-31 05:39:49', '2026-01-31 05:39:49'); -- -------------------------------------------------------- -- -- Table structure for table `questionnaires` -- CREATE TABLE `questionnaires` ( `id` bigint UNSIGNED NOT NULL, `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `description` text COLLATE utf8mb4_unicode_ci, `tahun_periode` year NOT NULL, `is_active` tinyint(1) NOT NULL DEFAULT '1', `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `questionnaires` -- INSERT INTO `questionnaires` (`id`, `title`, `description`, `tahun_periode`, `is_active`, `created_at`, `updated_at`) VALUES (8, 'KUESIONER TRACER STUDY ALUMNI', 'Kuesioner ini digunakan untuk memperoleh umpan balik alumni sebagai bahan evaluasi dan pengembangan kurikulum serta peningkatan mutu program studi.\nSetiap pernyataan dijawab dengan satu pilihan berikut:\n1 = Sangat Tidak Setuju\n2 = Tidak Setuju\n3 = Netral\n4 = Setuju\n5 = Sangat Setuju', 2026, 1, '2026-02-01 04:46:19', '2026-02-01 04:46:19'), (9, 'Pendidikan dan Karir', 'Bagian ini bertujuan untuk mengetahui perkembangan pendidikan dan karier alumni setelah lulus.', 2025, 1, '2026-02-27 20:25:23', '2026-02-27 21:59:00'), (10, 'Penilaian Program Studi', 'Bagian ini bertujuan untuk mengevaluasi kualitas pendidikan dan fasilitas program studi.', 2026, 1, '2026-02-27 20:47:39', '2026-02-27 20:57:47'); -- -------------------------------------------------------- -- -- Table structure for table `questionnaire_questions` -- CREATE TABLE `questionnaire_questions` ( `id` bigint UNSIGNED NOT NULL, `questionnaire_id` bigint UNSIGNED NOT NULL, `question_text` text COLLATE utf8mb4_unicode_ci NOT NULL, `question_type` enum('text','textarea','radio','checkbox','select') COLLATE utf8mb4_unicode_ci NOT NULL, `options` json DEFAULT NULL, `is_required` tinyint(1) NOT NULL DEFAULT '0', `max_point` int NOT NULL DEFAULT '5' COMMENT 'Maksimal poin yang bisa didapat dari pertanyaan ini', `order` int NOT NULL DEFAULT '0', `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `questionnaire_questions` -- INSERT INTO `questionnaire_questions` (`id`, `questionnaire_id`, `question_text`, `question_type`, `options`, `is_required`, `max_point`, `order`, `created_at`, `updated_at`) VALUES (20, 8, 'Kompetensi yang saya peroleh selama kuliah sesuai dengan kebutuhan pekerjaan saya saat ini.', 'radio', '[\"Sangat Tidak Setuju\", \"Tidak Setuju\", \"Netral\", \"Setuju\", \"Sangat Setuju\"]', 1, 5, 1, '2026-02-01 04:50:26', '2026-02-01 04:50:26'), (21, 8, 'Kurikulum program studi relevan dengan perkembangan dunia kerja.', 'radio', '[\"Sangat Tidak Setuju\", \"Tidak Setuju\", \"Netral\", \"Setuju\", \"Sangat Setuju\"]', 1, 5, 2, '2026-02-01 04:52:18', '2026-02-01 04:52:18'), (22, 8, 'Mata kuliah yang saya peroleh mendukung pelaksanaan tugas di tempat kerja.', 'radio', '[\"Sangat Tidak Setuju\", \"Tidak Setuju\", \"Netral\", \"Setuju\", \"Sangat Setuju\"]', 1, 5, 3, '2026-02-01 04:54:57', '2026-02-01 04:54:57'), (23, 8, 'Program studi membekali saya dengan kemampuan berpikir kritis.', 'radio', '[\"Sangat Tidak Setuju\", \"Tidak Setuju\", \"Netral\", \"Setuju\", \"Sangat Setuju\"]', 1, 5, 4, '2026-02-01 04:56:52', '2026-02-01 04:56:52'), (24, 8, 'Program studi membekali saya dengan kemampuan pemecahan masalah.', 'radio', '[\"Sangat Tidak Setuju\", \"Tidak Setuju\", \"Netral\", \"Setuju\", \"Sangat Setuju\"]', 1, 5, 5, '2026-02-01 05:00:25', '2026-02-01 05:00:25'), (25, 9, 'Apakah Anda melanjutkan studi setelah lulus?', 'radio', '[\"Ya\", \"Tidak\"]', 1, 5, 1, '2026-02-27 20:27:19', '2026-02-27 20:27:19'), (26, 9, 'Jika ya, program studi yang diambil', 'text', NULL, 1, 5, 2, '2026-02-27 20:27:49', '2026-02-27 20:27:49'), (27, 9, 'Apakah Anda saat ini bekerja?', 'radio', '[\"Ya, sesuai bidang studi\", \"Ya, tidak sesuai bidang studi\", \"Tidak bekerja\"]', 1, 5, 3, '2026-02-27 20:29:14', '2026-02-27 20:29:14'), (28, 9, 'Posisi/jabatan terakhir Anda', 'text', NULL, 1, 5, 4, '2026-02-27 20:29:34', '2026-02-27 20:29:34'), (29, 9, 'Nama perusahaan/instansi tempat bekerja', 'text', NULL, 1, 5, 5, '2026-02-27 20:29:55', '2026-02-27 20:31:23'), (30, 9, 'Seberapa sesuai pekerjaan Anda dengan bidang studi?', 'radio', '[\"Sangat sesuai\", \"Sesuai\", \"Kurang sesuai\", \"Tidak sesuai\"]', 1, 5, 6, '2026-02-27 20:31:06', '2026-02-27 20:31:06'), (31, 10, 'Seberapa puas Anda terhadap kualitas pendidikan di program studi?', 'radio', '[\"Sangat puas\", \"Puas\", \"Cukup\", \"Kurang\"]', 1, 5, 1, '2026-02-27 20:51:42', '2026-02-27 20:51:42'), (32, 10, 'Bagaimana kualitas fasilitas pendukung pembelajaran (laboratorium, perpustakaan, dll)?', 'radio', '[\"Sangat baik\", \"Baik\", \"Cukup\", \"Kurang\"]', 1, 5, 2, '2026-02-27 20:52:38', '2026-02-27 20:52:38'), (33, 10, 'Apakah kurikulum program studi relevan dengan kebutuhan industri saat ini?', 'radio', '[\"Sangat relevan\", \"Relevan\", \"Kurang Relevan\", \"Tidak Relevan\"]', 1, 5, 3, '2026-02-27 20:53:58', '2026-02-27 20:53:58'), (34, 10, 'Seberapa besar program studi membantu Anda dalam mengembangkan soft skills (komunikasi, kepemimpinan, kerja tim, dll)?', 'radio', '[\"Sangat Besar\", \"Besar\", \"Cukup\", \"Kurang\"]', 1, 5, 4, '2026-02-27 20:54:50', '2026-02-27 20:54:50'); -- -------------------------------------------------------- -- -- Table structure for table `questionnaire_responses` -- CREATE TABLE `questionnaire_responses` ( `id` bigint UNSIGNED NOT NULL, `questionnaire_id` bigint UNSIGNED NOT NULL, `user_id` bigint UNSIGNED NOT NULL, `submitted_at` timestamp NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `questionnaire_responses` -- INSERT INTO `questionnaire_responses` (`id`, `questionnaire_id`, `user_id`, `submitted_at`, `created_at`, `updated_at`) VALUES (12, 8, 78, '2026-02-01 05:15:38', '2026-02-01 05:15:38', '2026-02-01 05:15:38'), (14, 8, 12, '2026-02-27 20:39:42', '2026-02-27 20:39:42', '2026-02-27 20:39:42'), (16, 10, 12, '2026-02-27 20:58:54', '2026-02-27 20:58:54', '2026-02-27 20:58:54'), (17, 8, 14, '2026-02-27 21:00:14', '2026-02-27 21:00:14', '2026-02-27 21:00:14'), (19, 10, 14, '2026-02-27 21:01:53', '2026-02-27 21:01:53', '2026-02-27 21:01:53'); -- -------------------------------------------------------- -- -- Table structure for table `response_answers` -- CREATE TABLE `response_answers` ( `id` bigint UNSIGNED NOT NULL, `response_id` bigint UNSIGNED NOT NULL, `question_id` bigint UNSIGNED NOT NULL, `answer_text` text COLLATE utf8mb4_unicode_ci, `point` int NOT NULL DEFAULT '0' COMMENT 'Poin yang didapat dari jawaban ini', `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `response_answers` -- INSERT INTO `response_answers` (`id`, `response_id`, `question_id`, `answer_text`, `point`, `created_at`, `updated_at`) VALUES (44, 12, 20, 'Setuju', 4, '2026-02-01 05:15:38', '2026-02-01 05:15:38'), (45, 12, 21, 'Netral', 3, '2026-02-01 05:15:38', '2026-02-01 05:15:38'), (46, 12, 22, 'Netral', 3, '2026-02-01 05:15:38', '2026-02-01 05:15:38'), (47, 12, 23, 'Setuju', 4, '2026-02-01 05:15:38', '2026-02-01 05:15:38'), (48, 12, 24, 'Setuju', 4, '2026-02-01 05:15:38', '2026-02-01 05:15:38'), (54, 14, 20, 'Setuju', 4, '2026-02-27 20:39:42', '2026-02-27 20:39:42'), (55, 14, 21, 'Setuju', 4, '2026-02-27 20:39:42', '2026-02-27 20:39:42'), (56, 14, 22, 'Setuju', 4, '2026-02-27 20:39:42', '2026-02-27 20:39:42'), (57, 14, 23, 'Setuju', 4, '2026-02-27 20:39:42', '2026-02-27 20:39:42'), (58, 14, 24, 'Setuju', 4, '2026-02-27 20:39:42', '2026-02-27 20:39:42'), (65, 16, 31, 'Puas', 4, '2026-02-27 20:58:54', '2026-02-27 20:58:54'), (66, 16, 32, 'Cukup', 3, '2026-02-27 20:58:54', '2026-02-27 20:58:54'), (67, 16, 33, 'Relevan', 1, '2026-02-27 20:58:54', '2026-02-27 20:58:54'), (68, 16, 34, 'Cukup', 3, '2026-02-27 20:58:54', '2026-02-27 20:58:54'), (69, 17, 20, 'Setuju', 4, '2026-02-27 21:00:14', '2026-02-27 21:00:14'), (70, 17, 21, 'Setuju', 4, '2026-02-27 21:00:14', '2026-02-27 21:00:14'), (71, 17, 22, 'Setuju', 4, '2026-02-27 21:00:14', '2026-02-27 21:00:14'), (72, 17, 23, 'Setuju', 4, '2026-02-27 21:00:14', '2026-02-27 21:00:14'), (73, 17, 24, 'Setuju', 4, '2026-02-27 21:00:14', '2026-02-27 21:00:14'), (80, 19, 31, 'Puas', 4, '2026-02-27 21:01:53', '2026-02-27 21:01:53'), (81, 19, 32, 'Baik', 4, '2026-02-27 21:01:53', '2026-02-27 21:01:53'), (82, 19, 33, 'Relevan', 1, '2026-02-27 21:01:53', '2026-02-27 21:01:53'), (83, 19, 34, 'Besar', 1, '2026-02-27 21:01:53', '2026-02-27 21:01:53'); -- -------------------------------------------------------- -- -- Table structure for table `roles` -- CREATE TABLE `roles` ( `id` bigint UNSIGNED NOT NULL, `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `guard_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `roles` -- INSERT INTO `roles` (`id`, `name`, `guard_name`, `created_at`, `updated_at`) VALUES (1, 'admin', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (2, 'alumni', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'); -- -------------------------------------------------------- -- -- Table structure for table `role_has_permissions` -- CREATE TABLE `role_has_permissions` ( `permission_id` bigint UNSIGNED NOT NULL, `role_id` bigint UNSIGNED NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `role_has_permissions` -- INSERT INTO `role_has_permissions` (`permission_id`, `role_id`) VALUES (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1), (10, 1), (11, 1), (12, 1), (14, 1), (15, 1), (16, 1), (17, 1), (18, 1), (19, 1), (20, 1), (21, 1), (22, 1), (23, 1), (24, 1), (25, 1), (26, 1), (28, 1), (29, 1), (30, 1), (31, 1), (32, 1), (33, 1), (13, 2), (14, 2), (15, 2), (16, 2), (17, 2), (18, 2), (19, 2), (20, 2), (21, 2), (22, 2), (23, 2), (24, 2), (25, 2), (27, 2), (28, 2), (29, 2), (30, 2), (31, 2), (32, 2); -- -------------------------------------------------------- -- -- Table structure for table `scholarships` -- CREATE TABLE `scholarships` ( `id` bigint UNSIGNED NOT NULL, `user_id` bigint UNSIGNED NOT NULL, `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `provider` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `description` text COLLATE utf8mb4_unicode_ci NOT NULL, `requirements` text COLLATE utf8mb4_unicode_ci, `amount` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `deadline` daMP²¯te DEFAULT NULL, `link` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `scholarships` -- INSERT INTO `scholarships` (`id`, `user_id`, `title`, `provider`, `description`, `requirements`, `amount`, `deadline`, `link`, `created_at`, `updated_at`) VALUES (1, 1, 'Beasiswa Prestasi Mahasiswa TI', 'Kementerian Pendidikan, Kebudayaan, Riset, dan Teknologi', '

Beasiswa ini ditujukan bagi mahasiswa lulusan S1 Program Studi Sistem Informasi dan Teknik Informatika yang memiliki prestasi akademik maupun non-akademik. 

Beasiswa diberikan untuk membantu biaya pendidikan dan mendukung pengembangan potensi mahasiswa selama masa studi. 

', '
  • Mahasiswa aktif Program Studi Sistem Informasi
  • Freshgraduate
  • IPK minimal 3.50
  • Memiliki surat rekomendasi dari desa
  • Tidak sedang menerima beasiswa lain
', 'Rp 6.000.000 / semester', '2026-01-09', 'https://beasiswa.kemdikbud.go.id/prestasi-mahasiswa', '2025-12-28 13:16:32', '2025-12-28 13:16:32'), (3, 1, 'Beasiswa Alumni Berprestasi', 'Yayasan Pendidikan Nusantara', '
 Beasiswa ini ditujukan bagi alumni berprestasi yang ingin melanjutkan studi atau mengembangkan kompetensi profesional. Beasiswa diberikan sebagai bentuk dukungan pengembangan sumber daya manusia. 
', '
  • Alumni perguruan tinggi maksimal lulus 3 tahun terakhir
  • IPK minimal 3.25
  • Surat rekomendasi fakultas
  • Proposal rencana pengembangan diri
', 'Rp 10.000.000 / semester', '2026-03-05', 'https://beasiswa.ypnusantara.or.id', '2026-01-18 03:47:05', '2026-01-18 03:49:26'), (4, 1, 'Beasiswa Digital Talent', 'Kementerian Komunikasi dan Informatika', '
Beasiswa pelatihan dan pengembangan kompetensi digital. 
', '
  • Mahasiswa aktif atau alumni SI/TI
  • IPK minimal 3.00
  • Memiliki minat di bidang teknologi digital
  • Bersedia mengikuti seluruh rangkaian program
', 'Rp 8.000.000', '2026-03-19', 'https://lpdp.kemenkeu.go.id', '2026-01-18 03:53:17', '2026-01-18 03:53:17'); -- -------------------------------------------------------- -- -- Table structure for table `sessions` -- CREATE TABLE `sessions` ( `id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `user_id` bigint UNSIGNED DEFAULT NULL, `ip_address` varchar(45) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `user_agent` text COLLATE utf8mb4_unicode_ci, `payload` longtext COLLATE utf8mb4_unicode_ci NOT NULL, `last_activity` int NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `sessions` -- INSERT INTO `sessions` (`id`, `user_id`, `ip_address`, `user_agent`, `payload`, `last_activity`) VALUES ('l6xEI7AnFnhA9cPYzXc6ur5hOWAkGSRYmJrczzfq', NULL, '127.0.0.1', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36 Edg/145.0.0.0', 'YTo0OntzOjY6Il90b2tlbiI7czo0MDoiMnVsYkFLOGNMMjl4U2pxb0VVUFBZRTFJNWxuaG9pTmpPSjVjcXJCbCI7czo2OiJfZmxhc2giO2E6Mjp7czozOiJvbGQiO2E6MDp7fXM6MzoibmV3IjthOjA6e319czo5OiJfcHJldmlvdXMiO2E6MTp7czozOiJ1cmwiO3M6NDA6Imh0dHA6Ly8xMjcuMC4wLjE6ODAwMC90cmFjZXItc3R1ZHkvbG9naW4iO31zOjM6InVybCI7YToxOntzOjg6ImludGVuZGVkIjtzOjM0OiJodHRwOi8vMTI3LjAuMC4xOjgwMDAvdHJhY2VyLXN0dWR5Ijt9fQ==', 1772537243), ('sRftpMnDPbOd7QC2WzITLjYHns5jH9h9C8G3iZiH', NULL, '127.0.0.1', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36 Edg/145.0.0.0', 'YToyOntzOjY6Il90b2tlbiI7czo0MDoiR0txMmN5bFprc0haMm1qRTJ1Y0J1WXd5SXNyWFEzOWw4Z3NERjJWeiI7czo2OiJfZmxhc2giO2E6Mjp7czozOiJvbGQiO2E6MDp7fXM6MzoibmV3IjthOjA6e319fQ==', 1772533583); -- -------------------------------------------------------- -- -- Table structure for table `users` -- CREATE TABLE `users` ( `id` bigint UNSIGNED NOT NULL, `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `email_verified_at` timestamp NULL DEFAULT NULL, `password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `users` -- INSERT INTO `users` (`id`, `name`, `email`, `email_verified_at`, `password`, `remember_token`, `created_at`, `updated_at`) VALUES (1, 'Administrator', 'admin@gmail.com', NULL, '$2y$12$xSO6sqCK2WczsTWxAsvofedbRlJSw0/cRpX/tSQy69WT7d5.Fazby', 'iPMNtNqnOXUQNSDL6g4kLyuFTfddMt2P1aUl0QcDobEyObgYELQbAx8bl57g', '2025-12-28 12:49:06', '2025-12-28 13:50:02'), (12, 'Jaka', 'jaka@gmail.com', NULL, '$2y$12$e6rMhr19xrvrwPwHOvawFOSvsHdvqT2RBDfKjb9O1p5kGl9SJej9W', NULL, '2025-12-28 13:22:37', '2025-12-28 13:47:27'), (13, 'Nadia Oktarina', 'nadiaokta847@gmail.com', NULL, '$2y$12$YsgIY.7MePyZsDKHej9UnuTJAmFJDU6oNAFr/h0lYTqW5epU1t4wK', '2raRpkCwAJsGJxqIQTYGcexmsWMpMWugLmpbh0IOnRn3mnHuZAYDiz5QfFUx', '2025-12-28 13:53:07', '2026-03-03 04:03:52'), (14, 'Ahmad Fauzi', 'ahmad.fauzi@gmail.com', NULL, '$2y$12$FBofMveiP3.a90xnhy1skeo5aeerTRS6jWHRl2V2/hSKYeyy.jDMi', NULL, '2025-12-28 14:25:04', '2025-12-28 14:25:04'), (15, 'Siti Aisyah', 'siti.aisyah@gmail.com', NULL, '$2y$12$dVIxRwsOxBLIXswlezm1mu7BOzea.AmHza00AuRadHm2piZ.Su.Yq', NULL, '2025-12-28 14:25:04', '2025-12-28 14:25:04'), (16, 'Budi Santoso', 'budi.santoso@gmail.com', NULL, '$2y$12$ANofpD0fi63QiYcytgbbRuHd6ndlUR3e9vgrSNIZQ83lte.FCHYl2', NULL, '2025-12-28 14:25:05', '2025-12-28 14:25:05'), (17, 'Rina Marlina', 'rina.marlina@gmail.com', NULL, '$2y$12$odUNr3GrWPqWg8OYA8R/0ut1ykWD0fo04SO4s0d/sd/A25ZnTTnnO', NULL, '2025-12-28 14:25:05', '2025-12-28 14:25:05'), (18, 'Dedi Pratama', 'dedi.pratama@gmail.com', NULL, '$2y$12$iM3r22WisCptI1iywMiucuaDg7uHcOgG5DRtrv1kxULxRJofGorjy', NULL, '2025-12-28 14:25:05', '2025-12-28 14:25:05'), (19, 'Lina Putri', 'lina.putri@gmail.com', NULL, '$2y$12$Q5ib5xtBQuT27dO3diHR2OMbvuEudjqOfQS.TykbIuoiVPMvg/AD6', NULL, '2025-12-28 14:25:06', '2025-12-28 14:25:06'), (20, 'Rizky Maulana', 'rizky.maulana@gmail.com', NULL, '$2y$12$727wKDdO61RcfK5i5AdKv.HqYqmpnd/byVOOIa6L./eGMgFkBcCha', NULL, '2025-12-28 14:25:06', '2025-12-28 14:25:06'), (21, 'Putri Ananda', 'putri.ananda@gmail.com', NULL, '$2y$12$8P2oUga1mv3Pau2FdjROmexrir9PpZio/9e13rwx1bKCmZXbaCSNy', NULL, '2025-12-28 14:25:07', '2025-12-28 14:25:07'), (22, 'Andi Wijaya', 'andi.wijaya@gmail.com', NULL, '$2y$12$xiiauIYOnswDUkugw655tOCVXfcaRppT8lOHJTOCiE7MQ14vTaDUa', NULL, '2025-12-28 14:25:07', '2025-12-28 14:25:07'), (23, 'Nurul Hidayah', 'nurul.hidayah@gmail.com', NULL, '$2y$12$sdEC9rUCkiQmUkq28kOcf.u7wmevQOTYq75FXWXJ.ERYjYxN.qR.C', NULL, '2025-12-28 14:25:07', '2025-12-28 14:25:07'), (50, 'Dedi Pratama', 'dedi.pratama20@gmail.com', NULL, '$2y$12$HuaXSxIQcoAxOJR8tqgbveMVNl9EkxKed6G6QatIr36CwhYo4ML8e', NULL, '2026-01-13 02:44:37', '2026-01-13 04:23:40'), (68, 'Ahmad Fauzi', 'ahmad.fauzi02@gmail.com', NULL, '$2y$12$L6h8w6jY/0lq7Rg9pVNCieoAdWeDnTXArpJyWVmF0U5SePkEmTshm', NULL, '2026-01-13 03:06:32', '2026-01-13 03:06:32'), (69, 'Siti Aminah', 'siti.aminah@gmail.com', NULL, '$2y$12$opetj9YrhvwZrKYlkNgpkuVKvvkwuapvISFtaS3dAO1gcInlst53.', NULL, '2026-01-13 03:06:32', '2026-01-13 03:06:32'), (70, 'Budi Santoso', 'budi.santoso22@gmail.com', NULL, '$2y$12$btj7XzZQL/KunfJfTPAk1uvRBN3uUbz5bBgMQrCllBm1wvk/.gWcu', NULL, '2026-01-13 03:06:33', '2026-01-13 03:06:33'), (71, 'Rina Putri', 'rina.putri@gmail.com', NULL, '$2y$12$wzenw3s2S9B9MzI.nNGsk.j3I.TypVBnnJYAJdKmLC3LO2lDYm5oa', NULL, '2026-01-13 03:06:34', '2026-01-13 03:06:34'), (72, 'M syarifuddin', 'udin@gmail.com', NULL, '$2y$12$ctoSJBmL7qa8yOJ.o4ECJu7kdCgZa39d/uTfcHNbvK7WX4N5/wZbW', NULL, '2026-01-14 08:09:07', '2026-01-14 08:09:07'), (78, 'Ahmad Fairuz', 'ahmadfairuz1@gmail.com', NULL, '$2y$12$xOxJB2QNwYwIaqIuJyyeyOh42YslIFFuAm7lQFgzZf6vA07JiXQYy', NULL, '2026-01-26 01:00:24', '2026-01-27 02:29:18'), (80, 'Mustofa', 'mustop4@gmail.com', NULL, '$2y$12$yDNh98AGPvSRBBjkAf8Hg.SXVYzSL7z8xB7Zh1GMwAMuFiDCYyYkG', NULL, '2026-02-27 20:13:10', '2026-02-27 20:13:10'), (81, 'Ikbal', 'ikbal2@gmail.com', NULL, '$2y$12$es8n5pV/7HQdhl8OUnaI.OAXN7aOo1/Hg/UARfwnQQa8MbeXwzIty', NULL, '2026-02-27 21:22:01', '2026-02-27 21:22:01'), (82, 'Siti Rohaya', 'sitiryh@gmail.com', NULL, '$2y$12$.rH1CXHxJcwBi55V1VFCfe8f2EMHZOx2OYbUGeanKd9dxhq5LIkwS', NULL, '2026-02-27 21:22:01', '2026-02-27 21:22:01'), (83, 'Budiman', 'budiman02@gmail.com', NULL, '$2y$12$XkVNmCJrWcLb16GJ0NwAIeq1tLb/ru3tP9wfN24T4VBH0J/Vt2SlG', NULL, '2026-02-27 21:22:02', '2026-02-27 21:22:02'), (84, 'Rina badria', 'rinabadr@gmail.com', NULL, '$2y$12$rDCeV1V1gLfteNXbEePleu6QaU1Sl3viI52l.Xc1ZaZ0OH5QT17l.', NULL, '2026-02-27 21:22:02', '2026-02-27 21:22:02'), (85, 'Rendi Pratama', 'rendipratama10@gmail.com', NULL, '$2y$12$LDJEnhHBMELnMw6PuZH59unl5nUxL36SLkI1nMmTmlUpNrV2AyrJO', NULL, '2026-02-27 21:36:09', '2026-02-27 21:36:09'); -- -- Indexes for dumped tables -- -- -- Indexes for table `alumnis` -- ALTER TABLE `alumnis` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `alumnis_nim_unique` (`nim`), ADD UNIQUE KEY `alumnis_email_unique` (`email`), ADD KEY `alumnis_user_id_foreign` (`user_id`); -- -- Indexes for table `cache` -- ALTER TABLE `cache` ADD PRIMARY KEY (`key`); -- -- Indexes for table `cache_locks` -- ALTER TABLE `cache_locks` ADD PRIMARY KEY (`key`); -- -- Indexes for table `exports` -- ALTER TABLE `exports` ADD PRIMARY KEY (`id`), ADD KEY `exports_user_id_foreign` (`user_id`); -- -- Indexes for table `failed_import_rows` -- ALTER TABLE `failed_import_rows` ADD PRIMARY KEY (`id`), ADD KEY `failed_import_rows_import_id_foreign` (`import_id`); -- -- Indexes for table `failed_jobs` -- ALTER TABLE `failed_jobs` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `failed_jobs_uuid_unique` (`uuid`); -- -- Indexes for table `forum_replies` -- ALTER TABLE `forum_replies` ADD PRIMARY KEY (`id`), ADD KEY `forum_replies_user_id_foreign` (`user_id`), ADD KEY `forum_replies_topic_id_index` (`topic_id`); -- -- Indexes for table `forum_topics` -- ALTER TABLE `forum_topics` ADD PRIMARY KEY (`id`), ADD KEY `forum_topics_user_id_foreign` (`user_id`), ADD KEY `forum_topics_created_at_is_pinned_index` (`created_at`,`is_pinned`); -- -- Indexes for table `imports` -- ALTER TABLE `imports` ADD PRIMARY KEY (`id`), ADD KEY `imports_user_id_foreign` (`user_id`); -- -- Indexes for table `internships` -- ALTER TABLE `internships` ADD PRIMARY KEY (`id`), ADD KEY `internships_user_id_foreign` (`user_id`); -- -- Indexes for table `jobs` -- ALTER TABLE `jobs` ADD PRIMARY KEY (`id`), ADD KEY `jobs_queue_index` (`queue`); -- -- Indexes for table `job_batches` -- ALTER TABLE `job_batches` ADD PRIMARY KEY (`id`); -- -- Indexes for table `job_opportunities` -- ALTER TABLE `job_opportunities` ADD PRIMARY KEY (`id`), ADD KEY `job_opportunities_user_id_foreign` (`user_id`); -- -- Indexes for table `migrations` -- ALTER TABLE `migrations` ADD PRIMARY KEY (`id`); -- -- Indexes for table `model_has_permissions` -- ALTER TABLE `model_has_permissions` ADD PRIMARY KEY (`permission_id`,`model_id`,`model_type`), ADD KEY `model_has_permissions_model_id_model_type_index` (`model_id`,`model_type`); -- -- Indexes for table `model_has_roles` -- ALTER TABLE `model_has_roles` ADD PRIMARY KEY (`role_id`,`model_id`,`model_type`), ADD KEY `model_has_roles_model_id_model_type_index` (`model_id`,`model_type`); -- -- Indexes for table `notifications` -- ALTER TABLE `notifications` ADD PRIMARY KEY (`id`), ADD KEY `notifications_notifiable_type_notifiable_id_index` (`notifiable_type`,`notifiable_id`); -- -- Indexes for table `password_reset_tokens` -- ALTER TABLE `password_reset_tokens` ADD PRIMARY KEY (`email`); -- -- Indexes for table `permissions` -- ALTER TABLE `permissions` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `permissions_name_guard_name_unique` (`name`,`guard_name`); -- -- Indexes for table `questionnaires` -- ALTER TABLE `questionnaires` ADD PRIMARY KEY (`id`); -- -- Indexes for table `questionnaire_questions` -- ALTER TABLE `questionnaire_questions` ADD PRIMARY KEY (`id`), ADD KEY `questionnaire_questions_questionnaire_id_foreign` (`questionnaire_id`); -- -- Indexes for table `questionnaire_responses` -- ALTER TABLE `questionnaire_responses` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `questionnaire_responses_questionnaire_id_user_id_unique` (`questionnaire_id`,`user_id`), ADD KEY `questionnaire_responses_user_id_foreign` (`user_id`); -- -- Indexes for table `response_answers` -- ALTER TABLE `response_answers` ADD PRIMARY KEY (`id`), ADD KEY `response_answers_response_id_foreign` (`response_id`), ADD KEY `response_answers_question_id_foreign` (`question_id`); -- -- Indexes for table `roles` -- ALTER TABLE `roles` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `roles_name_guard_name_unique` (`name`,`guard_name`); -- -- Indexes for table `role_has_permissions` -- ALTER TABLE `role_has_permissions` ADD PRIMARY KEY (`permission_id`,`role_id`), ADD KEY `role_has_permissions_role_id_foreign` (`role_id`); -- -- Indexes for table `scholarships` -- ALTER TABLE `scholarships` ADD PRIMARY KEY (`id`), ADD KEY `scholarships_user_id_foreign` (`user_id`); -- -- Indexes for table `sessions` -- ALTER TABLE `sessions` ADD PRIMARY KEY (`id`), ADD KEY `sessions_user_id_index` (`user_id`), ADD KEY `sessions_last_activity_index` (`last_activity`); -- -- Indexes for table `users` -- ALTER TABLE `users` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `users_email_unique` (`email`); -- -- AUTO_INCREMENT for dumped tables -- -- -- AUTO_INCREMENT for table `alumnis` -- ALTER TABLE `alumnis` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=124; -- -- AUTO_INCREMENT for table `exports` -- ALTER TABLE `exports` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7; -- -- AUTO_INCREMENT for table `failed_import_rows` -- ALTER TABLE `failed_import_rows` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT; -- -- AUTO_INCREMENT for table `failed_jobs` -- ALTER TABLE `failed_jobs` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT; -- -- AUTO_INCREMENT for table `forum_replies` -- ALTER TABLE `forum_replies` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=15; -- -- AUTO_INCREMENT for table `forum_topics` -- ALTER TABLE `forum_topics` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7; -- -- AUTO_INCREMENT for table `imports` -- ALTER TABLE `imports` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8; -- -- AUTO_INCREMENT for table `internships` -- ALTER TABLE `internships` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6; -- -- AUTO_INCREMENT for table `jobs` -- ALTER TABLE `jobs` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7; -- -- AUTO_INCREMENT for table `job_opportunities` -- ALTER TABLE `job_opportunities` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8; -- -- AUTO_INCREMENT for table `migrations` -- ALTER TABLE `migrations` MODIFY `id` int UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=55; -- -- AUTO_INCREMENT for table `permissions` -- ALTER TABLE `permissions` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=34; -- -- AUTO_INCREMENT for table `questionnaires` -- ALTER TABLE `questionnaires` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=14; -- -- AUTO_INCREMENT for table `questionnaire_questions` -- ALTER TABLE `questionnaire_questions` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=36; -- -- AUTO_INCREMENT for table `questionnaire_responses` -- ALTER TABLE `questionnaire_responses` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=20; -- -- AUTO_INCREMENT for table `response_answers` -- ALTER TABLE `response_answers` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=84; -- -- AUTO_INCREMENT for table `roles` -- ALTER TABLE `roles` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3; -- -- AUTO_INCREMENT for table `scholarships` -- ALTER TABLE `scholarships` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8; -- -- AUTO_INCREMENT for table `users` -- ALTER TABLE `users` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=86; -- -- Constraints for dumped tables -- -- -- Constraints for table `alumnis` -- ALTER TABLE `alumnis` ADD CONSTRAINT `alumnis_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; -- -- Constraints for table `exports` -- ALTER TABLE `exports` ADD CONSTRAINT `exports_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; -- -- Constraints for table `failed_import_rows` -- ALTER TABLE `failed_import_rows` ADD CONSTRAINT `failed_import_rows_import_id_foreign` FOREIGN KEY (`import_id`) REFERENCES `imports` (`id`) ON DELETE CASCADE; -- -- Constraints for table `forum_replies` -- ALTER TABLE `forum_replies` ADD CONSTRAINT `forum_replies_topic_id_foreign` FOREIGN KEY (`topic_id`) REFERENCES `forum_topics` (`id`) ON DELETE CASCADE, ADD CONSTRAINT `forum_replies_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; -- -- Constraints for table `forum_topics` -- ALTER TABLE `forum_topics` ADD CONSTRAINT `forum_topics_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; -- -- Constraints for table `imports` -- ALTER TABLE `imports` ADD CONSTRAINT `imports_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; -- -- Constraints for table `internships` -- ALTER TABLE `internships` ADD CONSTRAINT `internships_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; -- -- Constraints for table `job_opportunities` -- ALTER TABLE `job_opportunities` ADD CONSTRAINT `job_opportunities_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; -- -- Constraints for table `model_has_permissions` -- ALTER TABLE `model_has_permissions` ADD CONSTRAINT `model_has_permissions_permission_id_foreign` FOREIGN KEY (`permission_id`) REFERENCES `permissions` (`id`) ON DELETE CASCADE; -- -- Constraints for table `model_has_roles` -- ALTER TABLE `model_has_roles` ADD CONSTRAINT `model_has_roles_role_id_foreign` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE; -- -- Constraints for table `questionnaire_questions` -- ALTER TABLE `questionnaire_questions` ADD CONSTRAINT `questionnaire_questions_questionnaire_id_foreign` FOREIGN KEY (`questionnaire_id`) REFERENCES `questionnaires` (`id`) ON DELETE CASCADE; -- -- Constraints for table `questionnaire_responses` -- ALTER TABLE `questionnaire_responses` ADD CONSTRAINT `questionnaire_responses_questionnaire_id_foreign` FOREIGN KEY (`questionnaire_id`) REFERENCES `questionnaires` (`id`) ON DELETE CASCADE, ADD CONSTRAINT `questionnaire_responses_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; -- -- Constraints for table `response_answers` -- ALTER TABLE `response_answers` ADD CONSTRAINT `response_answers_question_id_foreign` FOREIGN KEY (`question_id`) REFERENCES `questionnaire_questions` (`id`) ON DELETE CASCADE, ADD CONSTRAINT `response_answers_response_id_foreign` FOREIGN KEY (`response_id`) REFERENCES `questionnaire_responses` (`id`) ON DELETE CASCADE; -- -- Constraints for table `role_has_permissions` -- ALTER TABLE `role_has_permissions` ADD CONSTRAINT `role_has_permissions_permission_id_foreign` FOREIGN KEY (`permission_id`) REFERENCES `permissions` (`id`) ON DELETE CASCADE, ADD CONSTRAINT `role_has_permissions_role_id_foreign` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE; -- -- Constraints for table `scholarships` -- ALTER TABLE `scholarships` ADD CONSTRAINT `scholarships_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; COMMIT; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; iÉ`¬®xœ340031Q(N.J,H-ÒsÉOÎN-JËÌIeÈ^�ìÜwÛñ÷~%-£å~nñ[žs±%«xœ340031Q rtuóôŽwõ ‹wö÷sót×ËMa˜+=U!ÃW-æBžìê†ÙéÊ9‡rìL R*ós3“žjÿûô&`êÆÓÁ/â�ÔÊûÒ"í !F–%¦¦efëU&ææ0øó¸nR�cö9÷@âøíef—Mž¬0·.o莴xœ›.ù_rÃÆÉ¬<“1LaŠœ|€‰kò{&# -¤  lŽÉÑÌŠÌ “K™+'`ös v ðp ŠtôsŒ÷�Œ÷t‰põM˜ìÁR2y 6io×È„Éb¬ i®ÉÓX�Ä‘•„»:Á�ðdQ™ÜÀÆ>Y€Í¨V ÈVSÄ¢džB�‚wj¥BZfÎä<6I ‰É l*“KYE ¶Èu‹mNa¿Äćê¢Éó¹¤&ç³²MŽàäF’šœÁe‚ŸÍe†Ìß|�ë8#ºÄaJ¥xœ340031QH,((Ö«LÌÍa¼"½ëo…Ò×õ\R9ÛÄë—]/ô¯1„(ÊÍLIÉI-O,J…ª]±mEí•7Úæ…‹U}3Ø/œU[\œQó#ñß÷´ÿ¥Î¥}FAWf¼:vcX‚0“뎪xœ»Í;•oC%›¾²‚®BQjbŽnf—€D“rò“³u‹SóŠ3K2ËRu K2Š'ç±åòhÑ펥xœ›Ï|”e‚d€²‚Ojzbr¥BAQ~JirIf~žBNbe~i‰•BbqjAFqIjr†^Aj®Bf±BAbfQjŠByfIT69'¿4E/;µR�Kt'2*³‚õLÜ­Ã –žØ`:9šQ`â1�‰57 r“õ¸z¹û«2<¹ x™fÿ{ "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": ["config:recommended"], "git-submodules": { "enabled": true } } V½1šîޤxœN±ÿ³³�mϸ ÂÁÁ– £õBröÚÅé‘[‘C`A$t˜ü“ö$¥¡°/Œ!,^‘·hÙ*?sRçŽ svˆí]-'v•HÄ ó厢rxœÛ̶‡mÃyF…‚ÄäìÄôÔÍçSY#Øï�Üxœ;Àœƒ,£RQiq‰nbA¦’‚RjNeqf"”“—ZQ’U¬[žš´Ù‚±ƒ …l¶™x– iö#!/usr/bin/env bash set -euo pipefail # Define an array of directories to aggressively prune from the search tree # This prevents exhaustive traversal into massive localized dependency stores, build caches, # and anomalously created cache directories (e.g., literal '~'). PRUNE_DIRS=( "node_modules" "dist" ".next" ".bun" "~" "build" ".git" "target" ) # Construct the prune expression dynamically to feed the find command PRUNE_ARGS=() for dir in "${PRUNE_DIRS[@]}"; do if [ ${#PRUNE_ARGS[@]} -gt 0 ]; then PRUNE_ARGS+=("-o") fi PRUNE_ARGS+=("-name" "$dir") done echo "Scanning for top-level and workspace package.json manifests..." # Perform an optimized find: # 1. -prune halts traversal immediately upon matching a PRUNE_DIR, achieving extreme I/O efficiency. # 2. -print0 strictly streams zero-byte delimited paths, immunizing the loop against spaces/newlines. find . \( "${PRUNE_ARGS[@]}" \) -prune -o -name "package.json" -type f -print0 | while IFS= read -r -d '' filename; do dir=$(dirname "$filename") echo "--------------------------------------------------------------------------------" echo "Initiating strict dependency update sequence in: $dir" # Spawn a tightly scoped subshell. This isolates environment state and traps internal pathing failures. ( # Strict directory entry checks. cd "$dir" || { echo "CRITICAL: Directory transition failed for $dir. Process aborted." >&2 exit 1 } # Heuristic check: Ensure the manifest actually declares dependencies before thrashing the disk with ncu. if ! grep -Eq '"(dependencies|devDependencies|peerDependencies)"[[:space:]]*:' package.json; then echo "Notice: No valid dependency blocks detected in $dir/package.json. Bypassing node traversal." exit 0 fi # Delegate command resolution to bunx. This obliterates the 'command not found' failure mode # by dynamically sourcing the npm-check-updates binary, completely ignoring global namespace pollution. echo "Executing constraint-free updates via bunx..." bunx --bun npm-check-updates -u echo "Commencing rigorous package installation phase..." bun install ) || { echo "WARNING: Subshell failure encountered in $dir. Subsystem continues." >&2 } done echo "--------------------------------------------------------------------------------" echo "SYSTEM STATE: All traversable dependencies aggressively updated." ã¢�²§xr �õ#!/bin/bash set -euo pipefail PROMETHEUS_VERSION="2.53.0" TAILSCALE_IP="100.108.1.124" PROMETHEUS_DIR="/etc/prometheus" PROMETHEUS_DATA_DIR="/var/lib/prometheus" echo "Creating prometheus user and group..." if ! getent group prometheus >/dev/null; then groupadd --system prometheus fi if ! getent passwd prometheus >/dev/null; then useradd --system -g prometheus --no-create-home --shell /usr/sbin/nologin prometheus fi echo "Creating directories..." mkdir -p "$PROMETHEUS_DIR" "$PROMETHEUS_DATA_DIR" chown prometheus:prometheus "$PROMETHEUS_DIR" "$PROMETHEUS_DATA_DIR" echo "Downloading Prometheus v${PROMETHEUS_VERSION}..." cd /tmp wget -qO prometheus.tar.gz "https://github.com/prometheus/prometheus/releases/download/v${PROMETHEUS_VERSION}/prometheus-${PROMETHEUS_VERSION}.linux-amd64.tar.gz" echo "Extracting Prometheus..." tar -xf prometheus.tar.gz cd "prometheus-${PROMETHEUS_VERSION}.linux-amd64" echo "Installing binaries..." install -m 0755 -o prometheus -g prometheus prometheus promtool /usr/local/bin/ echo "Installing consoles and libraries..." cp -a consoles console_libraries "$PROMETHEUS_DIR/" chown -R prometheus:prometheus "$PROMETHEUS_DIR/consoles" "$PROMETHEUS_DIR/console_libraries" echo "Creating configuration file..." cat < "${PROMETHEUS_DIR}/prometheus.yml" global: scrape_interval: 15s evaluation_interval: 15s scrape_configs: - job_name: "prometheus" static_configs: - targets: ["${TAILSCALE_IP}:9090"] EOF chown prometheus:prometheus "${PROMETHEUS_DIR}/prometheus.yml" chmod 0644 "${PROMETHEUS_DIR}/prometheus.yml" echo "Creating systemd unit file..." cat < /etc/systemd/system/prometheus.service [Unit] Description=Prometheus Time Series Collection and Processing Server Wants=network-online.target After=network-online.target [Service] User=prometheus Group=prometheus Type=simple ExecStart=/usr/local/bin/prometheus \\ --config.file=${PROMETHEUS_DIR}/prometheus.yml \\ --storage.tsdb.path=${PROMETHEUS_DATA_DIR} \\ --web.console.templates=${PROMETHEUS_DIR}/consoles \\ --web.console.libraries=${PROMETHEUS_DIR}/console_libraries \\ --web.listen-address=${TAILSCALE_IP}:9090 \\ --web.external-url=http://${TAILSCALE_IP}:9090/ ExecReload=/bin/kill -HUP \$MAINPID Restart=on-failure RestartSec=5s LimitNOFILE=65536 [Install] WantedBy=multi-user.target EOF chmod 0644 /etc/systemd/system/prometheus.service echo "Reloading systemd, enabling and starting prometheus..." systemctl daemon-reload systemctl enable prometheus systemctl restart prometheus echo "Checking Prometheus status..." systemctl status prometheus --no-pager || true echo "Prometheus setup completed successfully!" úé�Šà�Ü}xœ ßÿÒÒ°úšñï•�FU&¹^ùB2èYª¬ü“ÄÐ`¨x340031QHÍ©,ÎLÔ«ÌÍaxœËrtF椯u5|ï§vž¸«þ~e–!DUQjbr XQ¯Óô%�Þë?÷4œýô¾—ÆÖ\·Ð¿0E¥Å%º‰¥%`…i÷÷Ùù·ˆ„ߨ7Ñ,ÈpÛŸ,�p¨Ââä¢Ä‚Ô"°²§Ëü–lä̼%Ñ]ÔÞÜþ'§Ô·¦,#±(5¬j²ëÙgËÞñ-QþÅú_o«�â®{bMPU%E‰©i™Ù`e7,Úd/ )�J?æ9g@ØÁ ¹!ð^Ùf€Oxœ{ÁX2±¤ Z×ì��?xœ{Êu’eB{’¡¥ešEòÄzÉÉǘ&+0ÆMöaš�¥º þ!®>ñ®þA!®Añþ!>ñ®~.þž~!¶%%Vúúù%9º¹©%E™ÉźI‰ÉÙ©y)V&Ɔæ\(†»…y:»Æû9úºÚ'%¤é&dN–aõþ + á‚xœ»Ä~‰}C!“È/›°{§<–-¬+buª` o\ï�±¹•É—ñ[ 0£xœ343000P(N.J,H-bh8™·ÊiÒÄiÚg­�+³P•ß±Ú¯ »ë\xœk”ÿÒÒ°m Mu99|8SaY{3`Ìci“�e+|š½Ÿ7¹qG~óýôç”EN “úX©Y³Ö--s‚çŠò€Ëó¹Úh™÷“ft�‰FŠ55ƒ)éØ3£"5°N@„“îä¤-äæ �Úqxœ;³-x¼Í5Œ›X„ƒS‹Ê2“S‹¹¸j ìɾlJR5 .‰%‰I‰Å© 5 Þ©• >™IE‰E™©Å“gsJM>ÇÉ>9Ÿ›gòJNîÉ+9y,uuuuj¸j´´Š“‹ R‹´´jâ5ŠK“róSJsR5ãj5LQ€0oò,©ÍÛ¸28¹¡úô*ss6[ŠðJ¾=7Äã��xœ3Ìÿ¸¸�]´ï¯Óx¶?Py+Ä>y8–ä¹AV‘q3ÁËCµúw\tW”ëÜÕƒœ¯o�Fy_=¥xešÿ100644 0001-use-hub-repo-with-submodules.md·‹²¢ÙͪŠ…A·8eþ¨ŒKÿ100644 README.mdI…�;ÕÚÆ€¡_l­Fîh¶57ý@ä'ìä�©Sxœ›Á?]pÃDfn……€Ä’ …ÉÓ™]&¿d›ü†Y_Ñ5§²83QÁ1ÀSA¬&!±  X?,œ™l΢`€à*ÔpÕ(¥&&—(¤å畤æ¥À5�„ÁŠ@š�¸M¥Å% ‰¥@€-ƒk ë‚„'›±(Ày `=ÁÉE‰©E0çÁôC„�fo6gId?qHw x@¿ÿ40000 plansñÄÇ?…[@ÐÔ^lÈ5¤~Uk«40000 specsŧa¸ ëøàm—í”›ëV}»ü‹P°Fé’™ixœ›ÉùŠc‘™ÖV‹þ.kÍùr«jÕÜèËa³ªL“wæ©wç)ΦLF�5’·OÎd–÷€ø&3/­(‘á­ÿå}Õì\·­w¸T¹ÄKâ3Ìe‰ÉÙ‰éP·e°äx:—üP¨ø¤Üh'—"¼9ˆOkò_æ9ËË€Õî�xœ~�ÿêÀ°ÀY©Y³Ö--s‚çŠò€Ëó¹Úh™÷40000 appstß�P>�Š^ÓîfO"ïD,¥e100644 biome.json-4’*Ñ9…2ÐòòMNÒj “COä§Exˆl#: £‰þz ð†á¬“¦ij§6à€ xœ;Àq€cƒ³ÈÜN·.SS¦fÍ—¢7Œ+™nðsh™ÃüÃÌ I­x-Òÿ100644 devcontainer.json±!a5Ú$ÒøE�úOn¨QJ“>Ÿh©ͳ x³Lÿ{ "image": "mcr.microsoft.com/devcontainers/universal:2", "features": { "ghcr.io/devcontainers/features/rust:1": {}, "ghcr.io/devcontainers/features/node:2": {} } } E;‰ë‘ÜxœûÁøƒqÂÓ\ó·E3+éòVÊtíÌÎØºœÏ £xœ340031QHI-ÈɯÔMÉOÎN-Ò«ÌÍaX¶~±ÌºÏ™N>=Ùpçÿ2lj<ö†PÅ`UºI¥™9)º¥Å` ÂË™œí¿ž.È\pèB¿“IÒÓŽíP 9™y%`5Gì‰i%p7ÌY0œùNÜïÔµóÄù@­WËîq4°sRÿäÔ§É©lý*5ý]Ä*EvfSNGBß!匒‚QeËîá*�®M‡JÒÛõOdô»b8•tâóqëhmVNň�u3U9¡4¨¾¦§þ‰DàˆÅ6ÍÙ”Â40†üsëädëO%Ç&§ûÝ)°jé*†NL_<lÑÛ2á�MxœûÄú�uÃs&Î’Ê‚ÔäŒÔälF6Oà>‘šPxœ}SÏOAÀl(ˆF„6¦Ïµ€ºP0@Ö 1†F/8Ý}íng–ÝY�é ¯þx7c¢w¹úxóð`ïb ¼k�!¯è‘UY¤„±ë#.®�ˆ¤ÑövýÅpÑÂíxè<–±ó�ã£Þr[·çk÷ç–n®a÷+¿Â¿)");¿B”§–”dæ¥CN±™ð>"cƧ"Û9jæ×o-¯9oï9"+º xEÍA! Ðýœ‚°àUŒ êX…´Å‰1Þ]’ ºûù/?ÿ½cb-(ÅJbÏæ2êÄ{ö�¶ž»8¨f°§Ã@V æƒ*»§Äš~šÖ½û£v I綈k9¼vÆí®þ§ß�E•Qæü¢Ž;°÷×å³|õ¿<…ç€xœÛÅ8™q‚oRf~njV±˜ž˜çc•¶ xœ­Î1 Â@…á~O1L-9@:ÁÊÂR,ÖÙQ6$;Ëì$¨!w‚°MªW½�txiüà iÌvÅF€¢‰V�ï¾oí Úy3V¬oQ:nJ5/:€i÷ç({Z‰Ù+óQ‹³ATS$­hñ}�Þ“EIå”Î~àÅ,Ò+q%úð)¾ùØeQû95 ?s)ÚlºÉ}·8§K«xœ343000PHÍ©,ÎLdØñekC^¥±HKµPâ™BOÿu|q1†E©‰É% B¾ú{£d’¬O¸Ç}ðß¿™‰Þ0¥Å%º‰¥% y™ñì/>w–×°Þ·ë‰8¹nËA¨¢âä¢Ä‚Ô"††“y«œ&Mœ¦qÖú¸Â1 Uù» J6,« xœ340031QrutñuÕËMaÐúiérééMo%½�©‡N8²Fj›�Br~nA~q*_Ÿ£¹SzrÇ�ûO_iìíº·¦"/-3�¡Ç_ËÆ†ïË6�؇‰W“‚þ®…(HÉOÎN-bˆ }ÒþÞ‚c5›ú*¿Ø+õ×fDAIQbjZf6Cã^ýÚ�щçn߸~Rw™¸È� 5UíD›à Ó xœ;Éò‡Å¨8µ¨,39µØŠKA!5§²83Q7± ÄSPHÎÏ+IÌÌK-ŠÏKÌMµ‚ÊO41CRYœ‘¨kšd`až˜:±>Œ ªæÎ!=wÏ�P§øoW?[•jdn-Øx]…ÿ [K£ÉS¸ÆrMbò@S4šá€xœûÃò‡eB){Zª¥¥EbâÂ&?˜cºxe�ËjÃ0E÷þŠùYÛF�EY²(}A(ÅL”i,bËbf×_W†$¦;éîå0B| žÄLèÕ tøûø>*†H\GìÈÝq¦¡ÃÓžÏeè- ¥yĈ�oÓ\ö¾+ šoZ­žó“(²:ÀvÀQrI‡žÏâàS2S…éh¦ô+cŠ×À}ì(ê¬ `à£zÛÖ›çª~Ù­Õ$ÎZñŒ‰¸|P+»± G‹)ä­[u»Û¿V›E›ÚQþ/7¿ib)8ûÌÇZ’ÙüG‰#¶”/Tü$|Íâ€`xœûÅô‹iB»¡‘‰‘‘qòÆJFF?¨¿âÖ)xœ;Ér™Ù¤8µ¨,39µØŠKA¡¨´¸D7±´$ÄQPHÎÏ+IÌÌK-ŠÏKÌMµBHO41áDpŠ“�8¬9üƒBl� &OeLà‚KqMbò�'ç­ x340031QHÍ©,ÎLÔsÉOÎN-JËÌIeX~ë…O£ñŸµ©Ù/´³>H.xkQ\”š˜\¢[œZT–Z¤—UÌ�î]³"Ô5É|Ñ,�Øí—/Ö¾ûY)²±'ËdýÛ›ÔÁhQa*�ùåúŘÚÒâd¥ ÚÅÅ䍎Äj[­]ã¿Ýýfv)TiqrQbÐr$÷f/Hvíø{¿’–Ñr?·ø‹-O’ïVéî€5xœáÿÝÝ�D2~¸‚ˆ½ªSÁ°“ÆQçí3ô¦ò‘X…à©î¶%xV©ý# build stage FROM oven/bun:1-alpine AS builder WORKDIR /app # install dependencies with cache mounts COPY apps/elysia/package.json apps/elysia/bun.lock ./ RUN --mount=type=cache,target=/root/.bun/install/cache \ bun install --frozen-lockfile # build the application COPY apps/elysia ./ RUN bun run build # runtime stage FROM oven/bun:1-distroless WORKDIR /app # copy build artifacts COPY --from=builder /app/dist ./dist COPY --from=builder /app/package.json ./ # distroless uses nonroot user (UID 65532) by default, or we can use it USER nonroot EXPOSE 4092 CMD ["run", "dist/index.js"] Ñ]ÆÔ°}x�UakÛHýî_1]J‘©-»M{S¸6�BÉm�~8ªH«xƒ´«Û]%©ÿû½Yi9ÕµÅ`¯FofvfÞ«º1ÖÓɽrÞ}ºÕù‚¬ÌŠ3UI~¢•ÖÔ$´)ä¦tb¦¢‹•ÎT×rAN6ǰ&ó;1›åF;O¿S–¶ˆ‘®Ø(æ=BéBîÿ„ÏÓ{-H„·éÎ×zDöRûÏ·�tpº›1`CÂ˽_ñù5å»Ì:é·­/—¯Ä˜Ü¹Áq qÅ€¬i*•g^½ºÊ®3—[Õøi¸ÑœÑSPw} ¤ª³K¹Âùéõð�}oÇ9Ø®š{ÛU#£QNX/U9„Å9¸ßÈ‹f0òC°ªÜ ÆýOº›’#”èèêçÁø|l}ÌÞPa:Ìfe«sîO·ÁÀåèÂìIJ|ñT´¡¤uó0(ooÃ/Á÷V“–7ô±wNÆÜ"Ì`h„stí@˜O¾£DZkl˜H•½áMšƒ®´ÝnIœžÿqzþYDÌtZqn<�™V‚s9ŸùTx±~ÑåCÆÒ‚B(ÑT2 yÁ…½P0làÝÝ(€§ ïA]«³Š>I{--�rGY_®×}•G vŒÏZIºbúðß5~ÐJ ÷o;½,Y0bÃE ò Êb"‰·Y¾“K[SÑ/s¶…é£ñãy‡ë<4 _gµìîǽòØ,�dH´å±Ä]µpôó‚‹® K*:PA,%�¸ IÕƒžj{÷JŶèsÖ�S-g´¬+oJ û�0Í£ d¿sk�g%/Ø!/Xg|¸8dÛýé1´“¶'°“¶K¶C·Š Ü¡/·Š§1ŸÐ�—Æœ�Õ¼m,Úœ©ÀÔ¸p”.”X©‰T)£ýhªgýyÊ;�+kOWÖ6P¿«Í­ãWÐâ=–  » U¤z2„¥æ b íòs&yF}* l¥A£J¢;.¢Gõ‹7q•)*X”Á:}*`Ålþ•q§Ù4úcåÉ*.s¦(SÞÆ«‚bhÂLk:YŽÚ\ —£¸K=#<ÃÐ</6¬¼·qó§ŸA¿àEÃ�½=@$úKeV¿˜²ÏîØMÓ_§Ï?è(²4ŽTÊYÀcE•'• Q^“lž'‹rêK %7SÕm`II• Ð)<Ônu~úãþ8®6NbÓ/êÕÛÑߪ×,¢÷«÷-¢¡¶i½S[œÃ[i’PöϰK£ïµË Pï×ZÑ^}¾‚>êõú]‹è·uhüwÖC×6Åo±’·¼)xœcý# ─── Stage 1: Build ───────────────────────────────────────────────────────── FROM oven/bun:1 AS builder WORKDIR /app COPY apps/react/package.json apps/react/bun.lock ./ RUN bun install --frozen-lockfile COPY apps/react . RUN bun run build # ─── Stage 2: Runtime (Bun static server) ────────────────────────────────── FROM oven/bun:1-alpine WORKDIR /app COPY infra/docker/react-server.js ./server.js COPY --from=builder /app/dist ./dist EXPOSE 80 CMD ["bun", "server.js"]jº8P«x{„ÿ100644 TRAEFIK_ENV_CONFIG.md�• hM&\Ðn«€›g#lÂl>40000 dynamicD{ƒ»õÙãÛ²£¢Ü_³î®Í‘100644 traefik.yamlO E²%œ6ómÀaá^·v6Ó4ä®| 0|¥xuŠÿ100644 apps.yaml' ßñÕõ ~ոċÖxíp100644 middlewares.yaml¨¶¨}Ôì+7qˆp£%Mhá”100644 ssl.yamløaþ÷fÿuCu08Ž2RÔ˜êÆØ²µè1ž¯x�pÿ100644 add-new-app.md_�šÛ pGD@ONU„»‘40000 adr´ï¯Óx¶?Py+Ä>y8–ä¹AV40000 config£�³n¢ÉkŸ ¥É‰Ãv0hrÂ40000 superpowersÁËCµúw\tW”ëÜÕƒœ¯o�FGª8nê^�è^xœ•TÍnÓ@Vú›Fª„Z!ˆ2ˆ%Ôvœ4 IO¤´P¤BCR•¢Ý�³I¬:¶Y¯›¶ª(}$´p‰‰Ry¸ñ\y vcç—rèJí|™ùæóìÌ~N¼Ó¿�D@¬#(bÖ€þu+¤†}‹Áºc` Še|ì0âñk‘Y®GÆÎ»'mì–ø‡èþ)zQìÿ�÷ÌqÉ÷Š»®—¤S±ÏHB=ŸBCBe€ÏpC¼°ï7aÊo”%ð Š]Ó®+`6q�€K�ýƒ¤��Q I5 O� —Ø’ä¸ê^[âªuà™8�ÒBÚ µ !鳄P‚-f6IRJN Ì’/|óâ!å<,û¶ø]¡æá¡EÄ©Dª¦—� Ï`�P)l0xJ*ý‘ s¢]ׇ…ܧŽÍˆ] “[&#縳èbY–�ÐNŠvV/ÀPúýê- /þ:r‰“èÕÿ1G€k#<©ÅT@ÝKÕšRÅíXí/ ¾=ª^ .ïÁÚ½Te¸åµÿ8úæ¦$ÒVc—К)Ê©2èr/YX4+�_›‹‡}P=2à|+0Ä+1µE*ý®ï§ºéø÷1¥Ïú3vw­'Åk`õFym£´¹#¤Ç® 6—`5‡ö‰PzIÂÞ%Tâ|uüË1B¨‚½†ˆíŒĮÂàŒÄ LëŽ(�~½.îz¹bу¦í1lYí³€*Ù“AAÇ =v‰Ä.Ûn³#Ï�¡‹+s[j +¦%@I9NH\w¨£ÜÂõ:¡güSðlCNÏžIZ=µå¡Ó“‰_¾-òç‘Iñ`̈�?îv:J麖ÒsZJK¥3ò‰(:«SR~²qÔð+H<íûw¸�C±]'}Óæ³Z:“ÓrYIXp]0Ä#T�ªe%>L�†eÚþ>˜Êh©¼–Íò“©ÛÙÀ×Â.s\5]Ë’”鯛ôÍe…뢖ÎKd'îÔj‚‘$vúøôëÔîh´óÕ|núN×8Ýžþ9Þ³â³/#†ÔÀïVxœàÿÀÀ�°÷(Õø�mŸ6¾èÞ×È¿ué“Q±Ä|Þëë4xœûÁøƒq‘nÑÿw-»P�sgQ÷ß­+´«+à“„-xœ;Àq€cC³ŸÛ"—9†ûËZº° .íufãÒÉ5ÌGäWóî¦xœ[͸šq‚±ˆ“«�¥âÅÍ*ì¦7wñ•džÝ}1Ñ= U ‰îûxœ{Áø‚q‚¹ˆÆö¨5Ñ—­ïO÷­4Uõ6+aážß6Ñ{.Â� 4äò*xœ$ÛÿêÀ°!“KGF¢Dœ1¿úÇíu¡p~fëi�¥“¦Ä E(«xœ343000PHÍ©,ÎLdØñekC^¥±HKµPâ™BOÿu|q1†E©‰É% zDô”'n];#Ç>ëÊ>öËJÆ·NÔ—è&––d0äeƳ¿øÜY^ÃzßZ ¬'âäº-¡ŠŠ“‹ R‹Næ­rš4qšvÄYëã Ç,Tåwì(ð6/è�íjxœ(×ÿÝ ë �Þ““[u“óF“û “|6“Ö³1°³(5IGWlôxœ{Åq€cƒ"ófofyF�°î¨yxœ[͸šq‚±ˆöd†ïš !GjÖ›Lû?_,�™_z¢{ ¨� ܨxœ340031QHÍ©,ÎLÔ«ÌÍaÈš.ÅþLƒyémÛÄ®õ›Ü !ªŠR“KÀвéæ)u}-ÿÁ°õõ/ù±›$ޤÕ—è&––d€¦Ýßgçß"~cWÜD³ Ãm²¡ ‹“‹ R‹ÀÊž.ó[²‘3ó–DwQ{{pûŸœRߘ²ŒÄ¢Ô°ªÉ®gŸ-{Ç·Dùë½­vŠ»î‰5AU•%¦¦efƒ•ݰh“ ¼ (¤t*ýü™çœaƒæMÝ[Fâ¨)xœûÅô‹iB»i’�…ybêÆJFFC*åöNxœ{Åq€cÃ}&‘©{]Ûí¿øUê¾ÓTÊOþèX¹Ë?sòg&½ÍÞÌòŒ@½¤«xœ343000PHÍ©,ÎLd0vÛ}lÒßøre¾¥éÊr.¹Ïë®ÅBT¥&&—0ì~·vVÛö¶I_Öy®ôóc<ñå}LAiq‰nbiIC^f<û‹Ï�å5¬÷­Âz"N®Ûrª¨8¹(± µˆ¡ádÞ*§I§iGœµ>®pÌBU~Çn3«9Gà€w–×°Þ·ë‰8¹nËA¨¢âä¢Ä‚Ô"††“y«œ&Mœ¦qÖú¸Â1 Uù»çH8 é‚xœ9ÆÿÀÀ�°¢#cY‰üù’g"Ü0rA!Æ`Óš±ÄØà�0-2íñT"MÒÍš™]W³óMí\Iëý/xœûÁøƒq‘M¿´ýzs.¹ê=}ÂÕ$îcñk· Áî‚xœkfjfš°_dc‹CÊžòåÍ'�p\“Hˆhf�gâeÌI ·«xœ343000PHÍ©,ÎLdð®ÑÙ›Êxp�œÁsíà®ÊSªnBT¥&&—0x)ÜÆ}¹QÍÀÞÌBrÆŠú©[v§Â”—è&––d0äeƳ¿øÜY^ÃzßZ ¬'âäº-¡ŠŠ“‹ R‹Næ­rš4qšvÄYëã Ç,TåwìÑ}5Sëÿ xœäÿøø�ä2¨ˆ›ÈlËüꊙ›Äð˜ q)¿ð)æƒpxœ6Éÿƒƒ�n°Tñ“f¹${:�lÍ�¦Û0é‘‚=±„@d¼w§ƒÉÄÖ`Xƒž?ß‘Ó0ƒ„[»xk”ÿ# Add files here to ignore them from prettier formatting /dist /coverage *.env **/target/ **/node_modules/ Ö;$›µx…zÿ{ "singleQuote": true, "printWidth": 100, "tabWidth": 2, "trailingComma": "all", "semi": true, "arrowParens": "always" } R‘'k¤xT«ÿ100644 extensions.jsonÆG9”2&ç©U¯§ýݦö¯100644 settings.json gïBKÎg‘‰>šW»•/€ýSn“2û!©3xüÿ{} x«x‹tÿ160000 elysiaÒï‚Êm«ð” öì%+·Âç²ãæ160000 reactº`€ãɰ³ÑtÊO†?Ü,îë160000 rust-authni_èó‰w|ß;VŒXÉ®´Á160000 scraper€ÉnªB’‘–+XÍ;Ç Æ8%¸»¬G=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="], "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], "@humanfs/core": ["@humanfs/core@0.19.2", "", { "dependencies": { "@humanfs/types": "^0.15.0" } }, "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA=="], "@humanfs/node": ["@humanfs/node@0.16.8", "", { "dependencies": { "@humanfs/core": "^0.19.2", "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ=="], "@humanfs/types": ["@humanfs/types@0.15.0", "", {}, "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q=="], "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], "@types/conventional-commits-parser": ["@types/conventional-commits-parser@5.0.2", "", { "dependencies": { "@types/node": "*" } }, "sha512-BgT2szDXnVypgpNxOK8aL5SGjUdaQbC++WZNjF1Qge3Og2+zhHj+RWhmehLhYyvQwqAmvezruVfOf8+3m74W+g=="], "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], "@types/node": ["@types/node@25.9.2", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-G05zqtJhcDLb8uslf5EjCxXg9G1KQxiV8OS0R26IC//Eoyitzqe8z37I7cqvnZlrlSfgocQRfSn/AHBZJJFyGw=="], "JSONStream": ["JSONStream@1.3.5", "", { "dependencies": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" }, "bin": { "JSONStream": "./bin.js" } }, "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ=="], "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], "ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], "ansi-escapes": ["ansi-escapes@7.3.0", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg=="], "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "array-ify": ["array-ify@1.0.0", "", {}, "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng=="], "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], "brace-expansion": ["brace-expansion@1.1.15", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg=="], "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="], "cli-truncate": ["cli-truncate@4.0.0", "", { "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^7.0.0" } }, "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA=="], "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], "commander": ["commander@13.1.0", "", {}, "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw=="], "compare-func": ["compare-func@2.0.0", "", { "dependencies": { "array-ify": "^1.0.0", "dot-prop": "^5.1.0" } }, "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA=="], "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], "conventional-changelog-angular": ["conventional-changelog-angular@7.0.0", "", { "dependencies": { "compare-func": "^2.0.0" } }, "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ=="], "conventional-changelog-conventionalcommits": ["conventional-changelog-conventionalcommits@7.0.2", "", { "dependencies": { "compare-func": "^2.0.0" } }, "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w=="], "conventional-commits-parser": ["conventional-commits-parser@5.0.0", "", { "dependencies": { "JSONStream": "^1.3.5", "is-text-path": "^2.0.0", "meow": "^12.0.1", "split2": "^4.0.0" }, "bin": { "conventional-commits-parser": "cli.mjs" } }, "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA=="], "cosmiconfig": ["cosmiconfig@9.0.1", "", { "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ=="], "cosmiconfig-typescript-loader": ["cosmiconfig-typescript-loader@6.3.0", "", { "dependencies": { "jiti": "2.6.1" }, "peerDependencies": { "@types/node": "*", "cosmiconfig": ">=9", "typescript": ">=5" } }, "sha512-Akr82WH1Wfqatyiqpj8HDkO2o2KmJRu1FhKfSNJP3K4IdXwHfEyL7MOb62i1AGQVLtIQM+iCE9CGOtrfhR+mmA=="], "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], "dargs": ["dargs@8.1.0", "", {}, "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw=="], "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], "dot-prop": ["dot-prop@5.3.0", "", { "dependencies": { "is-obj": "^2.0.0" } }, "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q=="], "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], "environment": ["environment@1.1.0", "", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="], "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], "esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="], "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], "eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="], "execa": ["execa@8.0.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" } }, "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg=="], "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], "fast-uri": ["fast-uri@3.1.2", "", {}, "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ=="], "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], "flatted": ["flatted@3.4.2", "", {}, "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA=="], "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], "get-east-asian-width": ["get-east-asian-width@1.6.0", "", {}, "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="], "get-stream": ["get-stream@8.0.1", "", {}, "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA=="], "git-raw-commits": ["git-raw-commits@4.0.0", "", { "dependencies": { "dargs": "^8.0.0", "meow": "^12.0.1", "split2": "^4.0.0" }, "bin": { "git-raw-commits": "cli.mjs" } }, "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ=="], "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], "global-directory": ["global-directory@4.0.1", "", { "dependencies": { "ini": "4.1.1" } }, "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q=="], "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], "human-signals": ["human-signals@5.0.0", "", {}, "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ=="], "husky": ["husky@9.1.7", "", { "bin": { "husky": "bin.js" } }, "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA=="], "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], "import-meta-resolve": ["import-meta-resolve@4.2.0", "", {}, "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg=="], "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "ini": ["ini@4.1.1", "", {}, "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g=="], "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], "is-obj": ["is-obj@2.0.0", "", {}, "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="], "is-stream": ["is-stream@3.0.0", "", {}, "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA=="], "is-text-path": ["is-text-path@2.0.0", "", { "dependencies": { "text-extensions": "^2.0.0" } }, "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw=="], "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], "js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], "jsonparse": ["jsonparse@1.3.1", "", {}, "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg=="], "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], "lint-staged": ["lint-staged@15.5.2", "", { "dependencies": { "chalk": "^5.4.1", "commander": "^13.1.0", "debug": "^4.4.0", "execa": "^8.0.1", "lilconfig": "^3.1.3", "listr2": "^8.2.5", "micromatch": "^4.0.8", "pidtree": "^0.6.0", "string-argv": "^0.3.2", "yaml": "^2.7.0" }, "bin": { "lint-staged": "bin/lint-staged.js" } }, "sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w=="], "listr2": ["listr2@8.3.3", "", { "dependencies": { "cli-truncate": "^4.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", "rfdc": "^1.4.1", "wrap-ansi": "^9.0.0" } }, "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ=="], "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], "lodash.isplainobject": ["lodash.isplainobject@4.0.6", "", {}, "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="], "lodash.kebabcase": ["lodash.kebabcase@4.1.1", "", {}, "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g=="], "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], "lodash.mergewith": ["lodash.mergewith@4.6.2", "", {}, "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ=="], "lodash.snakecase": ["lodash.snakecase@4.1.1", "", {}, "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw=="], "lodash.startcase": ["lodash.startcase@4.4.0", "", {}, "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg=="], "lodash.uniq": ["lodash.uniq@4.5.0", "", {}, "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ=="], "lodash.upperfirst": ["lodash.upperfirst@4.3.1", "", {}, "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg=="], "log-update": ["log-update@6.1.0", "", { "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w=="], "meow": ["meow@12.1.1", "", {}, "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw=="], "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], "mimic-fn": ["mimic-fn@4.0.0", "", {}, "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="], "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="], "minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], "npm-run-path": ["npm-run-path@5.3.0", "", { "dependencies": { "path-key": "^4.0.0" } }, "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ=="], "onetime": ["onetime@6.0.0", "", { "dependencies": { "mimic-fn": "^4.0.0" } }, "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ=="], "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], "picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], "pidtree": ["pidtree@0.6.0", "", { "bin": { "pidtree": "bin/pidtree.js" } }, "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g=="], "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], "prettier": ["prettier@3.8.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw=="], "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], "semver": ["semver@7.8.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ=="], "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], "slice-ansi": ["slice-ansi@5.0.0", "", { "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" } }, "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ=="], "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], "string-argv": ["string-argv@0.3.2", "", {}, "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q=="], "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], "strip-final-newline": ["strip-final-newline@3.0.0", "", {}, "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="], "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], "text-extensions": ["text-extensions@2.4.0", "", {}, "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g=="], "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="], "tinyexec": ["tinyexec@1.2.4", "", {}, "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg=="], "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], "undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="], "unicorn-magic": ["unicorn-magic@0.1.0", "", {}, "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ=="], "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], "yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], "@commitlint/config-validator/ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="], "@commitlint/format/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], "@commitlint/load/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], "@commitlint/top-level/find-up": ["find-up@7.0.0", "", { "dependencies": { "locate-path": "^7.2.0", "path-exists": "^5.0.0", "unicorn-magic": "^0.1.0" } }, "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g=="], "@commitlint/types/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], "cli-truncate/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], "cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], "import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], "lint-staged/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], "log-update/slice-ansi": ["slice-ansi@7.1.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w=="], "log-update/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], "restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@4.0.0", "", {}, "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ=="], "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], "wrap-ansi/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], "@commitlint/config-validator/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], "@commitlint/top-level/find-up/locate-path": ["locate-path@7.2.0", "", { "dependencies": { "p-locate": "^6.0.0" } }, "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA=="], "@commitlint/top-level/find-up/path-exists": ["path-exists@5.0.0", "", {}, "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ=="], "cli-truncate/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], "cli-truncate/string-width/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], "log-update/slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "log-update/slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ=="], "log-update/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], "wrap-ansi/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], "wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], "@commitlint/top-level/find-up/locate-path/p-locate": ["p-locate@6.0.0", "", { "dependencies": { "p-limit": "^4.0.0" } }, "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw=="], "cli-truncate/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], "@commitlint/top-level/find-up/locate-path/p-locate/p-limit": ["p-limit@4.0.0", "", { "dependencies": { "yocto-queue": "^1.0.0" } }, "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ=="], "@commitlint/top-level/find-up/locate-path/p-locate/p-limit/yocto-queue": ["yocto-queue@1.2.2", "", {}, "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ=="], } } án ˺ xÊ5ÿimport antfu from '@antfu/eslint-config'; export default antfu({ formatters: true, typescript: true, rules: { 'no-console': 'off', 'eslint-comments/no-unlimited-disable': 'off', }, }); “‘B”î‚‚xœ[͸šqB©ÈVÁèžó-/jš§¹_û.²î܃6ʼn�JÏBFè’ÚNxœÛËÔÍ4ÁO+µ8'3¯DAOI‡K”Òò‹rK”¬” ŠRKJ2S‹tuË‹2KR'îK0†‰�äãŒõLôŒ`ú æ€Å-õ -ô ”€âµ\µ\’qÖà–›_xœ ßÿ™ ™ °ÁùaÕá)¥L„íÕ)¹®Ï¿ýñû“ÕÄýiî€9xœ[͸šq‚±ˆ‰ ¿¬|jÝ9«wŽÛ¥V°ê›üø1Ñ=›× *¨xèÿ100644 elysia.ymlE]U[fœ¿?[lÇ9¾«š$100644 react.ymlú™ÿÐbïŠ+³æ¬ž¡1ÅR¸100644 rust-auth.ymlõÙRè+ò¨ÃÜ2†¤&MäÍc¶F…100644 scraper.yml¹±ÁwÕÔ(õ�gâ ‚øã¦ö100644 shared.yml“EÍæ¦î¤#úÿ.µ>!ºÞ‚100644 traefik.ymlØ8†QÐ"ÊgÏÌç PVÁR�pû`,á‚¶_xœûÃò‡eB)»�…¥ejJòÂ&= 2₵]xœûÅô‹iB»�…¥ejJòÆJFFBÉ4î�òKxœ;Ér™Ù¤8µ¨,39µØŠKA¡¨´¸D7±´$ÄQPHÎÏ+IÌÌK-ŠÏKÌMµBHO41E¨-ÎHÔ5°°´LMIžXƉPõÀš3À?(ÄÖØÀÀ`òTÆ.¸×$&OêL+œâ�ó5xœ;Ér’eB»�…¥ejJòÆúSŒ>y«è–Ÿuxœ8Çÿ™ ™ �°uäîU¸ Œ€—¿�Þ½¾�ƒb�6±ÄýùaÕá)¥L„íÕ)¹®Ï¿ýñû“ÕÄ0æÍë‘è"xœäÿøø�äÌ�ôß§J=§?õ.–ÑéhÒ˜¿6'£xüþ100644 deploy-docker.yml~Á®Œˆ—Aµ²£k'2ি¸Ó«ó100644 docker-build-push.yml[xZ¬cF„à)� ­30jui100644 lint.yml£Ëö=Fÿ @ í´éŒz^–Š{100644 security.yml\Žñ=ÄžãU¼“ßoK½bô8ƒ1100644 typecheck.ymlù'lÛ¢ þ»׬`Æø&d<100644 update-submodule.ymlŸRÝ Ä]ìMˆøÀó¹ážýÓ$¯jR啵xœ{¸?`ƒ:Kfš•Âd¦šÍaÌ3TZÃ{à•˜txœ[]ø¾`B!{AbrvbzêÆ¤ïL› ™;Ù8 Å“û¹ì6q5qOþªÅ¿ù¶h ûfÙ"ÞÉäd7¿Ö:À ^”�é”ùxxœ[ÌÜÊx!Þÿ™ ™ °1õIã,hJJ °–Æ øðÎwU³ET× §x‡xÿ40000 elysiaCŽ›#Õ*’—”"mlýÓï (|Á40000 reactf:È](cd½þÖ�Äg›E“eÈ40000 rust-auth5¹Y¬�á?Ynß=e ÛrÐ ”U40000 scraperÚŒ3‰=Â8qĄє”s2M´´çAÂX6[¦x&Ùÿ100644 .gitignoreL þ;è¨fl#ÂyÏD›—î›ä(í”ôuxM²ÿ§ìEnode_modules dist .env .env.local *.log .DS_Store /generated/prisma °§ Φx&Ùÿ100644 .gitignorežßáQbi¬›1–Ú“ZTïàýo ¸xh—ÿnode_modules dist *.tsbuildinfo .env* .claude/ .codegraph/ .code-review-graph/ .superpowers/ .remember/ ‰C$L¦x&Ùÿ100644 .gitignoreäÍf@"“ʆ‰\`óÿ±/ð|"±xA¾ÿtarget/ .env *.swp *.swo .DS_Store **/.codegraph/** **/.claude/**—¥�¦x&Ùÿ100644 .gitignoreÉë“ÖC5îNtû‰±_Bà$þÆ,²ÅI HÈ4—cóËÍZ1䨆