Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 88

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 215

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 216

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 217

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 218

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 219

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 220
PK!WJqq parser.sonuȯELF>@@i@8 @8[8[ 0]0] 0]  ]] ] 888$$[[[ Std[[[ PtdWWWQtdRtd0]0] 0] GNU?vr.p+!ax F@ FIBE|ŷ|!qXa[ t `qRJUy" G<"Bl/qN`, *{F"^37ab tb U Hhb __gmon_start___ITM_deregisterTMCloneTable_ITM_registerTMCloneTable__cxa_finalizeruby_xfreerb_gc_mark_mayberuby_xrealloc2ruby_xmalloc2rb_check_typeddatarb_str_duprb_eTypeErrorrb_raiserb_funcallvrb_ary_entryrb_ary_push__stack_chk_failrb_data_typed_object_zallocruby_xmallocrb_utf8_encodingrb_enc_interned_strmemcpyrb_utf8_str_newrb_str_internrb_enc_raiserb_ary_new_caparb_hash_foreachrb_obj_freeze_inlinerb_class_new_instancerb_hash_newrb_ary_newrb_cstr2inumrb_respond_torb_str_new_cstrrb_hash_arefrb_hash_asetrb_cstr_to_dblrb_float_newrb_class_namestrrchrrb_str_substrrb_path_to_classrb_sym2idrb_mKernelrb_debug_rstring_null_ptrrb_error_arityrb_keyword_given_prb_string_valuerb_enc_getrb_ascii8bit_encodingrb_str_conv_encrb_hash_duprb_id2symrb_enc_associaterb_eArgErrorrb_fix2intrb_unexpected_typeInit_parserrb_ext_ractor_saferb_requirerb_define_modulerb_define_module_underrb_cObjectrb_define_class_underrb_path2classrb_gc_register_mark_objectrb_define_alloc_funcrb_internrb_const_getrb_define_methodlibruby.so.3.2libm.so.6libpthread.so.0libc.so.6_edata__bss_start_endGLIBC_2.14GLIBC_2.4GLIBC_2.2.5/opt/alt/ruby32/lib64Wyii ui 0] 8] @] @] `] Mh] p] x] _ _ _ _ %_ <_ =_ >_ ?`  ` (` 0` 8` @`  H`  P`  X`  ``  h` p` x` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `  a !a "a #a $ a &(a '0a (8a )@a *Ha +Pa ,Xa -`a .ha /pa 0xa 1a 2a 3a 4a 5a 6a 7a 8a 9a :a ;a ?a @a Aa Ba Ca Db EHHiI HtH5I %I hhhhhhhhqhah Qh Ah 1h !h hhhhhhhhhhqhahQhAh1h!hhhh h!h"h#h$h%h&h'qh(ah)Qh*Ah+1h,!h-h.h/h0h1h2h3h4h5h6h7qh8ah9Qh:Ah;1h<!h=%E D%E D%E D%E D%E D%E D%}E D%uE D%mE D%eE D%]E D%UE D%ME D%EE D%=E D%5E D%-E D%%E D%E D%E D% E D%E D%D D%D D%D D%D D%D D%D D%D D%D D%D D%D D%D D%D D%D D%D D%D D%D D%}D D%uD D%mD D%eD D%]D D%UD D%MD D%ED D%=D D%5D D%-D D%%D D%D D%D D% D D%D D%C D%C D%C D%C D%C D%C D%C D%C DHf.DH=C HC H9tH6A Ht H=qC H5jC H)HHH?HHtH A HtfD=-C u+UH=@ Ht H=N> dC ]wH V7Hx=WHx0HH WHxHH WHxHH øf.HGhH@Hpff.@USHHHohH}HtHHH[]ff.SHH?H{ H{@H{HH{PH{`[fATIUHSHtWHOIT$HH)H9v:HHHH)H9rH9vI|$HI\$ID$[]A\@H? I $ID$IL$ff.HH5< H8Ht HH> H5]*H81AUATUSHdH%(HD$1H$t&IH5A HI11LHu#1HL$dH3 %(uIH[]A\A]@1LVHHH5@ H$HtLLqUH; pSH% Hh Hf@H@HHEhHH[]ff.@UHAWAVIAUIATSH8UMdH%(HE1HH)HEH=HuHHEHHHH%H)HHH9tHH$H9uHD$HHEL}M1M9w mI9vWIA<$\I\$uM9vLL)IAD$M LH+]I\$Iw+DEĿHuH3HE)Iv:IIE?HuMH)HLLA?HuĿHAȀDEňEA|$u I|$I\$ %LI %HEHHI I LHuHELH ?ȀELH?ȀED?ȀEHLLLHuH ELA?HAȀ?DEƃȀEGH}w#H< iLHw&HH1RH}"H}w#H; ,LH&HH1H}\f.AVAUIATUHSHHdH%(HD$1HwH9>"E1EXHm`HLIuIHH5FHLLHAHCHt$dH34%(\H[]A\A]A^HL`L9H"tS\uL`L9Hu9LfEXA1tM0u1u81҅H{LsUXIEL4@}41ɺIUH59 HHH$1IEHpH9H@0 HpH9H@|0 weHpH9H@r0 wCL`L9@<@i0< LE1F~ayHF~a{DF~avfHA0HA"Hm`H:LAAWIAVAUIATUSHXdH%(HD$H1H9tGHHH#MAfDHEH9t}rQAG8t I}E1Ht$HdH34%(LHX[]A\A]A^A_fDHDHH9q멃0 wHEH93 H5? HA,wH27 Le IEDHEH9C}a5HEH9(}NAw,H6 LeIEf.A@IWHlj$AG(w9oH=6 H5D1hHEH9}aHEH9}lzHEH9m}s_HEH9R}eDIELeHEH9#}uHEH9}lHEH9}lIELefDHEH9M*tN/AO8HHhH9@<*tt:H=3 DH5~1f8 #HH9uDH11IEH9tD}{Hu;LBL9t2B<"< t< LLBL9u@I#H11=IEH9}[HH LrL9rF F.0@ @HD$(HD$HD$0HD$D$HL$HLHD$(L,IHYIHHt$(I}Ht$0HL$H51 ID$HPH9t-H,tC0 t 4HHPH9uIfD  LLrL9JA fDifDHEH9}uHEH9}ezIELe$fIoH9E<-g <01I<w5IL9^A*uIL9A<*t uLrL9tB<*tJ uIL9t@A<*t*u@ `@H / {LHHH1d@/] ID0 ]HL$EHLHD$(AH8I@H|$ HD$\H|$0I}HD$(HL$H5) HD$8LD$I@L@L9P,t7j t nLL@L9uf< t <LIL9B< t~<"~ tHH9uHH9<*t*u _H/} D@HLpL9@0@ wxE1HHHHHHD t w;HHXH9P t/uHXH9t@<*tlEt,<BDD V ABE =HX E 8FBA A(I@R (A ABBE $P4QEMD uDA,xl&AC DEJ^ K @l@BBE A(D0G@ 0A(A BBBD HhBEB E(A0A8D 8A0A(B BBBG (8EHD0 AAE @d [FEL A(F0DPF 0A(A BBBH zRx P(XHGNU@] M.=GW H K0] 8] o`   ` xh ooo8o]  0@P`p 0@P`p 0@P`p 0@PGA$3a1H-K GA$3p1113@KGA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA! GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*GOW*GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realign GA*FORTIFY KGA+GLIBCXX_ASSERTIONSparser.so-3.2.11-13.el8.x86_64.debugy?7zXZִF!t/G]?Eh=ڊ2NVtj[Y \J`ivNUu93 _+%m 1$R<{~PQ՛tYig- 5'} u{*0ЁM: Plw kņtpaODvdbI>r[[[SuG53Jq}o/VPu+Iq4e ЅA{T>Id\{MfI1*yۓ6q_y[Ғ&M/(l}8#2v{=ɀ+6%(mgĖH;l?Ppq[usg(1dдS݈3;2]$r3? $kH%!Z: Pr*bMPPNT@נNW߃vҺ},lQC+*{E_o-L!lxw\[ˈ0V=? PĻm_-+Zʜ2fyk7f=;]En RĖp(8*d=]-$|T4pii,+*HJR;16Me5SSMaǑ1߼ B1a55U|Mӆ𣽙LSc-?nVKvf HJz^&tp;Wچ2`| WG0qJ"`Q(i[i"9rI"YA8 agYZ.shstrtab.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.note.gnu.property.init_array.fini_array.data.rel.ro.dynamic.got.got.plt.bss.gnu.build.attributes.gnu_debuglink.gnu_debugdata 88$o``4( 0 8o88Eo@Th^BxxhHHcppn``w@@,} K K @K@K@ WWXX[[ 0] 0]8] 8]@] @]h ] ]_ _@` `b bb`bH Pd,|d h+PK!ϕpp generator.sonuȯELF>@0@8 @tt }} }  }} } 888$$sss Stdsss Ptd8e8e8eTTQtdRtd}} } GNUviU*XiI(gL@$LNOBE|qXt)WBJ 5#W"a?hUc.s ydSm"|~"4} <of>, KF"(*Xpr    W__gmon_start___ITM_deregisterTMCloneTable_ITM_registerTMCloneTable__cxa_finalizerb_check_typeddataruby_xfreeruby_xmallocruby_xrealloc2ruby_xmalloc2memcpyrb_str_newrb_utf8_encodingrb_enc_associaterb_funcallv__stack_chk_failrb_hash_newrb_obj_classrb_class_namerb_hash_asetrb_str_new_staticrb_str_duprb_str_catrb_str_concatrb_str_internrb_sym2idrb_ivar_setrb_attr_getrb_data_typed_object_zallocrb_obj_is_kind_ofrb_cHashrb_class_new_instancerb_eArgErrorrb_raiserb_hash_foreachrb_error_arityrb_unexpected_typerb_hash_arefrb_intern2rb_ary_entryrb_string_value_cstrrb_iv_getrb_str_substrrb_id2symrb_string_value_ptrrb_float_valuerb_debug_rstring_null_ptrrb_enc_getrb_usascii_encodingrb_str_export_to_encrb_enc_str_asciionly_prb_path2classrb_cFloatrb_cArrayrb_cStringrb_respond_torb_cFalseClassrb_cIntegerrb_cNilClassrb_cTrueClassrb_cSymbolrb_id2strrb_check_convert_typerb_convert_typeInit_generatorrb_ext_ractor_saferb_requirerb_define_modulerb_define_module_underrb_gc_register_mark_objectrb_cObjectrb_define_class_underrb_define_alloc_funcrb_define_aliasrb_internrb_define_methodrb_define_singleton_methodlibruby.so.3.2libm.so.6libpthread.so.0libc.so.6_edata__bss_start_endGLIBC_2.2.5GLIBC_2.14GLIBC_2.4/opt/alt/ruby32/lib64ui ii }  } ` }  } @} bP} #X} !        # * 4 7 @ A B D K  ( 0 8 @ H  P  X  `  h p x          Ȁ Ѐ ؀   ! " $ % & ' ( )( +0 ,8 -@ .H /P 0X 1` 2h 3p 5x 6 8 9 : ; < = > ? Cȁ DЁ E؁ F G H I JHHg HtH5h %h hhhhhhhhqhah Qh Ah 1h !h hhhhhhhhhhqhahQhAh1h!hhhh h!h"h#h$h%h&h'qh(ah)Qh*Ah+1h,!h-h.h/h0h1h2h3h4h5h6h7qh8ah9Qh:Ah;1h<!%=d D%5d D%-d D%%d D%d D%d D% d D%d D%c D%c D%c D%c D%c D%c D%c D%c D%c D%c D%c D%c D%c D%c D%c D%c D%}c D%uc D%mc D%ec D%]c D%Uc D%Mc D%Ec D%=c D%5c D%-c D%%c D%c D%c D% c D%c D%b D%b D%b D%b D%b D%b D%b D%b D%b D%b D%b D%b D%b D%b D%b D%b D%}b D%ub D%mb D%eb D%]b DHHHHf.fH= b Hb H9tH~_ Ht H=a H5a H)HHH?HHtH_ HtfD=a u+UH=z_ Ht H=\ dma ]wH7Hthv$HtNHu8R1€?v2fHuB|HHu H[]DHuHHD$HD$H[]ff.ATIUSH9$HH5"O HH5O HHHoEoHMoP U oX0]0o`@e@ohPmPop`u`oxp}pHHHsH;^HsH{HEMHs(H{ HEH% LkHt LkMt$LLLeHHE@H[]A\A]ÐH=$fAUATUSHH5A HuHtHHHƒHtH:f.Lc% H}Mu.HtHEHEH[]A\A]@Ht VH% LkHt LkMt,LL1LeHEH[]A\A]fH=.#fAUATUSHH5,@ HuHtHHHƒHtHJf.Lc% H} Mu.HtHE HE(H[]A\A]@Ht fH% LkHt LkMt,LLALe(HE H[]A\A]fH=>"fAUATUSHH5fDHMfIn\uLD$$E1ft$"E1ɉD$ Mf.J|5<hP4H5#HcH>AL=LL)LLHMNMM9wLL)tJt HHfHHCHS"HCHD$(dH3%(EH8[]A\A]A^A_LAL=L)kJt HL$WL$JfDAL=&fDAL=fDAL=fDfH500ffL$$AL|$"D$'T$&InH Mf#f.1AIHHHAIHHAIHHHAIHHAIHIcH w!H+H&H(H=HBH_EH/H\H"HH$HCHKH$HCfL9AH ,!IfALH9H=4H5H1D1f1f1f1fAIHM~MInfH5HL9,HD$HD$HD$ @H5(HH5H|H5H\H5HHHL,$H5`: 7H.HHHLgfHI7 HHI7 HHLH"DHHLLGfH5LHUrHuqHLyH5LXHy6 HeHy6 HUH5LLH599 11HuHuTHHupHL@H96 HfHLHHuHUrHuqHL}AWAVAUIHATUHSHXHB@LzHT$HD$8HBHHt$ HD$@HHRhHD$HAPHxH@H|$HHyxHD$HwH|$0Ht$(HqxHt H9HHEHU[HEH|$8t H|$@}D$01D`QDHH9}RH|$tH|$HLHYHT$Ht$ HHIE uIEH9|HD$HT$0H|$8HPxtOH|$@Ll$Mt9HD$0H~/A1 DA9tMtLLH"A9uHHEHU]HEHX[]A\A]A^A_H|$(,E1AE9MtHt$LH@HT$Ht$HHHT$@Ht$8HLl$M#WHT$@Ht$8HblHEHD$H=Q6 H5`HPxHT$HHPx1f.AUATUSHxfIuYH=-6 HH50 HHFHILLHHH'HH[]A\A]EDH6t1\ff.ATIUSHHH50 HHLHH[H]A\fUSHHHH5/ HHH[]fAT1UHH5 5 SH1x=Iu/AuMt I$Ht*LDHutͺ1qH=4 [L]HA\DAWIAVAUATUSHHHLrHBHt$ H*Iv`I~XHD$IIN0M^8MfHWMnxHD$HFHD$(HFHD$C~ HHt MH|$tKM~FEH\$0E1LEAE9tHtHt$HHAE9uH\$0AuMuAMI~IARA Ha0 Hv@H Y0 IWH;H 0 H9tjH5I3 L11IAuMu_LfLHHDH!0 HH / H9tH 30 H9uLHI뗐IHuHt$LLHH|$u1HL$ Ht$LHCHH1[]A\A]A^A_HT$Ht$(Hf@HwHL\$8HL$0JL\$8HL$0Ha/ H+fH/ HH/ HH. H ;/ HH9fAVAUIATIH5Y, USH dH%(HD$1H ULHNHHHH=d1 HHlHH=91 dHHIHH=1 AHH&HH=0 HHHH=0 HHH4H=0 Ld$LHHEhdH510 IHD$,HH=/ LHHExH5/ IHD$HH=/ ULHH5/ IHD$HH=/ HHH=/ HEpHHH=;/ HEqHHHLErHL$dH3 %({H []A\A]A^LHHHEh@LH]HHEx@LH5HDHHHfH H LUHZDHHEh4@HHEx[@HsuHHуHuLpIv L`MLLuHE f.uHHуHuLpIv L`MLWLu(HE f.HHHуH5LpIv L`MWLLuHHE@fHHуHLpIv tXL`M+LLu8HE0fDL`L`(L`pL`f.HHуH]LpIv t L`Mt'L/LuHErfL`f.H=. Ht$Ht$H= Ht$Ht$&DH= Ht$Ht$VDH= Ht$Ht$DH= Ht$oHt$ATIUHH5& SHaH@hdHǀxuL[]A\Hut1HtLL[]A\HH=W 2H=H5K HH+ H59 HH=H+ ~H=! HP+ kH=D+ H5+ XH=)+ LH' H=F+ H5> HH5HH+ H=+ H&H5ZH=* HH5H=* HH5H=* 1HH5H=* HH5pH=z* 1HH5\H=^* HbH5CH=?* 1HH5.jH=#* H7H5KH=* 1HH5/H=) HLH5H=) 1HH5H=) HH5H=) 1HH5H=r) HH5H=S) 1HH5~H=7) 1HH5bH=) H?H5~CH=( 1HH5p'H=( 1HH5d H=( 1H[H5SH=( 1HH5CH=( HH5*H=m( 1HH5H=Q( HH5 yH=2( HH5ZH=( HH50H=' 1HH5t$H=' HaH5MH=' HH5H=' HhH5H=' HH5nH=n' H5dH5iHHA' tHH5NHiH=' H5FH*H5 H;H=& H5HH5H H=& H5H~H5HH=& H5HH5HH=b& H5HH5HH1& H=%& HH5?]H=& HH5L>H=% 1HH5<"H=% H5<HH5+HH% H=% H5H>H5HH=p% H5HH5vHH=B% H5nHH5HHcH=gH=-H$ TH=H$ AH=H$ .H=H$ H=Hm$ H=HR$ H=H7$ H=H$ ϾH=H$ 輾H=H# 詾H=H# 薾H=H# 胾H=He# pH=HJ# ]H=Hw# JH=H\# 7H=HA# $H=H&# H=H # H={H=xH" ߽H=qH" ̽H=dH=]H鰽HHC*@0123456789abcdefunallocated JSON::Statenesting of %ld is too deepnullfalsetrueinstance_variables%li not allowed in JSONRSTRING_PTR\n\r\t\f\b\\\"\/JSON::GeneratorErrorto_hashHashto_hjson/commonExtGeneratorJSON::NestingErrorfrom_stateinitializeinitialize_copyindentindent=spacespace=space_beforespace_before=object_nlobject_nl=array_nlarray_nl=max_nestingmax_nesting=escape_slashescape_slash?escape_slash=check_circular?allow_nan?ascii_only?depthdepth=buffer_initial_lengthbuffer_initial_length=configuremerge[][]=generateGeneratorMethodsObjectto_jsonArrayIntegerFloatStringincludedto_json_rawto_json_raw_objectExtendjson_createTrueClassFalseClassNilClassto_snewallow_nanascii_onlyunpackcreate_idextendkey?__send__respond_to?matchkeysdupJSON/Generator/Statepartial character in source, but hit endsource sequence is illegal/malformed utf-8source sequence is illegal/malformed utf85pP01234567890    ;TIphXyPxXHx 8ؽPl8h8ȿ LHtxX<xPdHx0\Hx(4XX l8x d ( H x D 4 8 P X  (D Xl XdzRx $@FJ w?:*3$"D\p%HW "HT8&HWP&HWh'HX&E`&HW0"HTHĺAUdȺEv,/Am,@BDD V ABE (>FDO WAAF$;AAG lDA ̻TH F A 0<FAD D0  DABA @pFIB A(A0JP 0A(A BBBD 0xFEA J0t  AABB  6H] K D0<9H] K DP\9H] K Dp|9H] K D9H\ L D(EDM0q AAG (@1BGD `AB8TBHA  ABH M ABH DK XKK0 AD 0|EADG0T AAF ZAA,XFDA 1 ABA LBBB B(D0D8G# 8A0A(B BBBD 80<FBA A(D0O (D ABBJ ltEL O tEL O PtEL O +EezRx  )EcPH3Emʱ$xSEDI rIA EG  AA HhFBB B(D0A8D` 8A0A(B BBBA (BDA lDB$ .EAG [DA( FCK iDELD HFEB B(A0A8G 8C0A(B BBBH @ FBE K(A0DP' 0A(A BBBD zRx P(C4 mFDK g ABA iABH $HsGNU ` } b#!  _} } o`     ooo4o}  0@P`p 0@P`p 0@P`p 0@P`pGA$3a1_ GA$3p1113_GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA! GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*GOW*GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realign GA*FORTIFY _GA+GLIBCXX_ASSERTIONSgenerator.so-3.2.11-13.el8.x86_64.debug>-7zXZִF!t/K]?Eh=ڊ2NH wE!TTU]{PtD~Ƞ<荵~OMG5i胖zcƄ봯?33D@wC fR$i͒ma+7ΧݰH*?4՚|fZ;j,@هErQ#tA2Of&SW^ UYT ,Ρ:iw%3EM0uIU: jzX"!<ݶOi7hVnf]gدEIszu3$$igmׇ6iYLPa4w#M#O=w>/v$|l.i)[ǩGaȅ9w/K*_kC ,BɸgVB%[Qes= Xk x|(׀fu<|M"k╧8"%d@ҽa,G;_n(Y(20Dl}"ւvliIUޚ~U)gtI# ;4O{Qcχ޺\ RURJ<%ӯc1-$R]\H;Yrx7Kqۮ- >fӠ125Gpr0/+e$aqUGx||iռG0MUWvݎU)E9-Wy?05ˋRtJ^HF-q^ l2}9zAc׶3&PiԇG{~,,ТaC "m GXTey2rEu rWV+7%bj'@jJK6+~`2K0L)3m,1wnطc*ߎZ#zU-I6|;Hx-%W5)hZzdԠ@d9T<lKId'Љ6pI*c+7= 6s饤rp=:1*!Vo.#UrA.e4]`gPOAӑ(IUl;dJ@(ľp37~t$$ٯ"jw]B.>G廉u sR:hvj`.e-z>p֜_ r,w(Obde+ 5SgYZ.shstrtab.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.note.gnu.property.init_array.fini_array.data.rel.ro.dynamic.got.got.plt.bss.gnu.build.attributes.gnu_debuglink.gnu_debugdata 88$o``4( 0  8o44Eo@T^Bhcnw?}__ __ 8e8eTggd ss } }} } } }h } } x  `H H,t+PK![Wbuild_error.rbnu[# frozen_string_literal: true ## # Raised when there is an error while building extensions. require_relative "../exceptions" class Gem::Ext::BuildError < Gem::InstallError end PK!ԅVcmake_builder.rbnu[# frozen_string_literal: true class Gem::Ext::CmakeBuilder < Gem::Ext::Builder def self.build(extension, dest_path, results, args=[], lib_dir=nil, cmake_dir=Dir.pwd) unless File.exist?(File.join(cmake_dir, "Makefile")) require_relative "../command" cmd = ["cmake", ".", "-DCMAKE_INSTALL_PREFIX=#{dest_path}", *Gem::Command.build_args] run cmd, results, class_name, cmake_dir end make dest_path, results, cmake_dir results end end PK!dH)H)cargo_builder.rbnu[# frozen_string_literal: true require_relative "../shellwords" # This class is used by rubygems to build Rust extensions. It is a thin-wrapper # over the `cargo rustc` command which takes care of building Rust code in a way # that Ruby can use. class Gem::Ext::CargoBuilder < Gem::Ext::Builder attr_accessor :spec, :runner, :profile def initialize require_relative "../command" require_relative "cargo_builder/link_flag_converter" @runner = self.class.method(:run) @profile = :release end def build(extension, dest_path, results, args = [], lib_dir = nil, cargo_dir = Dir.pwd) require "tempfile" require "fileutils" # Where's the Cargo.toml of the crate we're building cargo_toml = File.join(cargo_dir, "Cargo.toml") # What's the crate's name crate_name = cargo_crate_name(cargo_dir, cargo_toml, results) begin # Create a tmp dir to do the build in tmp_dest = Dir.mktmpdir(".gem.", cargo_dir) # Run the build cmd = cargo_command(cargo_toml, tmp_dest, args, crate_name) runner.call(cmd, results, "cargo", cargo_dir, build_env) # Where do we expect Cargo to write the compiled library dylib_path = cargo_dylib_path(tmp_dest, crate_name) # Helpful error if we didn't find the compiled library raise DylibNotFoundError, tmp_dest unless File.exist?(dylib_path) # Cargo and Ruby differ on how the library should be named, rename from # what Cargo outputs to what Ruby expects dlext_name = "#{crate_name}.#{makefile_config("DLEXT")}" dlext_path = File.join(File.dirname(dylib_path), dlext_name) FileUtils.cp(dylib_path, dlext_path) nesting = extension_nesting(extension) # TODO: remove in RubyGems 4 if Gem.install_extension_in_lib && lib_dir nested_lib_dir = File.join(lib_dir, nesting) FileUtils.mkdir_p nested_lib_dir FileUtils.cp_r dlext_path, nested_lib_dir, remove_destination: true end # move to final destination nested_dest_path = File.join(dest_path, nesting) FileUtils.mkdir_p nested_dest_path FileUtils.cp_r dlext_path, nested_dest_path, remove_destination: true ensure # clean up intermediary build artifacts FileUtils.rm_rf tmp_dest if tmp_dest end results end def build_env build_env = rb_config_env build_env["RUBY_STATIC"] = "true" if ruby_static? && ENV.key?("RUBY_STATIC") cfg = "--cfg=rb_sys_gem --cfg=rubygems --cfg=rubygems_#{Gem::VERSION.tr(".", "_")}" build_env["RUSTFLAGS"] = [ENV["RUSTFLAGS"], cfg].compact.join(" ") build_env end def cargo_command(cargo_toml, dest_path, args = [], crate_name = nil) cmd = [] cmd += [cargo, "rustc"] cmd += ["--crate-type", "cdylib"] cmd += ["--target", ENV["CARGO_BUILD_TARGET"]] if ENV["CARGO_BUILD_TARGET"] cmd += ["--target-dir", dest_path] cmd += ["--manifest-path", cargo_toml] cmd += ["--lib"] cmd += ["--profile", profile.to_s] cmd += ["--locked"] cmd += Gem::Command.build_args cmd += args cmd += ["--"] cmd += [*cargo_rustc_args(dest_path, crate_name)] cmd end private def cargo ENV.fetch("CARGO", "cargo") end # returns the directory nesting of the extension, ignoring the first part, so # "ext/foo/bar/Cargo.toml" becomes "foo/bar" def extension_nesting(extension) parts = extension.to_s.split(Regexp.union([File::SEPARATOR, File::ALT_SEPARATOR].compact)) parts = parts.each_with_object([]) do |segment, final| next if segment == "." if segment == ".." raise Gem::InstallError, "extension outside of gem root" if final.empty? next final.pop end final << segment end File.join(parts[1...-1]) end def rb_config_env result = {} RbConfig::CONFIG.each {|k, v| result["RBCONFIG_#{k}"] = v } result end def cargo_rustc_args(dest_dir, crate_name) [ *linker_args, *mkmf_libpath, *rustc_dynamic_linker_flags(dest_dir, crate_name), *rustc_lib_flags(dest_dir), *platform_specific_rustc_args(dest_dir), ] end def platform_specific_rustc_args(dest_dir, flags = []) if mingw_target? # On mingw platforms, mkmf adds libruby to the linker flags flags += libruby_args(dest_dir) # Make sure ALSR is used on mingw # see https://github.com/rust-lang/rust/pull/75406/files flags += ["-C", "link-arg=-Wl,--dynamicbase"] flags += ["-C", "link-arg=-Wl,--disable-auto-image-base"] # If the gem is installed on a host with build tools installed, but is # run on one that isn't the missing libraries will cause the extension # to fail on start. flags += ["-C", "link-arg=-static-libgcc"] elsif darwin_target? # Ventura does not always have this flag enabled flags += ["-C", "link-arg=-Wl,-undefined,dynamic_lookup"] end flags end # We want to use the same linker that Ruby uses, so that the linker flags from # mkmf work properly. def linker_args cc_flag = Shellwords.split(makefile_config("CC")) linker = cc_flag.shift link_args = cc_flag.flat_map {|a| ["-C", "link-arg=#{a}"] } return mswin_link_args if linker == "cl" ["-C", "linker=#{linker}", *link_args] end def mswin_link_args args = [] args += ["-l", makefile_config("LIBRUBYARG_SHARED").chomp(".lib")] args += split_flags("LIBS").flat_map {|lib| ["-l", lib.chomp(".lib")] } args += split_flags("LOCAL_LIBS").flat_map {|lib| ["-l", lib.chomp(".lib")] } args end def libruby_args(dest_dir) libs = makefile_config(ruby_static? ? "LIBRUBYARG_STATIC" : "LIBRUBYARG_SHARED") raw_libs = Shellwords.split(libs) raw_libs.flat_map {|l| ldflag_to_link_modifier(l) } end def ruby_static? return true if %w[1 true].include?(ENV["RUBY_STATIC"]) makefile_config("ENABLE_SHARED") == "no" end def cargo_dylib_path(dest_path, crate_name) prefix = so_ext == "dll" ? "" : "lib" path_parts = [dest_path] path_parts << ENV["CARGO_BUILD_TARGET"] if ENV["CARGO_BUILD_TARGET"] path_parts += ["release", "#{prefix}#{crate_name}.#{so_ext}"] File.join(*path_parts) end def cargo_crate_name(cargo_dir, manifest_path, results) require "open3" Gem.load_yaml output, status = begin Open3.capture2e(cargo, "metadata", "--no-deps", "--format-version", "1", :chdir => cargo_dir) rescue => error raise Gem::InstallError, "cargo metadata failed #{error.message}" end unless status.success? if Gem.configuration.really_verbose puts output else results << output end exit_reason = if status.exited? ", exit code #{status.exitstatus}" elsif status.signaled? ", uncaught signal #{status.termsig}" end raise Gem::InstallError, "cargo metadata failed#{exit_reason}" end # cargo metadata output is specified as json, but with the # --format-version 1 option the output is compatible with YAML, so we can # avoid the json dependency metadata = Gem::SafeYAML.safe_load(output) package = metadata["packages"].find {|pkg| normalize_path(pkg["manifest_path"]) == manifest_path } unless package found = metadata["packages"].map {|md| "#{md["name"]} at #{md["manifest_path"]}" } raise Gem::InstallError, <<-EOF failed to determine cargo package name looking for: #{manifest_path} found: #{found.join("\n")} EOF end package["name"].tr("-", "_") end def normalize_path(path) return path unless File::ALT_SEPARATOR path.tr(File::ALT_SEPARATOR, File::SEPARATOR) end def rustc_dynamic_linker_flags(dest_dir, crate_name) split_flags("DLDFLAGS") .map {|arg| maybe_resolve_ldflag_variable(arg, dest_dir, crate_name) } .compact .flat_map {|arg| ldflag_to_link_modifier(arg) } end def rustc_lib_flags(dest_dir) split_flags("LIBS").flat_map {|arg| ldflag_to_link_modifier(arg) } end def split_flags(var) Shellwords.split(RbConfig::CONFIG.fetch(var, "")) end def ldflag_to_link_modifier(arg) LinkFlagConverter.convert(arg) end def msvc_target? makefile_config("target_os").include?("msvc") end def darwin_target? makefile_config("target_os").include?("darwin") end def mingw_target? makefile_config("target_os").include?("mingw") end def win_target? target_platform = RbConfig::CONFIG["target_os"] !!Gem::WIN_PATTERNS.find {|r| target_platform =~ r } end # Interpolate substitution vars in the arg (i.e. $(DEFFILE)) def maybe_resolve_ldflag_variable(input_arg, dest_dir, crate_name) var_matches = input_arg.match(/\$\((\w+)\)/) return input_arg unless var_matches var_name = var_matches[1] return input_arg if var_name.nil? || var_name.chomp.empty? case var_name # On windows, it is assumed that mkmf has setup an exports file for the # extension, so we have to to create one ourselves. when "DEFFILE" write_deffile(dest_dir, crate_name) else RbConfig::CONFIG[var_name] end end def write_deffile(dest_dir, crate_name) deffile_path = File.join(dest_dir, "#{crate_name}-#{RbConfig::CONFIG["arch"]}.def") export_prefix = makefile_config("EXPORT_PREFIX") || "" File.open(deffile_path, "w") do |f| f.puts "EXPORTS" f.puts "#{export_prefix.strip}Init_#{crate_name}" end deffile_path end # We have to basically reimplement RbConfig::CONFIG['SOEXT'] here to support # Ruby < 2.5 # # @see https://github.com/ruby/ruby/blob/c87c027f18c005460746a74c07cd80ee355b16e4/configure.ac#L3185 def so_ext return RbConfig::CONFIG["SOEXT"] if RbConfig::CONFIG.key?("SOEXT") if win_target? "dll" elsif darwin_target? "dylib" else "so" end end # Corresponds to $(LIBPATH) in mkmf def mkmf_libpath ["-L", "native=#{makefile_config("libdir")}"] end def makefile_config(var_name) val = RbConfig::MAKEFILE_CONFIG[var_name] return unless val RbConfig.expand(val.dup) end # Error raised when no cdylib artifact was created class DylibNotFoundError < StandardError def initialize(dir) files = Dir.glob(File.join(dir, "**", "*")).map {|f| "- #{f}" }.join "\n" super <<~MSG Dynamic library not found for Rust extension (in #{dir}) Make sure you set "crate-type" in Cargo.toml to "cdylib" Found files: #{files} MSG end end end PK! ærake_builder.rbnu[# frozen_string_literal: true require_relative "../shellwords" #-- # Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others. # All rights reserved. # See LICENSE.txt for permissions. #++ class Gem::Ext::RakeBuilder < Gem::Ext::Builder def self.build(extension, dest_path, results, args=[], lib_dir=nil, extension_dir=Dir.pwd) if File.basename(extension) =~ /mkrf_conf/i run([Gem.ruby, File.basename(extension), *args], results, class_name, extension_dir) end rake = ENV["rake"] if rake rake = Shellwords.split(rake) else begin rake = ruby << "-rrubygems" << Gem.bin_path("rake", "rake") rescue Gem::Exception rake = [Gem.default_exec_format % "rake"] end end rake_args = ["RUBYARCHDIR=#{dest_path}", "RUBYLIBDIR=#{dest_path}", *args] run(rake + rake_args, results, class_name, extension_dir) results end end PK!>$cargo_builder/link_flag_converter.rbnu[# frozen_string_literal: true class Gem::Ext::CargoBuilder < Gem::Ext::Builder # Converts Ruby link flags into something cargo understands class LinkFlagConverter FILTERED_PATTERNS = [ /compress-debug-sections/, # Not supported by all linkers, and not required for Rust ].freeze def self.convert(arg) return [] if FILTERED_PATTERNS.any? {|p| p.match?(arg) } case arg.chomp when /^-L\s*(.+)$/ ["-L", "native=#{$1}"] when /^--library=(\w+\S+)$/, /^-l\s*(\w+\S+)$/ ["-l", $1] when /^-l\s*([^:\s])+/ # -lfoo, but not -l:libfoo.a ["-l", $1] when /^-F\s*(.*)$/ ["-l", "framework=#{$1}"] else ["-C", "link-args=#{arg}"] end end end end PK!A,ZZ builder.rbnu[# frozen_string_literal: true #-- # Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others. # All rights reserved. # See LICENSE.txt for permissions. #++ require_relative "../user_interaction" require_relative "../shellwords" class Gem::Ext::Builder include Gem::UserInteraction attr_accessor :build_args # :nodoc: def self.class_name name =~ /Ext::(.*)Builder/ $1.downcase end def self.make(dest_path, results, make_dir = Dir.pwd, sitedir = nil, targets = ["clean", "", "install"]) unless File.exist? File.join(make_dir, "Makefile") raise Gem::InstallError, "Makefile not found" end # try to find make program from Ruby configure arguments first RbConfig::CONFIG["configure_args"] =~ /with-make-prog\=(\w+)/ make_program_name = ENV["MAKE"] || ENV["make"] || $1 unless make_program_name make_program_name = (RUBY_PLATFORM.include?("mswin")) ? "nmake" : "make" end make_program = Shellwords.split(make_program_name) # The installation of the bundled gems is failed when DESTDIR is empty in mswin platform. destdir = (/\bnmake/i !~ make_program_name || ENV["DESTDIR"] && ENV["DESTDIR"] != "") ? "DESTDIR=%s" % ENV["DESTDIR"] : "" env = [destdir] if sitedir env << "sitearchdir=%s" % sitedir env << "sitelibdir=%s" % sitedir end targets.each do |target| # Pass DESTDIR via command line to override what's in MAKEFLAGS cmd = [ *make_program, *env, target, ].reject(&:empty?) begin run(cmd, results, "make #{target}".rstrip, make_dir) rescue Gem::InstallError raise unless target == "clean" # ignore clean failure end end end def self.ruby # Gem.ruby is quoted if it contains whitespace cmd = Shellwords.split(Gem.ruby) # This load_path is only needed when running rubygems test without a proper installation. # Prepending it in a normal installation will cause problem with order of $LOAD_PATH. # Therefore only add load_path if it is not present in the default $LOAD_PATH. load_path = File.expand_path("../..", __dir__) case load_path when RbConfig::CONFIG["sitelibdir"], RbConfig::CONFIG["vendorlibdir"], RbConfig::CONFIG["rubylibdir"] cmd else cmd << "-I#{load_path}" end end def self.run(command, results, command_name = nil, dir = Dir.pwd, env = {}) verbose = Gem.configuration.really_verbose begin rubygems_gemdeps, ENV["RUBYGEMS_GEMDEPS"] = ENV["RUBYGEMS_GEMDEPS"], nil if verbose puts("current directory: #{dir}") p(command) end results << "current directory: #{dir}" results << Shellwords.join(command) require "open3" # Set $SOURCE_DATE_EPOCH for the subprocess. build_env = { "SOURCE_DATE_EPOCH" => Gem.source_date_epoch_string }.merge(env) output, status = begin Open3.capture2e(build_env, *command, :chdir => dir) rescue => error raise Gem::InstallError, "#{command_name || class_name} failed#{error.message}" end if verbose puts output else results << output end ensure ENV["RUBYGEMS_GEMDEPS"] = rubygems_gemdeps end unless status.success? results << "Building has failed. See above output for more information on the failure." if verbose end yield(status, results) if block_given? unless status.success? exit_reason = if status.exited? ", exit code #{status.exitstatus}" elsif status.signaled? ", uncaught signal #{status.termsig}" end raise Gem::InstallError, "#{command_name || class_name} failed#{exit_reason}" end end ## # Creates a new extension builder for +spec+. If the +spec+ does not yet # have build arguments, saved, set +build_args+ which is an ARGV-style # array. def initialize(spec, build_args = spec.build_args) @spec = spec @build_args = build_args @gem_dir = spec.full_gem_path @ran_rake = false end ## # Chooses the extension builder class for +extension+ def builder_for(extension) # :nodoc: case extension when /extconf/ then Gem::Ext::ExtConfBuilder when /configure/ then Gem::Ext::ConfigureBuilder when /rakefile/i, /mkrf_conf/i then @ran_rake = true Gem::Ext::RakeBuilder when /CMakeLists.txt/ then Gem::Ext::CmakeBuilder when /Cargo.toml/ then Gem::Ext::CargoBuilder.new else build_error("No builder for extension '#{extension}'") end end ## # Logs the build +output+, then raises Gem::Ext::BuildError. def build_error(output, backtrace = nil) # :nodoc: gem_make_out = write_gem_make_out output message = <<-EOF ERROR: Failed to build gem native extension. #{output} Gem files will remain installed in #{@gem_dir} for inspection. Results logged to #{gem_make_out} EOF raise Gem::Ext::BuildError, message, backtrace end def build_extension(extension, dest_path) # :nodoc: results = [] builder = builder_for(extension) extension_dir = File.expand_path File.join(@gem_dir, File.dirname(extension)) lib_dir = File.join @spec.full_gem_path, @spec.raw_require_paths.first begin FileUtils.mkdir_p dest_path results = builder.build(extension, dest_path, results, @build_args, lib_dir, extension_dir) verbose { results.join("\n") } write_gem_make_out results.join "\n" rescue => e results << e.message build_error(results.join("\n"), $@) end end ## # Builds extensions. Valid types of extensions are extconf.rb files, # configure scripts and rakefiles or mkrf_conf files. def build_extensions return if @spec.extensions.empty? if @build_args.empty? say "Building native extensions. This could take a while..." else say "Building native extensions with: '#{@build_args.join ' '}'" say "This could take a while..." end dest_path = @spec.extension_dir require "fileutils" FileUtils.rm_f @spec.gem_build_complete_path @spec.extensions.each do |extension| break if @ran_rake build_extension extension, dest_path end FileUtils.touch @spec.gem_build_complete_path end ## # Writes +output+ to gem_make.out in the extension install directory. def write_gem_make_out(output) # :nodoc: destination = File.join @spec.extension_dir, "gem_make.out" FileUtils.mkdir_p @spec.extension_dir File.open destination, "wb" do |io| io.puts output end destination end end PK! KM77configure_builder.rbnu[# frozen_string_literal: true #-- # Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others. # All rights reserved. # See LICENSE.txt for permissions. #++ class Gem::Ext::ConfigureBuilder < Gem::Ext::Builder def self.build(extension, dest_path, results, args=[], lib_dir=nil, configure_dir=Dir.pwd) unless File.exist?(File.join(configure_dir, "Makefile")) cmd = ["sh", "./configure", "--prefix=#{dest_path}", *args] run cmd, results, class_name, configure_dir end make dest_path, results, configure_dir results end end PK!H8֩ext_conf_builder.rbnu[# frozen_string_literal: true #-- # Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others. # All rights reserved. # See LICENSE.txt for permissions. #++ class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder def self.build(extension, dest_path, results, args=[], lib_dir=nil, extension_dir=Dir.pwd) require "fileutils" require "tempfile" tmp_dest = Dir.mktmpdir(".gem.", extension_dir) # Some versions of `mktmpdir` return absolute paths, which will break make # if the paths contain spaces. # # As such, we convert to a relative path. tmp_dest_relative = get_relative_path(tmp_dest.clone, extension_dir) destdir = ENV["DESTDIR"] begin cmd = ruby << File.basename(extension) cmd.push(*args) run(cmd, results, class_name, extension_dir) do |s, r| mkmf_log = File.join(extension_dir, "mkmf.log") if File.exist? mkmf_log unless s.success? r << "To see why this extension failed to compile, please check" \ " the mkmf.log which can be found here:\n" r << " " + File.join(dest_path, "mkmf.log") + "\n" end FileUtils.mv mkmf_log, dest_path end end ENV["DESTDIR"] = nil make dest_path, results, extension_dir, tmp_dest_relative full_tmp_dest = File.join(extension_dir, tmp_dest_relative) # TODO remove in RubyGems 4 if Gem.install_extension_in_lib && lib_dir FileUtils.mkdir_p lib_dir entries = Dir.entries(full_tmp_dest) - %w[. ..] entries = entries.map {|entry| File.join full_tmp_dest, entry } FileUtils.cp_r entries, lib_dir, :remove_destination => true end FileUtils::Entry_.new(full_tmp_dest).traverse do |ent| destent = ent.class.new(dest_path, ent.rel) destent.exist? || FileUtils.mv(ent.path, destent.path) end make dest_path, results, extension_dir, tmp_dest_relative, ["clean"] ensure ENV["DESTDIR"] = destdir end results ensure FileUtils.rm_rf tmp_dest if tmp_dest end private def self.get_relative_path(path, base) path[0..base.length - 1] = "." if path.start_with?(base) path end end PK!yOurr string.rbnu[# frozen_string_literal: true require "rake/ext/core" class String rake_extension("ext") do # Replace the file extension with +newext+. If there is no extension on # the string, append the new extension to the end. If the new extension # is not given, or is the empty string, remove any existing extension. # # +ext+ is a user added method for the String class. # # This String extension comes from Rake def ext(newext="") return self.dup if [".", ".."].include? self if newext != "" newext = "." + newext unless newext =~ /^\./ end self.chomp(File.extname(self)) << newext end end rake_extension("pathmap") do # Explode a path into individual components. Used by +pathmap+. # # This String extension comes from Rake def pathmap_explode head, tail = File.split(self) return [self] if head == self return [tail] if head == "." || tail == "/" return [head, tail] if head == "/" return head.pathmap_explode + [tail] end protected :pathmap_explode # Extract a partial path from the path. Include +n+ directories from the # front end (left hand side) if +n+ is positive. Include |+n+| # directories from the back end (right hand side) if +n+ is negative. # # This String extension comes from Rake def pathmap_partial(n) dirs = File.dirname(self).pathmap_explode partial_dirs = if n > 0 dirs[0...n] elsif n < 0 dirs.reverse[0...-n].reverse else "." end File.join(partial_dirs) end protected :pathmap_partial # Perform the pathmap replacement operations on the given path. The # patterns take the form 'pat1,rep1;pat2,rep2...'. # # This String extension comes from Rake def pathmap_replace(patterns, &block) result = self patterns.split(";").each do |pair| pattern, replacement = pair.split(",") pattern = Regexp.new(pattern) if replacement == "*" && block_given? result = result.sub(pattern, &block) elsif replacement result = result.sub(pattern, replacement) else result = result.sub(pattern, "") end end result end protected :pathmap_replace # Map the path according to the given specification. The specification # controls the details of the mapping. The following special patterns are # recognized: # # %p :: The complete path. # %f :: The base file name of the path, with its file extension, # but without any directories. # %n :: The file name of the path without its file extension. # %d :: The directory list of the path. # %x :: The file extension of the path. An empty string if there # is no extension. # %X :: Everything *but* the file extension. # %s :: The alternate file separator if defined, otherwise use # # the standard file separator. # %% :: A percent sign. # # The %d specifier can also have a numeric prefix (e.g. '%2d'). # If the number is positive, only return (up to) +n+ directories in the # path, starting from the left hand side. If +n+ is negative, return (up # to) +n+ directories from the right hand side of the path. # # Examples: # # 'a/b/c/d/file.txt'.pathmap("%2d") => 'a/b' # 'a/b/c/d/file.txt'.pathmap("%-2d") => 'c/d' # # Also the %d, %p, %f, %n, # %x, and %X operators can take a pattern/replacement # argument to perform simple string substitutions on a particular part of # the path. The pattern and replacement are separated by a comma and are # enclosed by curly braces. The replacement spec comes after the % # character but before the operator letter. (e.g. "%{old,new}d"). # Multiple replacement specs should be separated by semi-colons (e.g. # "%{old,new;src,bin}d"). # # Regular expressions may be used for the pattern, and back refs may be # used in the replacement text. Curly braces, commas and semi-colons are # excluded from both the pattern and replacement text (let's keep parsing # reasonable). # # For example: # # "src/org/onestepback/proj/A.java".pathmap("%{^src,class}X.class") # # returns: # # "class/org/onestepback/proj/A.class" # # If the replacement text is '*', then a block may be provided to perform # some arbitrary calculation for the replacement. # # For example: # # "/path/to/file.TXT".pathmap("%X%{.*,*}x") { |ext| # ext.downcase # } # # Returns: # # "/path/to/file.txt" # # This String extension comes from Rake def pathmap(spec=nil, &block) return self if spec.nil? result = "".dup spec.scan(/%\{[^}]*\}-?\d*[sdpfnxX%]|%-?\d+d|%.|[^%]+/) do |frag| case frag when "%f" result << File.basename(self) when "%n" result << File.basename(self).ext when "%d" result << File.dirname(self) when "%x" result << File.extname(self) when "%X" result << self.ext when "%p" result << self when "%s" result << (File::ALT_SEPARATOR || File::SEPARATOR) when "%-" # do nothing when "%%" result << "%" when /%(-?\d+)d/ result << pathmap_partial($1.to_i) when /^%\{([^}]*)\}(\d*[dpfnxX])/ patterns, operator = $1, $2 result << pathmap("%" + operator).pathmap_replace(patterns, &block) when /^%/ fail ArgumentError, "Unknown pathmap specifier #{frag} in '#{spec}'" else result << frag end end result end end end PK!ucore.rbnu[# frozen_string_literal: true class Module # Check for an existing method in the current class before extending. If # the method already exists, then a warning is printed and the extension is # not added. Otherwise the block is yielded and any definitions in the # block will take effect. # # Usage: # # class String # rake_extension("xyz") do # def xyz # ... # end # end # end # def rake_extension(method) # :nodoc: if method_defined?(method) $stderr.puts "WARNING: Possible conflict with Rake extension: " + "#{self}##{method} already exists" else yield end end end PK!WJqq parser.sonuȯPK!ϕpp Aqgenerator.sonuȯPK![Wbuild_error.rbnu[PK!ԅVcmake_builder.rbnu[PK!dH)H)cargo_builder.rbnu[PK! æ~1rake_builder.rbnu[PK!>$N5cargo_builder/link_flag_converter.rbnu[PK!A,ZZ 8builder.rbnu[PK! KM77"Sconfigure_builder.rbnu[PK!H8֩Uext_conf_builder.rbnu[PK!yOurr ^string.rbnu[PK!u4vcore.rbnu[PK y