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!ę:type-resolver/752161aedc0d6ed781ada8f3aa9db4973e187d1f.zipnuIwPK ^1Q# phpDocumentor-TypeResolver-6a467b8/UTc_PK ^1Q|8* phpDocumentor-TypeResolver-6a467b8/LICENSEUTc_]RKo0Wzj%qo8q͑KpF;CV] { i w{ Kmr>}??AZxmFUv:dwop1.d-=}3lC3N.6nthag&}4|ăηco>6q0tj%sɆ80pc;;^h|: }y7'9ޝ#&%m&㛟 a`PSCOx[Q̥ǯN\`4"g:+6R~~9 ?3Xjv^}DW tUo7;{[QD!]3O36%VKZEf";^c|FZK^n,J,\ 2י,as‡,#Q@7()j+NW̥&l)MIKCŵ:T->CRK,yDV́xsb|5TU[-WV*&E.Th*͹,x<E3jJP8~$*0A|nd-ZִVEh8f+V _.-k9by/{dPK ^1Qܵ\' #, phpDocumentor-TypeResolver-6a467b8/README.mdUTc_YoFŦAR`K$NꋁyiP؁"WW%zKC.pE({曙DN7g_YY.d˴S7f2\M}_<7Z*{SDOrM@0̪812[&(륲ʙZثZkCVI(:t~d@& kn(]HzAA #Jbs/񦊧J]+ %Suv>zr*rJε+O:m[[''7d~~yJ9umHWI@)*3 !NB?&rbF"UTN\5*0u,Y\$*)]4J!sgDfV4k,%XJ[e!J(pʹJ˷txxhE*k*Qi6_5)Q "T<3WnO)JegҳIřg":ڛz@<%O_CKbR J/s$AX23ۋ  6+IƹHDli:7@,!8ۚk reD+lCQz&ҩ*53WQMrN0~ tOcz\Y>XbpBX,gmE(;5Q=C-0gD=Y ѹQr+L`}ScEofԽь8_D S*zF$ds_fJt Bq=o,*p/_qFJ3/7t YUw8J/:A)$.N\#ˣwoO^=b]w$05-zW҆ɹJʇ;&`q}_?źd6'<3~ڮ0sahc?4ڇLl7+c\84 JV旿0~ɏk ȸ2UNc~n̼j<[G3y\ ǜmqf<_@T Uƪ>~ "^i[Oy47Y!]<&t1uSi{Alލ7u' z:#bt+@n1\(Yx'҈EOVZxp8Tg۱>,es@ v[qS:cmnh*I٧ƔV8 u: rT[Ac}?U[+NaeEfݡ!/~{ɓ'x"j?Ovph֎̄^V\']lt$~HGpZ-: rr:mռ%9g=R{ n;FQ>mM}WjƋK^|!gg6G"_#q{WPBK;e=`*u:D?,jT HMEwNȂFƦ!Mϟs1C_üNM1cN3Ft{>)j]<=JJ qKѢk[:ފFaA D< Q`B[h\1$)-۰@v{Qt0d0gcx˹*/ppo:&P}j)1?7a妪?٘ieYQ. } l84\g&K~n $ NL;(dA]HPN׳k2{$v^ M? LZ58no 2/͜/_W;?cvV[U*W3HKIcA_YBvts&E'UdM:լdotc"~FJWJoij[p-5wtwfAߵx!(w zg'VɂI&x\hk3VVīz uѰycZm_LӥQG(Z iyӚy\C몽m elT1SL?!:m.ִ$o/1Qmo7&/D:o6(_n’8ԼU,v7r PK ^1QqMa0 phpDocumentor-TypeResolver-6a467b8/composer.jsonUTc_RO0Wh((ht 2|阯 lP \cdkZX3o6+͜яdoEi=g=7ucE* OQ\až:vy'K/l~݄ aZYj`#7?Ʌ|-C9و4/ fۉhzӼzy6vB:|7hdr"XI֒3d[wY7⿭w͒}8]Ͷox KU J;>y3U2+agx|ug/a/M44{B>-όbdfH{J>Qx՗Z6,q+S0291#.֬ݥč@:9徵8lmejlHBZmYK\_<ɺ@/HƎYbAtGY4gٍr 1B9R6a&$rOInnpAp=N_ŨGfɟdUӆ*Jduu&-a3ɨ7VlPK ^1Q' phpDocumentor-TypeResolver-6a467b8/src/UTc_PK ^1QG6xj8 phpDocumentor-TypeResolver-6a467b8/src/FqsenResolver.phpUTc_Uo0~_qHN] }Lt IӪ!AW@9?#q&n)3231lJC돸3HhmD\x}{!3×<$&!ČS">qԤy|B)q@L4xJ/P]ͫ~HQR[_?{p՗ɔ FUbS-ݳ%X\v_@3-x"7^ݫ\pQ[ykѢS*',חR})@Ajҙ! Իhꄁc!cvCLLLc'Ȋ0`y9m^h612 z’Ex{i$9<4sjQlQߪiz`7,Lbg cְ];~PK ^1Q3 phpDocumentor-TypeResolver-6a467b8/src/PseudoTypes/UTc_PK ^1Q"WAs= phpDocumentor-TypeResolver-6a467b8/src/PseudoTypes/False_.phpUTc_Rn1+iTqmA  ZqZiسY׶{RyMUIe-_Rwgp ]z2r,lcVO[ُi~&>rwEwB,ئ#PK ^1Q)xo< phpDocumentor-TypeResolver-6a467b8/src/PseudoTypes/True_.phpUTc_Rn0 +xs zm7mX EGdIe4Mm|a>>>7MJ8#ή玷 ɕR\ #;֏/#\`y3EǴnmt0]" 1] +aqC_6PK ^1Q28)4/ phpDocumentor-TypeResolver-6a467b8/src/Type.phpUTc_UPJC1+>bQ+Q(yɾ&4/ Rwq/;3s{MBr2,Stn+! uܣLa>U&҂sH@a,΁ HY>3C$ :ap/ݦR{d$Yfж %֒CI _kg Z{Zty/(GsYNS!98l 9*)$ABB1P([uYa,{ iJ5Ē\P_z,'& ;gsXBnϕPK ^1QrTPҭ7H7 phpDocumentor-TypeResolver-6a467b8/src/TypeResolver.phpUTc_kSV;ab;@g\bL ҵ"K^IơusCWҕ}zvi,y476<NIn:J<9xyfaép;qʢ1"w1a۰ WD1KAhiʜc0#qϜԏ.܁g>_ҾUҩ0G)O`IEr 3Ltzx:3ؗC撏"\űx؁{4|p؁oλ"IoQǁ$Wq8i> 4썖".S%me$i )GgGǽebŨq04|N S<oL{ }']^~e\6FӇG#'cIeoxq9X`45 ~o΋n FiZ(=`y=㬏ݲd։Ȇ.#7ZVm1VӷJ\bSEœ s{Sal(_5[=vD,$|E5Բ:CxhCc9jY Y)DnNqٰe"_v˃g0J[g0J3IZ=Sy>}s:[Ez!1H.<0RvNf9ZWWVֆw77촺yGo[NX^ >HǧR*EA1XQEdQ+C@WFHO8Il$vKBrZcpI/M3r$ p&-E*3$J9|߈Dq҅<N%|ԔUw2.WvYNv B<D[!%Xa/6hBn܋?_DXTXVoUMԥ| IT@@$XH(+z"}4WNO_Ybh@rH,c!n+Fv<zՂtr=|bdB3%V^Sr2KW%[ԿNxJ9'r߀GlVj3_2hql`?}J*hK%QO[bfٺNKoɶ1DtO$[eJ'|#6po}r_]pSjVhjq.ַ!-][ uTו/ZrCݬ F2ڴx J(KMB4ގc9=F5S8bu@9XSwڔ[8xtQ~h@ʤc$Ҵ0ix>pmp}EE}17sg@r'tH&&tF1J:ENnl8L|A4A4]$()(5O^uJhuC5)4S_E݇2T=bc|Bоld[n96v^rGs AsB 5V_a=#^15i~)Q-a> 5 zM?s]ضF#VaK0pTU4TK\AHF]"f:uQ%ʢIؽQ}/DŰ@ZLyj41\,OYe4 jihD' *6kDz71k+kxOnpڍz~J: 3Gy8E'g҃y)5^XcA/C)o鋺ETF;!&Z BΑG֫7 :V2_$zEWQ{+n4ȕ!$6b%t?PPQN5](3o' >Aj> >wT>̢|M.RHWi#jK|P2%5-o3:䧫ynbQ1cS_fzS%[.hۆ4u|] &P ٔNiDpr kB- #V{* ҩxN&a܍Av5,\i4DV@U"R}YUO~*$2 '4FUP8%jVŪ,UcjfT 6TM-Љ& بЩݨc`H<ޤQ6M &V,X=JD9۝obx4[~P 6Ѝ:sG cAX`7X?9T o 1ApLPV:FѴӁA@ࡔ1uLy1@B%)/|qBF;%}!z@Ys{Uk/ZT=I's4R䂠׎/ZZ&^֛~¶cGfAZBO vOyi:PئY2.]2mAe@U V>y/J2'$\j>-0 JC!dt,W@F{ f|uڇ l,<3)b tBXr:AJbBp9rk*+=AIV)PxL`q={ 3om4R!#т _ HD%HsC`Z$tD~ͧ4L'(eSC+e{D-0y-%\,{>,$= HkF/H_ΗNs\rcbƜ_NMLǒ[n$ y@ʐ_ǩ)5 jd(I*ƣpC >iR/A;ͶL OtX5&hy o|ԥe+gJr2Q^8K3q"Z݂֙U[NKoU(a땙a!iճ됪t4گ{U,ܪapeE9[:[jt*'R"uJNtA}*5VU-P𹯻wn7vͬ:@]>tz[ۛʺ14L&H T* ˡ!"݇]V* PK ^1Q`! ? phpDocumentor-TypeResolver-6a467b8/src/Types/AggregatedType.phpUTc_VnF+n/(Cm9v0E]b#R3C)FϙMQ4܈soߵe:R*dńVhK PYWsc?&[2]UQG-ץ%TɌMt-T͔ڊζw^ϻۏmyvP.rYi'm1S=J6Oimf>\eJq?OJhN.cf2IQi,}EřICe- t7浰O "E#rÏKZmE sNaUu:JĨ͠@\7"TwYIL˙NK i.Xs!?N¬%|P|Bt\3YGC]FTLugŪbfġ8s`I2oecϵX!C|`Bv36QUj7k:Hgf 8/7jYт< WwPPnbXG_=vۭЇC1-jlUҴMr{Pg,Pio=&]<)I'Dg'N7O gPW}-ЖM/NR^M:zC\ʂ"R4J 5wG ֗`5w\_ 1RpEɯP@Y!cvw~zv^e@,i,'λ\!&iGj@$8- ۋ2/GO'j idJcζՎ NUWb_IdW*ۜNrig-u4PR~od\G}ݽ82rjoXs0"0]jnN_lKb=ÒHV: U!-`LUqXSy<GUV;:~ICPۓ+DU{J~PK ^1Q]ַ7 phpDocumentor-TypeResolver-6a467b8/src/Types/Array_.phpUTc_UR_o0mUjH &`vɧ9 "U5=ڞ&aMvhr%&)0 ?nImN*x Jn;D7qkxdTLS.h"i{XHT mwnX+kC;ɇ)~mX/|x_PK ^1Q~Te|o`8 phpDocumentor-TypeResolver-6a467b8/src/Types/Boolean.phpUTc_QKK1W̭h>P (hT(dv76db;Zd. {yEhMomh`9| | *O9F>[ ʇh@: (tGIEww{ZQFI )Lakh kI>GLG5nDmYjV''LA2#UѵZN4f,mFx^ Cp=tP ILS&Yx)K#R.1CD1r6>Su?%Np>[ {ҼKf=w7MX?qnۇcHY;u|vR?ćPK ^1Q$&tm: phpDocumentor-TypeResolver-6a467b8/src/Types/Callable_.phpUTc_QKK1W̭ZW(jAl$l2MB2w_xr.YvgaBhTVFxL4 tZP>4X%^:GIƻ#%{3rQV{4HLMafB [CwK9*C\Z6Pk MDW3{7B89b q$Ѷi)֠3$^YN ?{PK ^1Q9:; phpDocumentor-TypeResolver-6a467b8/src/Types/Collection.phpUTc_Tn0+`@vRi-z bC*Iu[{ `Ǔ"/(D0]c5OhN{GQ4:8rn TQ%UzH0RlB@)4D!3r%Pdmq\_\.gsfa ܩSXsi1 Rkg'Onm1Hh EdK4 S&N+/G\))`$ZT(pgMB&"}?,?R Y%im͓0 s] \͸9Eu;%:n>㦁גb5@ATuFȾ[9XzǧV32 u_έ/es&R0cY$[9BcPl4>nmEdajk-gF{wzj0#, %xJ:-?<$J2݉WjZ婪 8;=Ot H;$uxr잎78yھmv.oF%0o_=Cpv(HI*mQ{Ή(H"uH/t.?mPK ^1Q ݲ49 phpDocumentor-TypeResolver-6a467b8/src/Types/Compound.phpUTc_Sn0 +x$u[ +;Hʒ ɼ^J4l@z||[_j"Ҽcn(E xh)BMA^WP?;whمR` iF] *93ͷ7Tǭbث%u۞=q+7%>hFN . 'OW˥.]h~YVuXIC@@PG[Fam@ŃD^'kc ^Š5)O8]@uSZ@ IDc )}4NB Lmg w<ʹmy9]%I*@RMSսp!7щT4Wв"+Rw٩ Wvm$vhdžQ-u]jk0W@i 8 phpDocumentor-TypeResolver-6a467b8/src/Types/Context.phpUTc_Vo6_q}M4]`)M,]w;R$Ŧ'y;*$EYC筒o*t7$9?=Mr SVz0?K m7Ƃ(@jc" t Й1T Z[)\s?}xG\xX btc kszCXDJbPz ɽ. hj?O-Jts;f_1+P2K@kTtXP[紾HHN?Y]9}h=ud K0RE,JT+tZ3=xXjfw`֔TJc.Sm&j(D,]U䤘LjGYK@a @f+sn"L"Y \XJːvcjBC.7TR)l !:*vUt@%w~50::ZK?lDc#lp= tvm:0sQ իW)f.`w fhg M!Cf5]'Au$[Q??402.N)M0^ۤgDxe gd{=2hpx`s8Jwwr#w73Nym]jW{m77bsw?[ NE{fmy@%V>c;?=K.|5GK0KG6i TmQӞzfN4ځt|4~xFܦ!үIW??PK ^1Q-bM j:? phpDocumentor-TypeResolver-6a467b8/src/Types/ContextFactory.phpUTc_ZS۸=z\BB~kʗfh7[!~;#ˡJ-vо!H/Z~vy3/uOÜ%7˗-ςL;\xJ ;`<93Fi/?f&|`Mc~GEG]2E%pt<1ӄj7I} f0$q=|i. ["mPԏ^o`~ՊK-\i<MOAX0NaѮ:4 <6G:5[iTQ"h$LbH9 *&x%U37L8`(w^N6ǃhLp2F'nqepE|" Cwwj!d0r.N=>x8NONgrBy6?t0 ƣÏ=3:?;n]LI>N[q189>:>ik%Mg ,KR$ D!º0,> Bƛ\F)\ 2F r>ɈhY*"x|'E6xsd%uD`p@ K9)k %;MBA؇rQq#Yv($R`قx-(wzO۔ݤL<"X-l핬2,(?ֲR]K5+>"X_ E4ЅWBS>V.yBbv#djN"A`OWg%&62jZh^h`V٘N[ =PO/D !(`Pd #h,bX* C٬>Oؤ7qieLR\udNCIj5,Ty\4Ǿ=pK\3y紹QPڠ]||`A,l i \,pQ\l8#Q<6ɯ cM[YDݮE%K4L"/m3ʋl"aniv?P /qbyى6X0nnQ[yP6୐l0aػ?:"|GB$2Kj]V6Z7t7~+L4Y%X5g =374\y3o3 E~-#Lg$ -{^4I!r'$9/~Ovd ,iSgJ^/i̷ݘ5|h6\q˦_i@c**5g~i)Ezcq_U.o3I6/g9e1}SP]Xfxbi՝M`oo5wZw/Vhzo";*IfuJ&I^7K-iN i1@G`N| j>n,٠*RNe{MC\_໡->n?)t5(#dOJOqW=m |R+?j864HBu{E[AV~g!c3˜<[ֵ}^SJ+./cOjY?PK ^1QtV@-; phpDocumentor-TypeResolver-6a467b8/src/Types/Expression.phpUTc_M0sXzv?h҅Rdi!(%!e{Gr!4ؑf>{׺Pjq+IK9 Fb:0VF_TzZnUSVM#Lm}'HYs N്myc1KGe=jVT[E Za`B2kOKnS,oxZFt /s5"`1\(:f4G1pQ`үed̯LO_ߞXA _yqAn.Xi2"eTYvY?FӢ\m7o47>lp.ދFA9{ɸ09;X.5|Q0IFOUܽ v*y=#EoBfP'sسLAm8>SDH/ n4zE깰,ųo`'GO'mRd1M܃K_PK ^1Qgr_7 phpDocumentor-TypeResolver-6a467b8/src/Types/Float_.phpUTc_QMK1W̭hUQQPl76dbw\fͼ"AʈD([t~29NL7 :c 2zUБ3n+Kz.[ ʇh=tQp$sww{\Qu`/hSصPP| yoָ¼ijNd vU~*iYڌоp"mAzI?Cv86ÐI+8ɆYg攭 &.VH9#:B)fw-jhX0E]YvyM}CnP|?WEfCwv~)+u >PK ^1Qpb8 phpDocumentor-TypeResolver-6a467b8/src/Types/Integer.phpUTc_QMK1W̭u.^I(dv76dbw\2}y牢Q`)D4xMX^{'tJ獏@#B{4H k#\$xw7ۊZ?ʨG$u]&԰54r$B&ҸWpa@=#Q8i[Z8p Sc{zy*iYڌWB11¸nလ E$td),VaqC28BЉQUrx@%4Fg $Z`gC`[ vvi,m]u 5G 8TKO9 q4[ߝ؉OPK ^1Qz;= phpDocumentor-TypeResolver-6a467b8/src/Types/Intersection.phpUTc_SAn0{(Hm$)=ii%mCIU=C.SuqvfvvyɵX龕@h&|lM8e߱/KHb=ŖҺKFR"-%S[ߩ(֜Ӭo/|u_on~d[U]'plKRTzJ(h+ iI<;f(qXV:- Z_~oN>!QYq(E-mOgB49&Ao,AFKxGtJW>[ ʇM4ˁ@: (t[QEoUws}yhk@BeB kCg% ;3k j DiT{qF'GLA [TXOi3!bXb a]eŎ $iC3JN퍓숕)|"t:yIE7- |]bH9g;-BP\+&gCȉˌcxaZ-^5 rueh[wl[Ngp^k3O C1t2u&["VT|9KarKNۊ}_ˍK$B6yBf!eۊPK ^1Qr7 phpDocumentor-TypeResolver-6a467b8/src/Types/Mixed_.phpUTc_KOC!6FGb+ s{\ 0XwW\s9: }B2(Q4V0B4 <&Ag,AFK/:qeGւ-uO k-\ x۪:_.UzI )tm&԰5 $BH75nuDa4 F'LA{,P"`9Sѣ}W"&Vf-xzJ?!I;a$[3NrV7E3p^$A\b5{]Nc|JET}Z6y*,bg֫_S[U߰Z_0z4zSRѰ>[ -|+n5o-o`l?v<9|JJFE账ŻPK ^1Q"B1eG9 phpDocumentor-TypeResolver-6a467b8/src/Types/Nullable.phpUTc_[O1W "J˥*!URس)^۲ljޱ@B[/|p4U#i*`:}7|4ண-Yy| "uѱc)+_}l-hVr,itIZ^1yw o e}|y}{YZy)J`2%q'+’|e-%d"뱏sY4S=Dg[p=ܕN)z^ٌ}SV!bDAn fŎH'JotUh-l?\d%' ٨zۏz %(4ͯ"XXiJsΫ -(DZ(F8(dkf-\Wi/ȩ=s4Qy&AΈAt͚aX׮sPƎζp[ L@DǾb(ʞ1P ԝxwNFkQ$g%3e_|M+ծ50+K9d~|{:e++t?}x~[+OoPK ^1Q^8 phpDocumentor-TypeResolver-6a467b8/src/Types/Object_.phpUTc_TQo0~ϯ8Iie/*746Q;wN64~sfK$9fJ8dfamO^Odt|1ܗC!Z(ɪ%`ܐ88%BQ)k'esP2C.[ U(ho%1}z7rJQx%WsxM2$[JWFD47иD%z+(- 3pPq+d~1p3CA`0uHQԥ5~+*OoC*^`vEtB@t6ZKײӿ83f! .?MiÁ͇a;:.J>ky@n@`TŌp2 Cz4m [ϰTP[/D.UsqԅB5j*3K[' + I}Y'W" DKWZI[$-UKYQ][gVkɡhONFt`tf= B͜3n:tI^͘LpUzgQX~̪Ej[&axdPd'8wxAӃq^'W1"_zy$46C6{J6 ⠂`_:H_ !%- 1ts'9|MN޶f܉ڱ-kUL&E<C|cM7u:;^*~Y+'@|MBZ?PK ^1Q 8 phpDocumentor-TypeResolver-6a467b8/src/Types/Parent_.phpUTc_Mo1 ]-;ڂ@@TiI<;$JVC%<~7-xZ=go_]3l66p3S4H?%N4s*3B}`@cqJeL)n!ru_|v}}<[IH țtf ;`d)kהTCC91h!xȈ8Q^4{kH|q~\^^Q};ͰohaIF٠,[ z8t2 "ԒP%?(%iNMxZSуv%YȘ2qRj1^ySGAC3@b1a $H$TtXTcnmQ Km_~M{WFkn;c,|rMzkCP FbE4 @i>oo[QnǴe|"w!N{U?PK ^1Q٬6 phpDocumentor-TypeResolver-6a467b8/src/Types/Self_.phpUTc_RMk\1 Wdפ!BI!r ,~ډml9K(ꋍfF-EtJ\aP+L> u!H0&6cTV\&SrS Loo7+S*&r@ͱWn}+{Cr9T3onn1u0W}@=BzԻdۈRsD~Ih@[`SLtXDS !4|N|cy/ `g*8/֍7V,r#G[5łdl~uьX3 ϏI$`'/o` 73 .1 HSZ$Jo=d0`Ru 0( *UD@f+x27%0֦EYh8@MAJTvf?])N4ȣI[5/0c﵏N$d $ܝų`LURD+(H;(}H60ȬUzM,5o~"UjjY3xTd1QnHR  K#>dB~YEV nFȚ&uޭ^t/?PK ^1Q/%F&Цk3;%2Wָwaګk7B89` q,,YTErQ"`93ѫ}.D #[W_%S n=:H I C&Z:$GgeJRW`ΩHPHŧ(*q ̑rt $3;CB*4}Z6 b֫!|3>~a"W4>3؛{=brp:؉/PK ^1Q=K5 phpDocumentor-TypeResolver-6a467b8/src/Types/This.phpUTc_RMk0W̡d٬5ihiB,ȒFYޑ&)Ȗͼ}ǨEt̉ o1_}ume3?P ߖyS$hu;~1/PK ^1Q# phpDocumentor-TypeResolver-6a467b8/UTc_PK ^1Q|8* JphpDocumentor-TypeResolver-6a467b8/LICENSEUTc_PK ^1Qܵ\' #, phpDocumentor-TypeResolver-6a467b8/README.mdUTc_PK ^1QqMa0 phpDocumentor-TypeResolver-6a467b8/composer.jsonUTc_PK ^1QF|B 0 IphpDocumentor-TypeResolver-6a467b8/composer.lockUTc_PK ^1Q%0 phpDocumentor-TypeResolver-6a467b8/phpbench.jsonUTc_PK ^1Q' phpDocumentor-TypeResolver-6a467b8/src/UTc_PK ^1QG6xj8 #phpDocumentor-TypeResolver-6a467b8/src/FqsenResolver.phpUTc_PK ^1Qҟn5 phpDocumentor-TypeResolver-6a467b8/src/PseudoType.phpUTc_PK ^1Q3 IphpDocumentor-TypeResolver-6a467b8/src/PseudoTypes/UTc_PK ^1Q"WAs= phpDocumentor-TypeResolver-6a467b8/src/PseudoTypes/False_.phpUTc_PK ^1Q)xo< phpDocumentor-TypeResolver-6a467b8/src/PseudoTypes/True_.phpUTc_PK ^1Q28)4/ phpDocumentor-TypeResolver-6a467b8/src/Type.phpUTc_PK ^1QrTPҭ7H7 ? phpDocumentor-TypeResolver-6a467b8/src/TypeResolver.phpUTc_PK ^1Q- J0phpDocumentor-TypeResolver-6a467b8/src/Types/UTc_PK ^1Q|= 0phpDocumentor-TypeResolver-6a467b8/src/Types/AbstractList.phpUTc_PK ^1Q`! ? 3phpDocumentor-TypeResolver-6a467b8/src/Types/AggregatedType.phpUTc_PK ^1Q]ַ7 7phpDocumentor-TypeResolver-6a467b8/src/Types/Array_.phpUTc_PK ^1Q~Te|o`8 :phpDocumentor-TypeResolver-6a467b8/src/Types/Boolean.phpUTc_PK ^1Q$&tm: ;phpDocumentor-TypeResolver-6a467b8/src/Types/Callable_.phpUTc_PK ^1QUx!< =phpDocumentor-TypeResolver-6a467b8/src/Types/ClassString.phpUTc_PK ^1Q9:; 6@phpDocumentor-TypeResolver-6a467b8/src/Types/Collection.phpUTc_PK ^1Q ݲ49 qCphpDocumentor-TypeResolver-6a467b8/src/Types/Compound.phpUTc_PK ^1Q>@i 8 FphpDocumentor-TypeResolver-6a467b8/src/Types/Context.phpUTc_PK ^1Q-bM j:? JphpDocumentor-TypeResolver-6a467b8/src/Types/ContextFactory.phpUTc_PK ^1QtV@-; VphpDocumentor-TypeResolver-6a467b8/src/Types/Expression.phpUTc_PK ^1Qgr_7 XphpDocumentor-TypeResolver-6a467b8/src/Types/Float_.phpUTc_PK ^1Qpb8 QZphpDocumentor-TypeResolver-6a467b8/src/Types/Integer.phpUTc_PK ^1Qz;=  \phpDocumentor-TypeResolver-6a467b8/src/Types/Intersection.phpUTc_PK ^1Q"PB:: ^phpDocumentor-TypeResolver-6a467b8/src/Types/Iterable_.phpUTc_PK ^1Qr7 `phpDocumentor-TypeResolver-6a467b8/src/Types/Mixed_.phpUTc_PK ^1Q?*wj6 bphpDocumentor-TypeResolver-6a467b8/src/Types/Null_.phpUTc_PK ^1Q"B1eG9 dphpDocumentor-TypeResolver-6a467b8/src/Types/Nullable.phpUTc_PK ^1Q^8 fphpDocumentor-TypeResolver-6a467b8/src/Types/Object_.phpUTc_PK ^1Q 8 pjphpDocumentor-TypeResolver-6a467b8/src/Types/Parent_.phpUTc_PK ^1Q9sq: qlphpDocumentor-TypeResolver-6a467b8/src/Types/Resource_.phpUTc_PK ^1Q67 EnphpDocumentor-TypeResolver-6a467b8/src/Types/Scalar.phpUTc_PK ^1Q٬6 nx*O Q O A)%"B%B8A&^UVy)LEؙ5{7F$ga5nҬ 1lȥu$X*%0Bh&[wJ;^ )H )c?h DDpFF OŨ"`JoתJ7I@l 5n۾/W(eIʙ'P) :'j6*F3s8SZ3~w{|;ns~|~:xz{Qxtwv<8e(ЀRdW\;ц fPM+ހ#Ϫ%c)t(Fs7Bs=`.[Y'R|i@9Q}L+5[i}ԍ&vL l2:AQf$T,/`07Br8,bBMvs­d~ÌQƞ^@=Z۟Fz>]e֬Q -SWa/LF-NAzR=ҐO 9`],p>d%m+$fi0v mhhvApUw+% x¹Ys3&ԋ[!RaݍVF57jbBd 8ud\T64wUxUBcPLV?S,`4(#2%&T/+.zMVa¯-u^n#I- _rK#"dye(6zZ5.= [՟ N LY>G"pӛ@Ѥq Ѱ(&9> ).?CKayh'iތj6.JV+=PK }WRP|8* phpDocumentor-TypeResolver-7462d5f/LICENSEUT.4L^]RKo0Wzj%qo8q͑KpF;CV] { i w{ Kmr>}??AZxmFUv:dwop1.d-=}3lC3N.6nthag&}4|ăηco>6q0tj%sɆ80pc;;^h|: }y7'9ޝ#&%m&㛟 a`PSCOx[Q̥ǯN\`4"g:+6R~~9 ?3Xjv^}DW tUo7;{[QD!]3O36%VKZEf";^c|FZK^n,J,\ 2י,as‡,#Q@7()j+NW̥&l)MIKCŵ:T->CRK,yDV́xsb|5TU[-WV*&E.Th*͹,x<E3jJP8~$*0A|nd-ZִVEh8f+V _.-k9by/{dPK }WRPHU(+ phpDocumentor-TypeResolver-7462d5f/MakefileUT.4L^N0S7dTBiQBb9ǶjJkIMڑRFc+l$4 r.\A9(5rpQG@L{6uU2޽вx7DYFv?nXh/ aFZ6Ρ<3i3Id|CفyPK }WRP^$( #, phpDocumentor-TypeResolver-7462d5f/README.mdUT.4L^YoFŦAR`K'@4(\+qkVtmfv\4 ffy:QSaVKw0|2ԍLe:Wpt'*j磖,T6QccܟwG.j:Nb̖I*Jc'zr&Vv2j)n^ڐéE=[HW*;P dO atn( wTzs).>Y8u/z4#*/”ʧQv7ɽ$7\׶aFY:B87DdrIh8T #R: S;l%Qyz_^'k.Juq7g/ߜqlC ڍzGL;n|ɚ+iCw%ek}pwǯb]S2ddB6$xF%-z2skL^5x}YqiJqEq [PGy8zA<5IJC6z5{7Lw8 {ȤТz@$"ɽ y.q΁~ "^i[Oy47Y!]<&t1uSi{Alލ7u' z:#bt+@n1\(Yx'҈EOVZxp8Tg۱>,esD v[qS:cmnh*I٧ƔV8 u: rT[Ac}?U[+NaeEfݡ!/~{ɓ'x"j?Ovph֎̄^V\']lt$~HGpZ-: rr:mռ%9g=R{ n;FQ>mM}WjƋK^|!gg6G"_#q{WPBK;e=`*u:D?,jT HMEwNȂFƦ!Mϟs1칸CüNM1cN3Ft{>)j]<=JJ qKѢk[:ފFaA D< Q`B[h\1$)-۰@v{Qt0d0gcx˹*/ppo:&P}l)1?7a妪?٘ieYQ. } l84\g&K~n $ NL;(dA]HPN׳k2{$v^ M? DZ58no 2/͜/_W;?cvV[U*W3HKIcAOYBvts&E'UdM:լdotc"~FJWJoij[p-5wtwfAߵx!(7 zg'VɂI&x\hk3VVz uѰycZm_LӥQG(Z iyӚyO\C몽m elT1SL?!:m.ִ$o/1Qmo7&/D:o6(_n’8ԼU,v7r PK }WRP딿=? phpDocumentor-TypeResolver-7462d5f/composer-require-config.jsonUT.4L^MN1 DQpCE9 !ެM1v 8ѼdBzƯC6cxsਜC&'sRWSisb\6e_Uc{D#Qgs<1V8*K:&۰hwg<9[馟q!1Pn-3ZPK }WRP'\'0 phpDocumentor-TypeResolver-7462d5f/composer.jsonUT.4L^KO@I״јҨ $&̣;% L_7Φ3;s!cQ3+ YC1Y4(s' '|߰'X#fv'blᭈqBb MXr<4c%*L_͔nculwg-7l&Aէk h.Uh^UE:jurQc>  .drUV ByUIrUN]@ VlNqw[0&OܗfY/>a|5i:kip'K #_Dw]\IND,֜\8ٗYPK }WRP\/s90 phpDocumentor-TypeResolver-7462d5f/composer.lockUT.4L^[r۸ڒv\Im?eK/,dxs+?qӂ&y9ee,(ȍ@rJQJkZ$ Teh^5ռHDBݔmĒ~Gx**NNF"&h*e-&5*JPnVzVdlF#F#55Wi};?fm3\ϮiI9"Ȫ?F*%-1b 9焮~āXƶsǍjLn0V>%A\j xNǜf9ċU^Uy=lFVmiv5tLn U*LN3`W6~M4{_(8}MpL}?\#iq^yly2!|53)^ax'G IDdSY7pX߅=h[ީq{U~ Ϲ|c9K8L?IK25pΰ{F|Y>iw~kiׂ^ z^$8?Ԟ,;RY.ۑDU?_na7"ӊ=qXBhKW o%eo:A ̴o`GnmRA8e݌@HjA2GYT) ۡVQ7t~[;?+<Z;qE*&D\0)HxeGN|wb[e%?xr# 9^a(gQci1 rSG4S/m{Q`_~ z;[`owWiqB"7*L.S<h^j/tS't=J&L*\iMt{f S@*د}(O-M3;^X~x^Qpb?lqN"-|-+.UJuLFr'6{)0 KtK+8vi=u Hm)Qif˦ADCefI av ͖[+lbp*0 -n3jZgUA`r(x]g~ )u50`e!D oÛInpr 2O1$z{X6ZV7# K*o+27~w\:y~̢}.d6 qK[ڱ]1sT"H?$_iT%qP;籇. (I=~DYZlZGi@pYy=XĆ ǻ‰M<$~a:O"}V% ReCfqBh(R۳qqsEC8Z@Nw^풲,=wuVOI% 'k_?q'Y^?zz=2Ab IGqOAvʁE#X[&cpNy9gPK }WRP3, phpDocumentor-TypeResolver-7462d5f/phive.xmlUT.4L^ENK 0M]iڝ'Э`LhEoom3,aAy=,ޮ]}`REJ=Stb)C1X,̔FUq9!w9\/빼,44TPK }WRPn1 phpDocumentor-TypeResolver-7462d5f/phpcs.xml.distUT.4L^}Qn +j;!\XUu}N_\@;;38ΣeD4ʧt". &Shw7PK }WRP\H , phpDocumentor-TypeResolver-7462d5f/psalm.xmlUT.4L^n0{] M.EZ,ܞy}}s 7yF4&1!阔+'iX2fy_h** E,3c%.4eSFy~Y_Wh+Jq:1.ɶ*פ=g G8189m(lHݭ̍H1]A@*EATrKjU`E*7,9=rd/6&Ll|@c ٯF0@whܿT?rL>PK }WRP' phpDocumentor-TypeResolver-7462d5f/src/UT.4L^PK }WRP!L8 phpDocumentor-TypeResolver-7462d5f/src/FqsenResolver.phpUT.4L^UMO@WL%$chԆ @gXvu]c'`/<3o>,͂`1(;mAwo/=Nq"e@&@g2ΟP:f=ϥ"$9EEj s,F B$R=EIцcD W.p4Z(ϤUalu9IBh) N8ԘRswZ"zBEl ETՅXFj\1fZgv~S) >7Ʌ>gz˞{K gRS-F1A-U/~d)0ahڐh{8N 3TJ ϱ[FPhdp}9;R;=V5Ilm8NAIW+~\9اEStkidi4,km+4t]X}cԨ<&sćar(ec:هhhXH+h`K` i9r:˄3M͏\ŷyo-w[b<۠'Si4ojBHETex#ќί( J9Z{ e Vhd`)XosĤJtpN!Iy|Z}mfa-/QaӖ%aEG 4-{Xv-]݇)! w DC fH4s*Nu_h7T ޾*k¾Hp;F*mFJP3]YۘQOtKZ kPK }WRPﻸ'/ phpDocumentor-TypeResolver-7462d5f/src/Type.phpUT.4L^UAK1 9هMQ xvF[˺cݴ\Rɓ>Etƫ%a-A[ L> HN:3"}&SO\Z e`0Pdp :Z`,2"NO=kH}zv Xٳ٠,G| ts$a^oѣ a/Ӫ |[EzE@C/Mρh >5x G5=1OdoBL"ǠQw =GY0ֹ`-O/fz9^{xLk8zDz8$Âhwv3al-1̒'@,alioDl JQFjŦ4p}8 Kc#]_P[ (PATj=ph7kj'Kf#/LymȒy##'v[ p h`/)=p@2(#XmzG.9񎅘)7s6i@|L؟ H׋n *e0 WH(;TaSˇfmm6SkI=;Cb6O"c(S\*N`'awp D<9L­_2!;Sw g?dF "͎!uZg#Hp",C<2@Y\. b'8K8^ ^3F8w 1QZ5;KyE1((G3 ;R+ļ#Jmnyv6U8AJIC`Ng$C:_fDQ 94@D/%~oU0Yʻlۤ4㶉$ lU^"&a";鋴7fCc b 2֪̾eP@>笴غtVw=?vGG~[cE6!5-g@zk}upu nuF[dh]#d)^ٲd8-Qu*PN (Eɐ&D) "V(4 ,'zA!!.TnOQ_뎖aqZ0m3D$mC Mva03EcT@M^vdl%>3J,*B+Y Ҋ]vJZ  ۦ"вq)(Q ov T&v4H@µUryˉð0dRe>;}.v}P9 %|/z"i2FxYk2~VǽJu)>uϟA£;IZ{*TY uzy-K*(ŁDSNj3ô7b# 4sTWxzBxc9 yR,?En$sZᶑ^p7y+tpyG,n 0Oo 'Xe2juʚ*OF=qEDak]m` ^]j@uK`ՠJukjj| ]N?H>_VqZF_ < /i4tge{EVEž(A PT\Q RY~\؝^(B ihpzRߌ~9'!б?k7}*f7~qSivσU.w['٘+\bRp!]frZ>zS6+B'Ng,/?O)$F\L9LuѨ{a?mְ$δˑ>Fz%դ~%s70cYQلBTz $ b x)kUJkuT&NBe۪uF)9KQMRNAwe[_Y*bmܮ+]td)iy;'f阋EIWqV z}H?m{]S܎nIJ~N@'^[b} ,p@';?p ?πܐy l26EzO36e-CJH/kxCJ?'9 }P^?fͻH_EF"R@cezb!оW:*CMRmrD's.NQlձR`5GuM5<#AA6*[X 58/eoHڻצa G7,7Bm3sm-{FˤaКa2@‡&: AhF<Ş)D1J UI PQ {"jhɽVHjjR'J#,1ݶ4SKS&ADšS$\41˪ǟ;XX=d1J1")*0ɍ[zL"z| j)EbO_C_Jj:_gŷDf,|ZNՍh!<{rHb[0&EEMޒ3BJupKE)'-%J RKr}}’.ss$|?.Lxa\?Rg9S9$@5M=οw3 g8*5(t׀yecF_|ى5Vs1τTꞒ{c\JiZ,w-RiʰM#v5 ,d++ߓfJUMU _ȑsK,4>Fs:cUQe1=iwvYp0`J7ԢT\ G[go( BNB=joBĐ !U+G9byE=\9EӷWqX%Η5BLyLmw(Wp_g .8N=*E/OcqL\@jƎ!?#nZ+&͍iVb_.trRFhIٕN5 ?I);s'QM}𢳐4C( FC5Vbrzt/HPO8N)/gZ<ŎMhOy:F>dyJu){‘cōuՠoZ*TA'`?WMt>6ĮCpf^$!ŕ2EGlwkIsP15zВ}3R*8J zēuPK }WRPԨ.7 phpDocumentor-TypeResolver-7462d5f/src/Types/Array_.phpUT.4L^URn!sKb9kR/i&JSRZEvzj*gf 2 7ށ?P$-F:M9y >]}b1 6 :c 0f/cm󫏐5A[ ҇1΀N5\blCoohswonn T3 @3)L|Z$&RtPpeB]:pXPeB8Q sGYECB]ƈ#$Y2Z_-ϧ=* !%WC(]_4>OulHfKcMxIgӻ'\bJ3O~gR듢 5P=3Am~98bv$))@n*TmD<R^\HS35s&x۲0xPK }WRP@hO8 phpDocumentor-TypeResolver-7462d5f/src/Types/Boolean.phpUT.4L^QMKC1WͶH^[EVD- %/&!X_x2uQctu1 ьFFMXy1{z.[ ʇc4۞@: (t)\^Eop;Z UG$8um&p0s$B[5nDa4,T{5qF'd vUѵ^N4f"mFxn_ C a=tPWq2seLB-E1Q)G09 )于^e83-hΜAbfڍzfxa͆v&v~)'V!pֲi>PK }WRPK083jV: phpDocumentor-TypeResolver-7462d5f/src/Types/Callable_.phpUT.4L^QMK1WͶ.^[EVDOB&4 RI“sɲ3{o/Ш8J5Lv20$E7H{`Wy|lxL4 ZP> iFKLzww,Jfp_qwjQ>$^&Ц2;%" q[5i۲PUN0ɸ?^[TESoFf1DL0nZ; i8 YO{ fǁM xGPjK]bΈNc4|EJ|:v9vkնkr᛹j k+NmFcBuSOX~28PK }WRPW2_}< phpDocumentor-TypeResolver-7462d5f/src/Types/ClassString.phpUT.4L^QO@ )J)VBhOH$7wٝ. L+yho翝iDÑ'$E?8et2`wP)߭pNleؠ! E: ZSuC L ZI4Kʺ eh5 op\].oTG t@XNQf68ܨāB+iړAK+ jÖ Vp7Xi.Z@kb>~: |](8lrRNG!c:/k`.mڰq!y \lDpj B8:A(RB_;g_ҢEK@Mײ=ÚwΧ`ZIk8;H'}sՍr|6HzgODok`V+??Y#%N}CR='@mHPcVP|6|R%'WI[dH݆0 F{_^ m8{#OyCxgS PK }WRP ~y; phpDocumentor-TypeResolver-7462d5f/src/Types/Collection.phpUT.4L^T]O0}ϯҢҊI{)1&Z'$pؙ]IHAyhsϹ9"I2Zgwn]=>&po/=] t/qsЏO6y6y)%p]/0% kĜЪDFW!S|nLxua+tBZ. GJaT Z8WCi>fN$Q m(ns뺻% }tӢ:|㉞8 9 D Md, q3O7jLV=kp``4J/U1x8;o¾~d^ɃGہϸn>b^kI)3S:z?d?yXzƧV32u_ޭPFO2kY ٌ}yJ$~L9pdBC*?D #!tJ 'ƁlJۯImZXEWIaѲkEK〯#KgcUcvz6 hەm:W9W? y?ڼ]i v/M/Vs7nFݿpcB-t1 RRKWV(諣KI{ĀqWJ̓f_hDUӃVcH#.mwB iqVviZ[14]'aI^,zEI6?PK }WRPX^߶ 9 phpDocumentor-TypeResolver-7462d5f/src/Types/Compound.phpUT.4L^Vo6~_qTR{m5uHCK'L $em#)Ŗ{h`;M$IY- 6l?OΓdvz)TR!k&|78+VN)̼oڐ)Ȳr$TNXYP6+Vg, ~zUFXʥGl紑Xݚ(E-ry3h6%gIĊm#pn—k.jaKQ`i-hz Gpw=iG xo( ""=?OCf} n$m~DSÀ*I14d9 E`r Q[>Dy ( ЭkZϺxsZ2F3|2,NĻ*}lv!U}Gp:7}Nc?B[kld:ς!^%/A#6 PK }WRP?4 8 phpDocumentor-TypeResolver-7462d5f/src/Types/Context.phpUT.4L^VMo8WAm^un ƶ[45ˤu;CJb;MP^c7H$IQy*I md@RX&:7vBx獱s* Y=B$jG!tfFxemO>ȡB> p*F[{l_*i6Ax0"}Fuq[9ⲠR$u_02|l0oA`j)mm4i6_Ŧz,z7Yh/[m'ɰ$RZ&ASjIrVF]1]eVN@}03xC7KlUaWGK)f*`ǻF `h% Mr Qy$cβ+j^ÌqqM,o"ag_]?'Gr`7.x]Qӽ~¾=E_Y }^9h}G^c3hX Ak^ݚ$zGc%3-z)nw &ćq`4t8b& m?#S&_& 6yTMYb/~$PK }WRP 0? phpDocumentor-TypeResolver-7462d5f/src/Types/ContextFactory.phpUT.4L^Z[S#7~PRTl&`&٢YR#eڥVq{ZݶCF/ؒEG;YΗVȂ I9%K{?ퟴZG>r3R2bF I)$DtaHsFY YE4KByH(`<|Q2f#RtWgx<9hJ{$ *sX]$A!3#Qc. Z.X@~Ħ1 P4?Bd¦5uɟi}1S/["]Z9iN%Һ ⯫$|Nr̛!cMD|*@SI~?տ'ןCw?R zϧQlQƟaޛOƃQz䮌oFsA+g#ч0pdF%#W%" ~)%9'd)XLY,߈PZC $~9Py|DcR"G}"JxM@pBZeb"yB=a>cQɯG4%rh7``1/.[D8diECf1i^@_DA.IZtc ^a M.j8aȷ*$"J)Gwڷ|0ߏ*<&MejZ @s\f-Km^?{SP\rYFQW 9;7qhgAQ3а)jdodϝm3k:6)f a<8i7zFa9IzjRBOۀ+7gLE)d~;kŇ@dsN<4=q|.NƷ*3UBwa.i[Q#QXStHgtZ-کXbZ 7@ٱ$jil݃dBB~m;y8-z=.VstfzxnRy0i%;w0՚Wv4U&e`sx}.i%ԃCGG䂦P"T^i8rW+ Snb^iY,—~LA951Sak#Atd1$Xح7+SOzS) J{w7&-|$EW*TNF2 U.MSdU"5w#Ep5fx?hS3 \6]sU~!cnn  >lN%v^ٯw R|dogAw34VH,VTyzױS|2_{9ɐ攘vQ?F@^aq,n o!fȮclhV^h7Ĩ{[$ @ձ>!ه|̮"W`-2ƻA\)ak^ab޷y-'em})v5)uu5*1l& emH_Upv9 MIY„%azdžJGւͶ'N5 ]b d`Qr➟/i@n 5 \a-稐iQpgA(ۖj\opr)HYa5΢*Vb?MI^7\!bbq[0^RSwIvʔ5=PJ)J[bs]bNcd |kla|6,] b֫]7 _6^_n;Rγ IPK }WRPItL8 phpDocumentor-TypeResolver-7462d5f/src/Types/Integer.phpUT.4L^AO!ݘnZ&Cc.) ;< {waBhTVF&Fс.l)D4 &Ag,AF[_#:qβ|h@貵|DiFKw7,J0x}*4HLM;fB gC0K9*4[ ʇu4@: (t)\RnEɽG~qswQ=$J&Ц2'%![gָaӰP9!\b q,8Y\U*`!i?uuݸD)31?SFl3PK }WRPlq[7 phpDocumentor-TypeResolver-7462d5f/src/Types/Mixed_.phpUT.4L^QKK1W̭u]VEIXdMB2;x2|=$AʈD(i0 5I0w |lt^4" ZP>YiFK< >Nw,J{5˻2( 26E*jZQ!iQpj@=#QXt ^> )HEUt=/K?~3z6#ܯ^ Cl8edPCI$eeJp[=) xOe*]TNcT|fJ|VFs bCg֫M=w+^U9uR}/=*f PK }WRPl1kS6 phpDocumentor-TypeResolver-7462d5f/src/Types/Null_.phpUT.4L^QJC1+f[=VB[<JMlZDEPK }WRPY>09 phpDocumentor-TypeResolver-7462d5f/src/Types/Nullable.phpUT.4L^N1)$D*ZRgS۲ljwIJB x?>4AmUAH N 7d4j`w=%"=;/^9:q,i%=B*ҬgP΀%.I 8WLAۂpY]},<R%0Th`IKDXQ 2%^=s8Lx=q&I85I΢.\wџIOT6#|oI"I*@7T[HXDPKQf\:rBS!An@  Viջw)  FæY+GLR´yOTd h Mͨ0L;c<5\e6 %/ 4u+!,Ǯ:pZ c/sC8Ystω_IEDg0^|/U\9$gk-K9)z:tV~7Щ>v;l<6PK }WRPE" 8 phpDocumentor-TypeResolver-7462d5f/src/Types/Object_.phpUT.4L^TQo0~ϯ8IiҊ׎!$46ˤM.!ΝMG/M_$IY%,231&gI2:=MK預a=(%*8R[%BQWdl\ʡ*G%TRxLV!ջݔK<_ k n^{a-}I'fH@9 .*CXf<\gCmt>J%茠N XT1{ەZJo"Nfh8,-qb& [@]vUiRHeT tn;n@Fgs$A(9`j>DaB(;+Iy9c LzFk K1|bQYr JsW f9qzn: ThE5 3-U1g &q:' +a!QO+W#qtm|%+%$+ h|f,B{ wr+ѾQ$6X-/^"D\~[鴞mܙn6c2֙aR`!+ ȋ:E£&axdُp4! XN<8ZU}pG[#/dvv K  `ZH!!% Z  1tvs')~M^io͸g[ @L3}'0^Mp0u:;~ z @&!--PK }WRP8 phpDocumentor-TypeResolver-7462d5f/src/Types/Parent_.phpUT.4L^RMoT1 Wv'--V*&m6U߱Z*N{@#ibMi{Od{^-Nt݊<)zMа6쌈ysk|<1E[gA_]a yzϗMp -_0\9f6=-C]ʻRF,a$Vp4Zi ؘ C_<0/,gSq~u!lTna ΡV+=MBOPK }WRPhZ: phpDocumentor-TypeResolver-7462d5f/src/Types/Resource_.phpUT.4L^QJ1+f[dQhBInldb)w+\yo7סBhTVF$Fъp"D; 7 :c2zUޡ#䃏@=B!MO k-\NE +nPK }WRPuiw7 phpDocumentor-TypeResolver-7462d5f/src/Types/Scalar.phpUT.4L^]kT1+VQ (tW%'s̈́ĥHX+^97>M .Y*`}ʘi1+,1![, \;b❖ʏ ai)q 6{Ha:"/G+JB?"FOﯿO8 >vusp4Z*5v!HSXZ,6FS9[ZR0Z,\>5ʭYLH=K-XX"5V4;!ٮܖqbw  Js^a\3wk ʷ%u.Rfy^h˳H[OY&4_| s>nU%fl@=A]a H9jOV Aވ P0:քnq}V{H ]*c" Y X~yx\JheiTY),&LW?#t)<2=n⸓(BHhyH0儎"CTo{nQj2X)q{}PU#xdM#9yN/^/PK }WRPoeT8 phpDocumentor-TypeResolver-7462d5f/src/Types/String_.phpUT.4L^QJC1+fg[^ܶVD- %MƦIH&"w'\9@fΜ\^>QYq(E+:LWÉh$`$E7H;`Wy|lxL>#tZP>iFKu>$!Xnp_qOw|KLMQ΄zsTDXP' eګ [!a q,,gYTErQ"`93ѫe]"&FJpV,YSutIʔ`^+0;0%(Ň(>*C̐rt $S8B)D|Bs b#֫m󵯭ok>UcZ?) a 'uTB~,Mj(PK }WRP,*45 phpDocumentor-TypeResolver-7462d5f/src/Types/This.phpUT.4L^Rj1 +t($Y4MPZHBOkkvxlc]%ͩxғ{yxt<\wWƬ  x@Al C@kFNe%i%ah!KPh72!XDR,SK&wܷnjޏG˰<)mc'%"\jjš4xbp(>A?#s\OnNkcf+WpZ [OҋG?mh?$ s*=\V->%F ZrKBWLVZ#Pij-ms6LO4M):*AtH eeį`g7!ͲEAn%J@ц#D4cZY]ǫ" S^a'[PL&$:[;l,e쓃͆ӽSܝ_%3g>zf!]glPK }WRP#{Jݳ6 phpDocumentor-TypeResolver-7462d5f/src/Types/Void_.phpUT.4L^Rj1 +tK;M PZHBN;̸둌-ﰔ{eStmg}S4al,Cŕ1je`0kIܗI85frɏ%HY!h4[L zwo~=TO&+ Wv"`2r\R+ZL"딨~i3h? 8+j/7l(ƄY+09 afphpDocumentor-TypeResolver-7462d5f/src/Types/Nullable.phpUT.4L^PK }WRPE" 8 hphpDocumentor-TypeResolver-7462d5f/src/Types/Object_.phpUT.4L^PK }WRP8 1lphpDocumentor-TypeResolver-7462d5f/src/Types/Parent_.phpUT.4L^PK }WRPhZ: %nphpDocumentor-TypeResolver-7462d5f/src/Types/Resource_.phpUT.4L^PK }WRPuiw7 ophpDocumentor-TypeResolver-7462d5f/src/Types/Scalar.phpUT.4L^PK }WRPiT΋6 qphpDocumentor-TypeResolver-7462d5f/src/Types/Self_.phpUT.4L^PK }WRP 8 sphpDocumentor-TypeResolver-7462d5f/src/Types/Static_.phpUT.4L^PK }WRPoeT8 4vphpDocumentor-TypeResolver-7462d5f/src/Types/String_.phpUT.4L^PK }WRP,*45 wphpDocumentor-TypeResolver-7462d5f/src/Types/This.phpUT.4L^PK }WRP#{Jݳ6 zphpDocumentor-TypeResolver-7462d5f/src/Types/Void_.phpUT.4L^PK++/|(7462d5f123dfc080dfdf26897032a6513644fc95PK!$i= = >reflection-common/6243ab17e2330fb7ce63d34391d53104cc913dc0.zipnuIwPK uP' phpDocumentor-ReflectionCommon-1d01c49/UTo ^PK uP/ phpDocumentor-ReflectionCommon-1d01c49/.github/UTo ^PK uPbίi= phpDocumentor-ReflectionCommon-1d01c49/.github/dependabot.ymlUTo ^ ;! SXۣ|JSbJ{Ѝp4"AD6}2e#t<(KD&ƕ${uؗj-Re2PK uP9 phpDocumentor-ReflectionCommon-1d01c49/.github/workflows/UTo ^PK uP(n`A phpDocumentor-ReflectionCommon-1d01c49/.github/workflows/push.ymlUTo ^Xmo6_Afٚ 0Pb%h,qH/N}GV$Κ6)V̟rswQ""D9+!D+B;[?rZȫ$NU C8a-E 2Tc gpC˥0=>>%Վgh@j% Tj2E ztOg<00 Sח0G#EA')}əG;;DJQ!ӧh}ؐ7T+ea`i,A"PM"a]N|):>5;~룋W'?#& kR!3ܐ cKB _( S4ToYYHsӉ– ꝰbRKXE+3Šp0mC^qe 3pxK3Dh/'qo{8< ??;Qe*ua& (Kx& \9-HbEkT$]H@7D)v)$.pAؕ7PL1$}O~C3V8oRE`] 66K-ҭr ~X Qxac5*kHpymהAâv[@K 1 E9R?|tm_)Ϫm7~8QǯC`*_Q;DNV[Zi|#! [eXbؚ“qY]o͵gN۸&@W pGBTؓWcz%nkDV˯k& åʬ,99 䄙{K2.rm]ɹH!E67Mcؤ-]LEuR?wxr?= y'سa/` uSuG`w` PueHd~̋/8V7vlv ee2n2Ƥ뀁?+AWIe"e:}ڙ?Y&cgcJn"m4cd&X17X: ~8@S™H +SQ?Gq`㸂lsv؜pڪT_y퀧 2^}\XGc2SIN,: ͇DjqA~BLϫvf"V" )s-,ʞ$!8PK uP*2Ȑz9. phpDocumentor-ReflectionCommon-1d01c49/LICENSEUTo ^]RK0W8J!қIb5đcr !BŦh}gVBB35YHk,<`Xɝ#|ݘrCc.p:;+zM8Y MWO'@P0) b7Ni?k=Yn7F>hu$mxEZ[ @ooOpu qr q$wgwW ?0$L@>8αˡwKuD}DljL('?A}ϐ9뇻yx_Qεi@I;cZ+&RƏ5~h% 3To;g]w,ƏޟBW=}a3|xxW0i?Tjev\ ZLd֋vҬNh^=b?d% ~ZT(̥,|+~`$5 HN%EEd5|)si [ISJiPrmd͹rKU ϐJ؈<*@`՚9I1EAʽkkgK27) \n?E3ZP8R#UA1RUe)yd%ZVV:fB.#To+N9rUox?PK uP һ.O0 phpDocumentor-ReflectionCommon-1d01c49/README.mdUTo ^œ=O0t@CbXb(  kXu|IU~=& .'rHC ^? *Z1JS@+d%^yetqS# +Lwzbް i=GTX`ɪGQ`Z [ )4,K4lKPvp-I. 6`v; g8ipYnD.99-티SF}9LCdDBJ`sk LC,hŎKE5g/~<:ULlo.,`7X PK uP Y4 phpDocumentor-ReflectionCommon-1d01c49/composer.jsonUTo ^]Q[O ~߯8ymbٓD5^ެKW6 e^x)nhQ4G2Rd׬Q9m?ZELVdzop_im#j5dw:**VX=}ܿ69td$*>ڬ|Q{LRkBir{\4GΔ̕ )*lPK uP+ phpDocumentor-ReflectionCommon-1d01c49/src/UTo ^PK uPkDk6 phpDocumentor-ReflectionCommon-1d01c49/src/Element.phpUTo ^PJ1+.k C fgwILf-Ew'iQ%{MR-#G2ǀrR*iD> B7Y Ƈc~`ЮK]B 8j&. XԂqsl<#iNRα[8ҡOѠ8'^u-9[o>үrz~m΢ɹ~v8e@XTfw :W;)T[%tbq& ^$s%E4$l8kM/T_PK uP.oV3 phpDocumentor-ReflectionCommon-1d01c49/src/File.phpUTo ^OK1slt* TM4deXt/ͼyrqtFeeQh=0]υ&x&Ac,AFKo;tG ւa`Bxk|$N XokpWtaW?Ғ`'&mzv40K}TF5~\[^|(̪Ak>|_ d)HDxZccQe+G< ^aJ  }/,\JkbbuKֈ7yM`G\yvR]͉%Į5U9C"_WHEh ageҿw`QuBH<}`.>PK uP^LI4 phpDocumentor-ReflectionCommon-1d01c49/src/Fqsen.phpUTo ^U]oJ}Usy"%^U@u6z쮓B~gNb>$3g>. 0Lch]ٯ5_iyRiSJ.["Ei OQ.s+f'P ddp.^pP9H6fa dX73r[ 7`TS2u z3SL BS3d\`xQ &xR6źvy#30cPۑe6ւxܬ\bkŊTJх#+AT|`AxR.C8)Hf=KUs^L1x-:ZZ:eZ6|m9BV-.p%"paZھ0!xΩmCqYP?*-]FkTcf}"`rroh<κ׹-ښ%ʎ0Ki5kCWTIJIme"F޽ӝ#MpRv̇ >qWy!F%.iKFYxVNO M~\%>|ٞL}yg}A<`z4IQ<9Pj:qƨ!ܫX'; iW=TꡠtN=6vgû J٣y+[|m3-cKF.כhId=ޛ49b~u,$!ӡwOpf.pCtݲkN`FP=zLwLnu]-y29rP:)k]VkIPK uPp˜7 phpDocumentor-ReflectionCommon-1d01c49/src/Location.phpUTo ^Mo0 <m]u+v@n,ӱVY$*A6Nؐ//|녨Qp)hE+yןWB,f33628Ωԡ%#"4P^`Bm\$ig|Ѹ-yˇTG$tU"af.ܨW3%N]XB+;^rH¯'l 5T`*m1 k4s)B,<ڂ,.t%һV/F}YWdXn7ʡpƚ1uOnr&ufIK`,dx"Sv "d }I[朇|Εy~<߷#W7aRpIV2{^h:m9˻pudҠqQQ>ĭ'ީeAyrP|uHd YP:h 0Q Rzu!pyosi\w% PK uP079;6 phpDocumentor-ReflectionCommon-1d01c49/src/Project.phpUTo ^UJ1y9Ujih6 I֥$m-0?L|hQpS c/hJ@zrj&8c.@h (珁>-Rh#Y 9{ޠT^6vV rL&d2aLD En Qѐriuv|#F/o;Uθ Z+jؓUX[d) /PӤ5؈Og=/q|=oG*XT4 E) Yהۏ?-Bi59, /vK#~PK uP2^X= phpDocumentor-ReflectionCommon-1d01c49/src/ProjectFactory.phpUTo ^]MO0 > ؤI!8BYꮆ6tS8D}~VU#H[ӅE ȀnZ81BPuMѾ u )te\+=۠d@xLj}*j5(=9v]jo:ˆ;S`EQq{Bh٢}&x~A~fꀮ ֙7@s'kft<9x `4%B쒍ZA$ O+:Oا1aO|8k'Cs3m%GJ'[p&oݎߐV%J}蓸Hd?0aS|PK uP' phpDocumentor-ReflectionCommon-1d01c49/UTo ^PK uP/ NphpDocumentor-ReflectionCommon-1d01c49/.github/UTo ^PK uPbίi= phpDocumentor-ReflectionCommon-1d01c49/.github/dependabot.ymlUTo ^PK uP9 qphpDocumentor-ReflectionCommon-1d01c49/.github/workflows/UTo ^PK uP(n`A phpDocumentor-ReflectionCommon-1d01c49/.github/workflows/push.ymlUTo ^PK uP*2Ȑz9. phpDocumentor-ReflectionCommon-1d01c49/LICENSEUTo ^PK uP һ.O0  phpDocumentor-ReflectionCommon-1d01c49/README.mdUTo ^PK uP Y4 0 phpDocumentor-ReflectionCommon-1d01c49/composer.jsonUTo ^PK uP+  phpDocumentor-ReflectionCommon-1d01c49/src/UTo ^PK uPkDk6 6 phpDocumentor-ReflectionCommon-1d01c49/src/Element.phpUTo ^PK uP.oV3 phpDocumentor-ReflectionCommon-1d01c49/src/File.phpUTo ^PK uP^LI4 aphpDocumentor-ReflectionCommon-1d01c49/src/Fqsen.phpUTo ^PK uPp˜7 phpDocumentor-ReflectionCommon-1d01c49/src/Location.phpUTo ^PK uP079;6 [phpDocumentor-ReflectionCommon-1d01c49/src/Project.phpUTo ^PK uP2^X= phpDocumentor-ReflectionCommon-1d01c49/src/ProjectFactory.phpUTo ^PKJ(1d01c49d4ed62f25aa84a747ad35d5a16924662bPK! ts)s)>reflection-common/989820d4d3bc32a26c6e3cc70dd511d1b2102399.zipnuIwPK 6M' phpDocumentor-ReflectionCommon-63a995c/UTFi[PK 6MYKa7 phpDocumentor-ReflectionCommon-63a995c/.scrutinizer.ymlUTFi[N0 }GD>#,EIUqױ?X.\}%LHhTh[5ՅU1tNTFFL0H.)EPﻭq'c\4t5 ~E0d$/G+rkS7˵xNc:-2oee*E3oHGD@swZ6->znf h PK 6M*(m2 phpDocumentor-ReflectionCommon-63a995c/.travis.ymlUTFi[Tmo<_a $Yn"!ek1^`r׭cI_~=I7HTj_{Ϲ7TrHI9/+9:}Ns'7[`L$B (3basę RuN XEHH ; :!R[0dBPP(2'B4 3atD!ii&,3t-נ2mP1Q)ZZk(lgMB1YepS5-ʍAI-jθۦ9*7Vvb}3̝+m#5б ԂE@yodjiK96qg]K.acɰ=:I:ҧ"OdFÕEbp.b* 1mKӪܹ68/¤%J,۸Eu!| 6qwM}O{G5 % IAδ m]|@Yy+0G(71ZPEQr4?%XZVۋh9gL-qc12Ď\U15oޏ/ތ^/۳z55/(no*e!PSIXS;Wt_|PK 6M*2Ȑz9. phpDocumentor-ReflectionCommon-63a995c/LICENSEUTFi[]RK0W8J!қIb5đcr !BŦh}gVBB35YHk,<`Xɝ#|ݘrCc.p:;+zM8Y MWO'@P0) b7Ni?k=Yn7F>hu$mxEZ[ @ooOpu qr q$wgwW ?0$L@>8αˡwKuD}DljL('?A}ϐ9뇻yx_Qεi@I;cZ+&RƏ5~h% 3To;g]w,ƏޟBW=}a3|xxW0i?Tjev\ ZLd֋vҬNh^=b?d% ~ZT(̥,|+~`$5 HN%EEd5|)si [ISJiPrmd͹rKU ϐJ؈<*@`՚9I1EAʽkkgK27) \n?E3ZP8R#UA1RUe)yd%ZVV:fB.#To+N9rUox?PK 6M1P[:0 phpDocumentor-ReflectionCommon-63a995c/README.mdUTFi[AO0;odỸ̼nx( 6}9?6G('/&ZpTf|Y8gh $^t_&w/h6;-FXWF;˕("Qߪ0-^ rfڲ ^rjP/(ZE7`t~:x1^__F8ğvO~GD3)CM^|wsCGz:ǫ'2$=ĝN u:1Zi Քp51=4EMh!|st@Z&X59ٲCF7/#N9*{лYM" grSoؓl宽mFcCI3Uuuݾ)kmw]kՒļ"aiƈWY/46˺'BtSZQTrPK 6M ؘ0 phpDocumentor-ReflectionCommon-63a995c/phive.xmlUTFi[mA 0E=0{'vQQIڝ'Э`$4x|k#Ga4CrE0܆M|챩  L[N m1V䂘XuoF2~UT!8NY{o: yސ!$>XN6ft/lOY.PK 6M.J[XM5 phpDocumentor-ReflectionCommon-63a995c/phpmd.xml.distUTFi[KO0)p@UʩEHĭ26#Ӥz\7}g#wU`HiL08tHs8Ħ)[(+Hf&Q`W)+ku …wԑ:۶ ۇPBGP|Φl A?IjD^LZF$/\ŎvPR-35,82ὑg ⺯ ߺo9kgƻ `%S Y @0:DVUR 8.+G8ʤ _ofluNj,>QsIHmt *橰HUM({#.AnPK 6M3 phpDocumentor-ReflectionCommon-63a995c/phpstan.neonUTFi[PK 6M+ phpDocumentor-ReflectionCommon-63a995c/src/UTFi[PK 6Mlg/c6 phpDocumentor-ReflectionCommon-63a995c/src/Element.phpUTFi[Q=O0+nl+LVD;F$:Īc!(,HxHw|ymk ;/`_MsшtoD۠qjU ':()P{Kg`r$vI[lѪ :]N*҃7HAf}7t2BD9l8jz!Yw]# W?XR3㪼a_2Z WOC:  #9c7-)~yBtJte JX(|w;IZ}գS YO߶;SFD쨦Ch_[Ws>PK 6M eݧ3 phpDocumentor-ReflectionCommon-63a995c/src/File.phpUTFi[R]k0}ׯMX0mi C#$0w:K=XH:_>kA4x(E?i0}\ QO&Ak,AF3ywNJaH#|G5`BXµ>vw Xlp("K?Ғ` m{CO8K}TF ]/gs|{&ڠwW/vU]P{#XWQ=Aхk!0əqE;9rX.G0%.a/R̾%so$+e LYI֠i3J`T";q&L{p  oka<9ilnVyj,5d3fYÌEZ`( Z6jJOQ3DG_0 rޏǷ +N;߭ fKID@,֣gva&>rRPyMW)mX(xi ~Q;~K" f4G͇P8v>c{x W;F KV|;sN'b鏗i_?RIO7}'GWG<G<`*s wlژ+Lc8H6qǷ $=3uk[w MU<|`yޛo6Y\2~*ˊ(cq2͆t9/XVQ9T l~)$RlIRz<Ѥ^؈ܦ^<a;py Y#6%6 IB>l87g:bkKU Y.NRJJk *GǭlH~Mc-2!hf/l˳\UPK 6M' phpDocumentor-ReflectionCommon-63a995c/UTFi[PK 6MYKa7 NphpDocumentor-ReflectionCommon-63a995c/.scrutinizer.ymlUTFi[PK 6M*(m2  phpDocumentor-ReflectionCommon-63a995c/.travis.ymlUTFi[PK 6M*2Ȑz9. phpDocumentor-ReflectionCommon-63a995c/LICENSEUTFi[PK 6M1P[:0 SphpDocumentor-ReflectionCommon-63a995c/README.mdUTFi[PK 6M[743  phpDocumentor-ReflectionCommon-63a995c/appveyor.ymlUTFi[PK 6MZ_4  phpDocumentor-ReflectionCommon-63a995c/composer.jsonUTFi[PK 6M8i@ MphpDocumentor-ReflectionCommon-63a995c/easy-coding-standard.neonUTFi[PK 6M ؘ0 phpDocumentor-ReflectionCommon-63a995c/phive.xmlUTFi[PK 6M.J[XM5 phpDocumentor-ReflectionCommon-63a995c/phpmd.xml.distUTFi[PK 6M3 mphpDocumentor-ReflectionCommon-63a995c/phpstan.neonUTFi[PK 6M+ phpDocumentor-ReflectionCommon-63a995c/src/UTFi[PK 6Mlg/c6 phpDocumentor-ReflectionCommon-63a995c/src/Element.phpUTFi[PK 6M eݧ3 phpDocumentor-ReflectionCommon-63a995c/src/File.phpUTFi[PK 6MO%\4 phpDocumentor-ReflectionCommon-63a995c/src/Fqsen.phpUTFi[PK 6M '7 EphpDocumentor-ReflectionCommon-63a995c/src/Location.phpUTFi[PK 6Mt~6 phpDocumentor-ReflectionCommon-63a995c/src/Project.phpUTFi[PK 6M;z= phpDocumentor-ReflectionCommon-63a995c/src/ProjectFactory.phpUTFi[PK}!(63a995caa1ca9e5590304cd845c15ad6d482a62aPK! @reflection-docblock/4a69b083486dbc03314e937e5613b9afb9863ebf.zipnuIwPK #VP) phpDocumentor-ReflectionDocBlock-cd72d39/UT|Q^PK #VP5 phpDocumentor-ReflectionDocBlock-cd72d39/.dependabot/UT|Q^PK #VP|j:? phpDocumentor-ReflectionDocBlock-cd72d39/.dependabot/config.ymlUT|Q^K 0 D9nscib[Ÿ߾ΧMFH3ِqT8>)R7%V;J2H3ܒ@S|]L3\ X};U[  Μ#l 9:!R3ɎrYb_+2Y?PI*^ofFzPK #VP1 phpDocumentor-ReflectionDocBlock-cd72d39/.github/UT|Q^PK #VP; phpDocumentor-ReflectionDocBlock-cd72d39/.github/workflows/UT|Q^PK #VP h;C phpDocumentor-ReflectionDocBlock-cd72d39/.github/workflows/push.ymlUT|Q^Y[S8~ϯt;CF$\g­3 a[Ulɕl}$qLh;<$/tt]BYbDh( b!R4vQH5J-NR y;J]Z6Eu9~sQ>̹qB40[j D$Lp [bj I;H (4Iht<`Yj;I[:I-E=Gmt*a`}Q2 x¦ŁH3JӹG|\݇G7.:GF EIꔺIM+ Z"Cla"tD%0f)bkޏb369w6m,"E\8"x>b"oB}QhGM+lLݠf|([Z:;+ҌQ5+ȦSJHL2Vl-sqE6aook`p8tOv'Qus6n BGB A@3%!94C:EssJCm>`[!8QZ0gIhDLT| ެW%Pko:^_L[ҔS&rDZ/sǵ@:lՃ:4:媲Mz߫? +iFՔhɾV) 6ԌGXM2ZUA?b0MI9|&_xN()w N#$nڮ]k#xcksdMS^0C0lՒo?!EO[׆BAB[kJZ~W%ɴܾzr[68-L R>u KڨGI!q.;ŢUK4,qC`@o:7Ƥ\97pVlɛxve$f*ߢۢ VWf.0}jX8|¤]Cʵy=)$y`CqilғO˃= sV~$h#acpB&MxHdPw^ hVY ,z:lx]?NA$7p:Yǩ)ȥxyE_-]Vؿ+<ffHN3_!իed ) *#A4~ ]o"!Y8ܥ:g ffOb)Șa>$[PK #VP|80 phpDocumentor-ReflectionDocBlock-cd72d39/LICENSEUT|Q^]RKo0Wzj%qo8q͑KpF;CV] { i w{ Kmr>}??AZxmFUv:dwop1.d-=}3lC3N.6nthag&}4|ăηco>6q0tj%sɆ80pc;;^h|: }y7'9ޝ#&%m&㛟 a`PSCOx[Q̥ǯN\`4"g:+6R~~9 ?3Xjv^}DW tUo7;{[QD!]3O36%VKZEf";^c|FZK^n,J,\ 2י,as‡,#Q@7()j+NW̥&l)MIKCŵ:T->CRK,yDV́xsb|5TU[-WV*&E.Th*͹,x<E3jJP8~$*0A|nd-ZִVEh8f+V _.-k9by/{dPK #VPQl51 phpDocumentor-ReflectionDocBlock-cd72d39/MakefileUT|Q^Sn0=n&(9VB:$-mwlVVrgƞ_o%:=9JZ{NVeWȧ뤧]K!Rµ3po@ҹ Ժ2=S9x,!7yPs]QmMqV*viaܦݣ]B\09ӫڪ>Lg#e__.PqkGOr׹؜]b,so9pFzL*.ɠn G[!ɱ|m(5_ST /@$.rX_2A-Fq(ze3eMˠyӚHHr'VAkD2DI-I_nO7աnTdtHeYgPP.'[`,o9>qYY~=J~PK #VP.=xc 2 phpDocumentor-ReflectionDocBlock-cd72d39/README.mdUT|Q^U]o6|`;b)c.I&=4@r- Qb#*IYIN^ZئWt?\}$el!m$u|Iqu5n#ZN7Qsݘ"mqݷ1`~+xtEF⺨/uT6o()sR+T!m|+~<.l~0+2,-~-ue՞^ = !~HPYqV Ɵ28?d9&',_K eЃK mD)EGN%X&Zdb)W>MIc43pcDt0{aʾam?$ɞ ٓcW7&m}+?Z!7 ]^9Y.xƒaK˿;>~ ^2o~A*&T"jq)Y7K G5τqԵ6/R(5YJKܐ3VĥBTPU)9xUlDe)3IT؂n!>g=ؕq881"ʷ[^d_w5xqRbUNBӜ7V%$3P(>"W?PP$؛ ?;ߘD黮VxOͦ/' $`?<Ra`܎)ImO["xV k?%KrЕ/k2x\Yq \u* 5(oJQ heY "-<=F|L OOO//.?|?w~dA_EU&WUwvKƖgG\``tI!XՀO-)jK0q}\Kh+T*8G6bI>Ha_k'IL[+]`ZKEl; SλLd޲녖ퟰ F="VN8k[91 R k,,9,۫'kn?mt5BǩM( ~0|5't?3؈Px`QeWT5;ꜿG/*k}n 4ŻS2vM p3>^|I[rZ=K  = Wc4~#%n,;)t/Zf޼7ov61zP%O@&gR (Ub]#Aۍwi)1[!Rr0Q.PK #VP}A*e7 phpDocumentor-ReflectionDocBlock-cd72d39/phpcs.xml.distUT|Q^}RN0 +'=6*Ie;{c |IdDƊjCvDa@i{h7ބ{LD`reXRc)* )9$BNho$1jAol(̀._K,HcYv(b9L = Ը2g^G!}3ɡ7ףɆ70 *@pOpI/BNoj\[MmC X=11^u8oI.y?K'3~<PK #VPv%w%5 phpDocumentor-ReflectionDocBlock-cd72d39/phpstan.neonUT|Q^0 DwRPwC/`RF$v䘶D.Lx9Ywt 䫠"'zDX8ĤV;ʳYc2eD+Mk6ш (EG 3/O">8A2F1p׶jӸ=$MgʼnLN>㮝(PK #VPl[ 2 phpDocumentor-ReflectionDocBlock-cd72d39/psalm.xmlUT|Q^n1<^RTJ[Dj\=zV;BU# =g?ftz8@7jI'1*̸ַ#(<ߓc)WUz_b`0?^94o=ESj9]RH&q|Z\翵86-ol(jZޓ)z'9٨ t`5uKy«]`kd]|$W-Z\*o؎zcϖ󜣞9w0\;.xbh K(kA1XW!f,!\EՂ@@ԋ|#T>1 ec E|/12̧Ԍa/̭/T&[{mj?A";so >߫ faf|_H_[w$å 2"lDՉ`? )ԭᴉ41@þBHf0{L[:[A_ xLja_c?bGSbjH$+_O?'s/ajJA'P9'0ṔywZlqBO1 '?O0|~ߴ^d[5<-*n_82S?+G0`p,%OӤV2Y#C{S[tQGV)' ԔqfdBP([yuZ"C>HwIs+0l:/>5$O!3y0JB=\:~G;` 5P3O=W>;Y }4usfN`, 6/UD5pߣ3~[.>sMGfAIf~"Q>aof+*qyT:8I+%v89i*S/^έ{vG J oiC2[+qQK.~NN$a?iHS[ Z8x ((a3^fjFOPK #VP6 phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/UT|Q^PK #VPO E phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Description.phpUT|Q^V]O#7}ϯU&(na) !Uv x2.M^{>B:d|}ιs]ԣQRZ8ouVht|x8NTߵ^\`W6+Uycg0#Kc/ț7V/ /dRrpQƮצTZ=߯\| WҋGD)EU&/\il(Smg?c$tfǣQ%WJWyRkIЂƽn~#n~uye?]?sY/\M[VW>c7 jBj)r5oBmԶQܤB7+n3ƥԕh=`MxP셧.u6qЕR,L|{E9XHUaLYR >l0̣## a,̨`(o=(( ny98mL#MSfUsJSZ'eT®]&US`Jpا3ͥLAL\ySX_4ZAlwjRwab`؈1iobr7TT9DBDPۜ *z.~ӀtcA2 ܚ_Myư6Hưom(yh?͹SδM_rMK _9Ԃ?ǹt:kPr# + !~GW 3:4LCoײ q&]_|q33#*CB[fvj^̀FVPA5g_>tx[J_2~NtƓk}vT KU)+K`w{dDYSlS*7E8Ԟw8IݖbC!_=TE_ggѣ9nPY s2p4zQ q$3`JkJ\Dڂng-4[Kj'ڻu2sȎ4+]f1\ c%W1Q,Ĝ8Q}߉QȘrc}DŽR*X8-Ikߛ0ͶBc]ZIؾ@і2)=/H;iw"Oc1rt~&aL{S d7!gv.2zC]w"]ϣPK #VP k vL phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/DescriptionFactory.phpUT|Q^X[s۸~@Hr9޷qld&Jm,$e$HI<r߹՛|*JdF,tTޔ\с8_ڊN\0 MT*+M11:)DTbQ%L.ݲ2E#YHeM6y$Z]quI_XI+bMͫRb%v 5U)0U-E{߲,chj;d2U6QaE-\3&}%SޙT Zoj?a[kUm.@*믩<^UZM`ꬷio 'Nt_X-bE&7W?~zO7~/-J )2@⽲Qseŝ~P&^ Ե8MLVQ`KZZDܑM.7KyG4 JĐ`ҵފXdSyUNJ!Q8dFXYKKbQV4ıZq[,VŭHU4qmRk <(pdla]p0Mža2JeT>]ln?Co/nEHtnpU)t)IaVQ`YD'BOQy -VmvXX #cFh1nMA D R.jRiptq9`c5Ѐt(k| 5]2.}RHY[򆌖L΂U H3,8w" 1uٛ%=pIWa#4XޅfSε+ֆH逬_ߡ[@Ŀ‷Ll􎽹BJJ" 4r^sDO=)ϴJ榹6 D d= }$ƋqUmʪ9#15oW`KqJR"D *_"CG[*{nu^9jhڣ\?GrxxwjU1:X>9s_ǁ ֖C^6]"tφb*?oUw6H].IbVbҫ b'uJsH:,#1LgCzxA^ wڿw#?Æx03W]p֠wr_(]׶_] vE։PuK`~uhŃ#Pf XdQu?47 Uk%Ծ5YP)"lR.vFBG3iX Ӿ342@[Hu \ñ8??GH}'m!#=Chx_R"5Q5Nơvd=;zfCo鐐VK@q8FTSM嚓Vb /);.OrэkΫI m]ih?Th:jI̶D'7iyd h{7fm}Owf}vg9MNِ]s,M=2eiԑ.N)lE5%xKnLM3JhB՚He+\tE؛-~w4zs2~3BO d6UJiWގ%q'<1{XHŇ:Mt˃jHkPdJ)Y^0RjCRY3G}'HMМޯ6 r}(W#'ӓˆEW> з8u4j0p-Ҟe h 1=JaM¶yO͊P rWfkW/͜~i f`"5kaCHBO}[֑foCi2}mS%W tp{3NI%&P'"tjJȋHT+[Xw՟c; ;Uꡉh} r`TI=q;1f:[[ICh$^hB&~ֻE7>;<BRw¤x z{G:##ɻX8,0/NvR ,!\3-hImO/32eӰe |A-R} Eũ8^܃PD/`@d2~b^/bkz5 G~0^0:AnVj>ЅY&%=+xCG+8h6OճgZ7T"ERЋ#a6}盇d4dJ cts"hQ0#A+rIXΌ{j_ޡQ.{(}x-\o|"a:F 9 Ɉ.q/_[\[p_7њ D4FM#)8,3~1coOH*"ߵ 0n,)D^4#2?3~!MT(FqȧoXμTnGrʂKQ&k#bp&^ٙ3.˯{֔FP2u;哈;pStCV¥2Jd;+cd\rcoPB 8,Xu}\J&~3Y\/#O8Wm{ls x,!RfVT%EkR繩kal]~ʱdZ}59SU?me4A4 u6+)W4SlBJх Gx`LvӚ10;͚ 4V.Yh:I/P0wGhG]*rBY?iq>{šD q ;yl56GL]s3ߎ`p%+wB>]M0K 6/ԾBs5 ' @S>EuH:Apu1ɐW]Gц/r&V1" YoӲ7o>Ƚ;ťXlo2rf(uOczhWIAӟn-^R?~E~MӓCJL6* ϩN6@!֢iozwyI{4Zq2~HL++mm_"RC7iftlʾ"qF!mdž a!%s |A ^e ?jW kY Ե:e6ۃoAzPK #VP6R+SD phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Serializer.phpUT|Q^Wn6}WL,,b߲:i6)v-QHt(uV33\|2hA=D'S0/.&p}"!NR ǀxXd).f5i !_E+ ,4 )\dD%cp{yu]xjO QF=\$/DH1PD ӄ=^j>#θdHFeNФW4)mPSg'靤Yܛj R/v`d.T'AsJ{Rp7ظ@@Ăg8x?*P5Bժ<Ӆ#´$Y̴R E$Mbu`\>VkMc$,N5*L;ֹ AtSbUHٖ z *PXF0[S}Oѥ'B* 5)exJri #y0f(\/yK0.MLCuY TEv!og>5Ԅn0&`P(պ׸Hf&X> ]i4WVp&; \ +;Jw@MCܟ{|1pْ-n{H\oklZgxD4&Ec :DbgF{BEI=E=`^}Q华x%;qX+JEWϮˏ]@gQaXXKm-gօLʥzǢ ʢ%^^S~h_z|Qgʨ(IoOC#jxo7 y+Fz}\ Z'K8LwT5OLJ*1w`b6.|g$f-<Ԕ8 yia>X,+7L& },d*VZ%'iA3~kAt[鋛l,h KkEFP#^v0q]YF >Q$ף^cfnvo9l݊a ΐv֌%3 rwI̒)k9;vطdmz m5wפҮ`>mm6dDH{(({7¾} ^aIl-ȖTh\\u K-GosAHv6SRۺl|W8R7[9[ z;EyCʺUҾ[94+)` 5ǦWC(S{ [ qozƴNm'3Rk6KvjM?'S >t:0qWn| ;(*w5&PK #VPg .0L phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/StandardTagFactory.phpUT|Q^ZYs6~@RM#GN*qۛ*q  Qfow xV6b_Y/3Hyv-/'/^fj6O3SsKߪ\ YȐBX 6/jŲ`\&,Kc!5sx*9bLp1ZYb %)j7+ MZ, U%iu,tLT|<:98|%Ò+1D*Mo2?K|Y |N\7|geT^Kգ^Kފu.bkvz]Oo8{f{-} р]'vjZEW著]>O +Qk͵h{S5%^Kn1b|?It] y% 韠 ACfiE|+E(bR@Qi-p^JZxJ DcyoV.@9/WJ#4ߤZ`Te\IГp0H&6V+- >~ę*.Ab4* IηFߒ]EG<ӊaeN!y-G JˌX YV]FEaMC>5 KUf C%rQ'mu?ݎ/!w0B6\Ί6o#bZA$èX˸ߩ,CJh( ġ 3?Ri "TMcO bX9&8O%H29_*կ|ί&h5iljd wtpݺA-5̮&Nus n~ P,䗤fx ~l6~ #cI8\|~2(yb1ĝ0z%]#V{m81Ny^u<&$&L$6I-ғ68:v~3;Į ㉄ZVτ9ј&$  AV!짯`AY#&^$J 34PhɎ ~ h(k@@HP$P bcH6zA|ˡIqv_\:qampށc{)`% F6(WU0F440hF]Wk.$Q[u޹UA$Ug +L7Z}F @ b&!A"lZ:)+pYk{YNn/! ^ ^+%aܘ mrU,tg˜3j`a0SSBsE7TNl>wO:'"6fj bSJWX*B/t݉?Q=)"Rkb2ݬ A0dj5wZ`4*ufIV8 zj^ N~:c5c6FћTOǻTnOJ=%pczN9Kl /h-Vؼgβ D/@c j+8>#,F4KU5؇$A'+`yؗպ:bKGofBJk4My"Mbop aMYI,$5.]$2ʞ]͸ , |˜24rͨ_<'.􅪎"W)j^D*Xo ip uշ[PWB"oh}@9).bP͍Amoܮ}Yo"zJ!B2?ݺ[]hG' iaL,g~RaܓvǬ"f\ q)/I S١ B57-0# TV2=< ki.^u5>h-}JMģMCЌx̄b3fjuψsst #fKd[t'n2AjƂ;Ri3`uU{#pSe<l#Nwxi +M&Rq6/E3wuzRۊpkDz,tU*kDk7]칇?:W;JPudAvxtLX-6U &htV'Z0pcQAܥiOO_ QlG7׌ 洱|[%`_1fRhZ !rGlҁ;&m\8h߃V?1畠SO+\2082'L4t.܏Q(!$i6+Afn`KJ]9C]t|:/PK #VP1l= phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tag.phpUT|Q^RN1+ IH6tۦNDyo潗ޏ|Q)hE+yY'JG(A@ `SM\3,!.UEc (wA9Fa jIk%4n[x2OҨvU`+#:[79l5Ua-5A!/Gv XhT߅Vdޙ+Uҵqj4Bq9m}iwpK|7k-Jktaɝ-m鰝|ݏq9*[#UG0a N0NUpv{ui 1tFGpUC xZ7PK #VPI41{D phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/TagFactory.phpUT|Q^WO#7~_1:!zpT$ʵG{A]gecomoBt7zw@d3|3y.(Y%;oUZw?F'#:iU% ̜'5 ,ƒ/%͛kғ9U*^}Du%-\}7WwWl*rf9/Xil&( y#ק''lblO' j->y%3*="nRT*EX{ɚםZ2F{nqLEq-2^WCsG ll oIN%$>2i  IilG|+Vt[dV /ߴ{h%IT+v2{0To, ΥΔt 4G-5W7'X 6Mδ!:&<NJrEG؍$m.Hۇ4 $@gh D!v[R-Y箬#4!~F`Kaug!(͔ŘĔC{,,H>v :=3 &W䢄j^=6c<7L~aCf _ؙ LKj]oD|L#f)U9BkOWi+>Ƶ|B=ģ[73(!RHW}@4*llF_sjN س5P`O(BNcֱy.{Q~V59̥ˬ cJf ,3 k}iʽt3GV7|*S)։ecG"<}yGs#TWmy7+e˻TQڡ,QV3}'Q!:aa eW#B$ˬbs|-_X1Oc+L4j}lahpV< rl-v&L൏댁m%"GK8I"Ї5yF!BPXb~8ZǞZTk . Ò,i+p-By'ՄgKfo>qA5YA& ye|CC hEzdߤ8\i c'BLs qՆpgoJ kGpf C |[5}ڝ>+(mwsATF zbZR/Oƶ%$E8G𧌴"X9oew]:i2͇+1D/OondQi}ⴳ& 7m;?~.஍^VTӶpޅBM/Zl=PK #VP; phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/UT|Q^PK #VP뒊E phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Author.phpUT|Q^Un: S@0;E`lٖ]n.Pl&HDQγ'9ĎK$}H|y$g`dȘA8cRf΅!K`w:.֨H9+mReeUJ TQYڬIN PFP5Y@]سCۇ_B֣Rt̊]CR7%&B 6uOP՗k̼PB)k)GӟWhDRʛt4` Fl-wwuA2̭}@mxb15:Ha_QY ]LP +:xblD|#QxQÙޱ;{p,]ݠ+LnR\DJY@$'SHZ؛S;e{>yҮGGe]qLć1z! 7G~iTL!=no ;z;&mӾWPK #VPDE phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Covers.phpUT|Q^UMs0W %HJLgJkb$WN{Wv„Wov_yGQ߮n7gSfS,,$lJ+ŨBsb*8τ||8X+ZDdk49 4e|VJPp-r<[ 9y!vQ#ؙJIE\| ?qV1Ťr3a+Tyː{ ι"],[(@ʖ}ߟDH WIZP.&3&˸(6Z26Uq7 8diqp%UdsIy#ױJ"4&J&,h/|r(fWv^%y5c@+=@Xu=a8܎g!=FW&]=@_\+[iYRś.:~NX8N-a^w fTh&< C0%*Rٛun7/{pG<=CovKwW!aՄtڃ4^Y6V  uN$/Cwn-:!]}oWnge{ݮq( bb^/47M ֵY8$JbWP֧15R}tz +}@g0Y(c~v{WPK #VP,x&| I phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Deprecated.phpUT|Q^V[s8~8e=#YB6f;K3;eXI&i{ϑ/ mz1ҹ;߹?&/#T̲z''|K~3_(-K]T#͏\0$g{7 4$X*EqUd lmx2+} | aLVb!5B,JX@<tkSa X0܌c8snDRRp:lÎ }cAQŅ%RK]lyG1+ |E՗Jb<2g/q*zn}Y.F(ennFAv/Xx-#~kS`8vHQ_3%N N|>eZfE#HS,2$ѓ8e(JCob[./3h΋Ѣt#e@%Ztz.gB߇1>[PK #VPɵ+֪4F phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Example.phpUT|Q^Ws8~fzN)4ӑ]t&tBoP(#l=1+Ihv߮V(tB$LrOiz7Ww>GepI b x5O}#K!AGy@ WOHBEڃ, nc~g]?8 Uƞ; "(8&Ϸ3[ap ]^}eY2=k!0U77 ^.mxX6ox2L3{X7NߦG7}ZU/T~i5@wUƃ^PBf ;;Υ'3SJ-C[NUӵN,Nzmm[m]k@ޛn@5i3)CR| qnM]=;ġדWΦqE o|Su쏉!5?xza/mQݓ<cJ|xbG>괤q Nc:'D-7(E;Tx ^]Ck/uEsk;Cu7:5^OTsPfz-ڞTM)u,#h^orMo7apwN- fjyHy4u2T'L8W-]^,H)t&UXbQL Q9To.c M(ގ 3B# $&V1cg9qx򫪜ٙQt˲&yr/$ {hRNɶBlo'|H|Ջ1V7PK #VPC phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Factory/UT|Q^PK #VPP,SS phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Factory/StaticMethod.phpUT|Q^UMK1 9xEv zp8 63-iKui›7ɓ:(FdL*z9b:;Y,,`kl:LNjSHK:$ O΁ qNv0kpV\!lJ5nYRIp-tD`pYrBnY Q%.!X\48ֹ秇|4HQ&ЦgB ;%2_wָ²mYjcV'?'ްWWV}`G~SEOuD3H ٳ%Y.t=D T@*.3(2QpvRVC/2bhkyo 8*vT`9,'ڕ?PK #VPE phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Formatter/UT|Q^PK #VPx"W phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Formatter/AlignFormatter.phpUT|Q^SMo0 W N8Y=l-Cȴ-T N d'SlA=>6U$9J-}rHEX)n#pW+ YqZȼB(ZAfTYVgSXW RL(8Uu߾> PU`'<*۴9U|\mDnR+TD|Ds+3J'5Fp@;egmQ~u:vo,[=u!TYPvؠ 3Yz*TNw\r+8OCSU5(!x[RBA, ĈS5=X|AX_0b@JCcm57"P>f=f߿.JJsbuNc8BVv\x䯌pFaf7Gab3)أt2tsK:}W-7:|B%>lyV :RuX*Sy/ǐF-x*8tn/\jEoKPK #VP e.q] phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Formatter/PassthroughFormatter.phpUT|Q^RMK1WAūǂM0d*$Jof޼y3o.B8Nw Ώ'B4ө)i3 #[o:qưH#tZP>|EkZFKL:IƻC%WPy%J&hMQȄ- isTȃZ*}@ MN^|)HYaEUt9{m>^i϶;JW]EaOߢ_+1ݔR=qo̲rt !U"C.'cb GSߐ_+Ǽ0NQb33]`VG=1pfCz]kw Uͬ Ű;3|QQ̅y]nG:\4S*Gw!rddF[~6|,)vV2B+Q4v-2 E6 /wC|&V_Bw==\ؔIr .?ujsY 9+|֡^ ť*ؒhqءMAɅspI@P>T(!Pk NJ~E41p~ZX)\xZcѭq@ aXzI^W.XDP?M^˯"\?ӌK%LjڠnFwQ.eɑ'5 7xUB&HW7AT/h<ZvͼՙmC*ӗMН̓X oByAj'b1_s, &\t}rBF[$ZU_B?*`ԁ8̗ ~ *8Lʹsk-N 9MꦮZUzFk>ӪI-f[xnV<Մ4W?61%Gmg;:xuci -@X|.hR*ՍCv_|lYdT_4`Ն8jƨ:aK'v/a|?>On&qi'ui&'f3Az-9 L܁稣O9zui^QN!]_H]GIB>9wީq^j_PK #VP$]I phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/InvalidTag.phpUT|Q^Wmo6_,yپsҵk E,4A'5% $ewGQ%^/ɻ{!]*F $) ӟ'oGg` .oZN?!U 3WZҢJi}Pږ_$Z|P%~P}ieUCƍYƋ-WQ+7}%h-w X]޹3=Nj[>?sFZm3j!]A&[dn%86<F &2 %熛2`΄6Ȇcv;B-Sbv"<5JȬP;TB[GǸR 8 9Jf[##hpM%K G[rksD?ȍ_øgNZ[f| ,yV Z`6ZMVUN*$/ %eTr@.tW }( JڡhA+a+*$SFazQ*1H~7\@1\XV݆F=A:mcmvFѹ^Mh_ŵ9h6JgJ`ֻtQ;Nr-ĕٴwHztXyMC9G;MLdn]TϬW6v3火NtÚ`}@RxQP4 WTf+#IpΚuU3PU3s䊛q/h;oStvQcwWҙw'=*&쥤R/cnvu0y[Ayy,zaNy5bOd2adxr 0ݽ!H{{IðmJ7z\5 z;r6sчW[܏PK #VPҒC phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Link.phpUT|Q^TMo0 W N&{(daEmdHrt%+fjlӏ#ů2/(A^0Zp;sE` (Y2mA@W VRi9BZpU.r L&PP*`V(م@F{f|B|6gD8vbUi(B;ȭ->qL)ѯ~I@S2rb?Ŵ@(MzZ(~7P *?s4\?r8xN.3%->RK 8C]|H1~?J8Pjf,(I4 &!YheFk|7S!YGGxAs?6ݽGbHӶA퓴n>GPK #VP2 Ӯ4E phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Method.phpUT|Q^Ymo6_$Ӵ>MMiنv ZmhT/EIQNU_lxw u8 /ҘOvMq9:>m0CI*JNIf eP Y_ђ0&4bSGNW1XWdX@ J1Y-6&kAZ>,=aq(kXG\FR<ќ[X>Ā~}$GEӊo2[!o#59/sɆpQ+2gܮ3g4]yGTDTpYL!<3hXS+g0 3t)RVd`?ݝݯ_v9QҗQ=OsiO V C8. hcE߹ x:XH9Fr+:A| u% WlWq\˅}漧 }-DbH?Tz9XpXoj34kPL%eٴxHJp_\+Mڈr 491!nX3@CF#BH7\__в`]GG踏rEaE 6˔~ƤzGT Y] -tJ dٶE+KF_6^eŠaf G@V3G!Tj#`: 8HOYJzSįK @v8ߢx e)sf LB Njb"$=p#V 0BaOv&WpzSS{uT``r3lME/ 9pJfghxK yf7o1<ñLx:T]xZ y["y<OVg9VSUc>3vwb[G/f6fM_@on澳#V={.jrHCRN yQ=n.\d*Ldǡpťv (E D#rTE mSu6D秺0,Yu=SFZ⳻׶7BOI8Wg$nw  /PVˁuZM4H5CkX2;5ZGKIe::״ `> KuUmG̱Gl"p#'phQmkD>ۂO'ܗB ǓF.B4"EJn`S{ ? R$smh)Мi,i3y +LZj\ }$W=69^Nyiap-Tߵ\kW..ϱSTv9&e,uZz2.9nHN9,=P[_]ێ}5uQ`(@~)C&D-KWxV]HlJ6G$pՙB\_YCeGfig\rf(t)Qc傁=K_QDMFבڙ;4+^j׶vټ7m9 +3uU zOF]lhzvzGWw*G[W|Ka)>ޙ#ZfmqL| 탞 qhmYys T@ܐ,De .(EI<^S1e}9M3\{7k5l-N Ss^E*}?PK #VPD phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Param.phpUT|Q^Wmo8ί%(}kiJݪj{2ֆ8r\~c'!ɲy敿&*tbDP*"5Wۜʓq3<:<3'BO^XLq1@1-yHSxlR@RL,bMY\{btc\_LoZO 3nQ(Æ  Q(5e?<+p@c XȚʜ9DŽ=MRi\3\,%Pȷ_R ?rE"#: "T7$A/TѯtgRGDKwm=.2O/s/ \/#IwO󇻛i /1}>{&kPdq vN2Vg Dy#˯>c\K|:{PgV<mR2=xǧ:%GvǾ <=acBӘ'dclN=Q-C˽:^&jgD?nXx_yc_T9N@U_@4TѨD}tmh{bW-t 8$W~ Ra֪~wī!F] mӕ돸e m`e; gV7OTL*X];޽4if3K^lX;h*+r\leє!޽  v6z|*o*,^YJ4Ɍ*;&{aCAxG9om↉҉e”\Ja;}jgN;f 6A 4dÁCWx G phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Property.phpUT|Q^VS8~_7i.$=&p eׇQl9Ա< wWc13īlu:xY]C錎:p! 1e@ƀW/doyji^Jf!ΓBXo 4D-n>ͫr,|Usd5* ejhk')KK.rc/XD . |:?:TND/A7tP r``b4_a?U4,6x&9k,.u7L\VЍj/No9CyRwP"+MuClCڐRToN{6;`ot%`/{ٿW*ej= ݰᴬRƠyi?9PKAkkzڍ1 +A1]*^4S5ZCS͎7 > g4窎Q^-Dv [cxSZ.IP{h-wz6E^ĩ_' EU x7'm?x72O"JB12reWqPhƅ\k,QϏ3 8ۈOA,~00]1 ,xPB@DCpbdQ*EyXWU O_mݺ C;'Ŝ,VyУfsT*=#s]"'caO, Q\swk@#XWmYSʝ]6xoQ.F޻Mkg+jyr={1_jdFՌmg̺bkPK #VP׺I~ K phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/PropertyRead.phpUT|Q^Vs8~؛ah.!iBn2f2@[M^J[IsCj8dVÄ)hDhfq};j''-8FhEgL1k[F7Rp$Pf;%, !O5Hc K8C٣O~6!S֟0OLC$*7<'a6xXUQ.~lɆdؗjV+e[3S'<$\ ~Ld}1gk<-\Jd$+7,D/n19oPr-GޠW25̒1K;-F'yt&YI3K%I]+;a(Sma:k9{/'wWIY%jxΔ0ݩ,Xx(]}[@HYR|(.LIIi$,Qȉx E3~f#֏U*G(FK}!&hۨ!*X=WX%˥eA Κc Mmg@PV)DhGѵXz\ CyiSSEhիPwMQڶq)U#"ڪѩmJVCixp'v%] W;9DǝˎU:aiY. A$~1YL}wtJs/aWKk;J!=7KCĮt#j{ ާRurAпwSgECB_( *Zv:ۈD÷ni(sLWguIʀ?DkAI({3Dt+/I<\_*!>Op&14 8OFIDIp*R4FZ&\b7 k%6HAug)5<m@~Mж9>@S#^`-! ]mRsaeV*y\We5O_M jC3Ŝ,{Сfs:T*=#ks]Z'caG, A\swk@#؝WmXS;?m)\.ukg+j{z?\jdLՌMgغ7bkbOs'PK #VPE} L phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/PropertyWrite.phpUT|Q^VQoH ~W${SnUaY!hC&Vg i>xlg?':k"&L@%B0fk! 1e@ƀW27<5RQ4IvJXA"BjtRm2Apgrz8%W>fLC$27<0kc+y{H8&,D/,gXwKzwt{ȮҟN*ua'պf.軣#T;xw ʁX(mq\ƾ!^8"vӵxxx_fC+Iu9t\<D:)Yப⫱ө?>$}V.2*ln||{.IP-( >@7mڝne>)Oϔx%*HU xwm?rk'!ÉHi3jeׂqPh҅\kw?*QWq6%>yǮ6~M69`_%^ 0]JI?:| 5@jXua( cz-u:!nٟUԫY3WJ$ӌp [ˠd~ jew'2-L^y$_ NY:-Lܑ^h%1ٸ#4P.O?>*բqp#w <6AgQC@_zt-@=Bgоg $ 4hPlkqWy,U ;%:3FҤɠ8x0w?AgөlT)LQ wgS7,:$!O)Sr@g 4]"jz-=:RV .Գ9b&(5Maq$ՌpJ:k "_a2 +=x9LJfGCy?Л |2ۓieaYFc%LY~PK #VP˽KF phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Return_.phpUT|Q^TMo0 W` v&5Y_6@(2 %CfE(N&:`~$uZueK11V nv]9Nhtt a %=k-(JBi!o[ MYWZUa JQ*!s+fP($~y}{J~`L8vbh(Þy)#FD4S|ޏH M(og%rkNыR Cc>Bõ]p)7j U>/B*pnۦ>RH7cpzc[ E|B`z6Ze+ҜBDazr!Y٥y+ʌXiȀ#-TFNYvXp%1 /;W48p`s DZ];gݷ>Xb-Z0efX*{KdY:zN1ҔhU]I%zb'g]%}nڀqᓳNNMÑOlO K7_v& ;à/ R€!$mvz=/PK #VPa> B phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/See.phpUT|Q^Vn8}W Pmu6uz P`u* YDiR%xCJ%q\ όǢ,(ʐKf0Vn_|:,3)\Hz89;ͫ-*͌Լ6 .Fl Le GeɅʵ2'B)V.U `,d£[W3 W a2)PwP_p' a4i$ۢ- Ч0=o_Tʞ-7‹7fZzd *W FaA_Ӯ~o#lZ-o<{YgͶ6[ؘW}W*fEtű[J:wZLEb#}A^rl FQeoɖh3+o:]:jBg!pu xwťю Gp c2&f;l?(ں(Ys8Զ]V+᫸M),zQ\0 Nt3Q_貃{OkV=D}6C 2q)h. ĹvWS~Xwv=&È7Z+(M`eޫTM\iŏ4DRqߒe56ՁgGk={.H5Z><űjUN0-Mx3.S>)V&&Ϟ|֭|59@iB]"|u?O&ǠEY_ċ; ^I~Z}cUWShו:O c ^79 14 }P.!8j2jo'G5PehB!PK #VP&8 D phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Since.phpUT|Q^VQsF~ׯR "&}'3-C;c9NiN&M{/Bw{_ŦEY(#H#Twe z= z0ߤ4c" xG #6 2 ^덂0!K#K '\lCEBۥQy4Jߧ6PBUX bËbv@pQb-E~)K2w3=p-/DZwFh Fx{v= Х 7nmɧ1o!L!L-*W_KkL^68|,Db[.ZTc7hNuΙ2ԫi#u_PK #VPtWV E phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Source.phpUT|Q^V[o6~ׯ8+ZnU4- dPgCtl Izm)ڢdiQAy.-EZx^q YԾ@97 <MIXg9H(k 7<.#Ӓo"<{mRK bdL5He 1]F|qM*GL[ TJ7ERH< 3 ̓*ULcxņǞǢ-""F1ָt:MC)G Xd>:"l+d]g,ʭʢ$4 )7ZkKHq.j UF8b йfm[+E >aoeLQ"SA`Nv7UFXPc/1E9fH!֮XǯLv nWv9vp`5l1bY b)-~Kj154@Ly'B94Ŝ,u.K|`_AAJPWyXhC>^|TQ~N nPd2m:f#nxsU(hJK̍YCܜs)whϥ]^ُR]Grz+t:5<lj=g&A/?*)#PXuG*$sQW5N#[85n XʁN}? G7ЦzFe8uEj Ɋܞ75; spMamW-N|hzH{T{9*iP3`BUŏaWuޅa_sjK3= wH tpĴbL縈9@7)Yz,FϾ@7uׇ0$O,S #cKnGgot%_A VuPK #VP5rJ phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/TagWithType.phpUT|Q^SMO0W̡" -tJZ@살im\gXvd;@wiiS'y|dtQu(+a1q*F7fQ4<>KP=ka=(7X%BTHSZΡR0v)2zu'!׏?9U,9<+_8XDVe#Sz_ $47هQ]-(S %zU8 G}h'ԯ, JP͜j]`h@G3!G;F\2 .D2Z[I,حoxR7V0sf2*1!`Pw5I^0>6y;=W^Lf]ڷj5@=n15+6\l?` ql پLǐ^'-_F0ZmH/KRll3Qtu¢$$i! EuuxOUNvX0Gℯ _,HD~?{ &{ D9|ZEu|VaHڿ]Rp4f'4褚muPK #VP㐴uFE phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Throws.phpUT|Q^TMo0W!*cn-R˪2΄X vd;e٪c;)TˆC7~|:IrӘOvU9%$@!*zL[PPUO0+ D(9T4TBJ/JB]!؋֕l,,\8vbKaK:!.F5#5qSZ["+WzN$lf3 5Ut1ǀop-jʘqB9!qܣQ #fz?h!g $~377Հ\d'doji9iN!0sC jS&IMQeGq 8 >X2Ty8fF"+Ii|ԙ.46g ɲ]_-tO\;wYΠ>\-̷)[d۹Ff1u 9t&z; œv߁;ֱ)vPԅ!6uCf}>㴆jōa>-M9XT+.nMw*[ig;64FKI gK72_~v& C%PK #VP8C phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Uses.phpUT|Q^UMs0W %HJLgN%y ɕ$ޕ,lhI`yiy-(LcX-ufp>QG0Y H1mA%@׊+V.ViK$OS*[kXZ`2Tp(dYd>_n7g3 n[I%=!-F#mFy*,i*G(l&c~:$E$M)z*0=k4\O?qBd2xcFhTv+ҋРMWg/Q]Tsb$ mU*׀%iɫ<, ӤV·T`RU]-|_R4oeV75z UO{6Bkn {,MǾh }YW9_;eڝݓn{٬q-cb/ܞko,FS@;rH[io!gk,c+kf_'{<[:]hҿ "gP7_?PK #VP}2|wn C phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Var_.phpUT|Q^VS8~_7il.$=@!0Cx[N4u,$Cs=ەr X^)hDl")>zッJhHEL) kF#T`V2 FDs*T53BC(2P(w}u>*kϬ'!nQ0+u6j"{(kƋC֘cLKd,FO:l+"GZ=e_k쁚~(i$ួ j:`u΅L6Ýtl1GdVj+ۻhE&yifl><ڃܠs5>fSa1t|d .\:Z4ީG@0s{8/!1|; }F3(pfEm~ Reݮ¥X.M=&[mG%)Sڂ:|o_ߎA6]pr/!U 5 <ñDלOvf'z%,8#m$\켷5-MkCa&Ϯ6d~0F}.ёL^Vʖ;eS .ǘ{YhJcW]{ !ZieĠ>tG5;z𤚊վԊWW;R嘢jzzBobxr«~&U S$OR>`%1/ EW(xTm7[n7qi; Z`7\Xm,dϗ/[&$`3\8ɂ̍(aY$ K;# `" ԚGB$p P\pȰU1:(/q;+#g’&f S.5 Om(V 0i|ˤzb>;L=Ja\ q%1جp-T!2=)ñCV^jy#I:wiw_@(<.tdwV_OLeMtiTnjib;wíWάoT.L~:)zo}MLՅ cm_3%sH74|N+̣dd~Ճ&fgi%>$WGM ˆ m+'>d!Ôgg_o&4N*KPK #VPהf E%@ phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlockFactory.phpUT|Q^Z[w۸~@bRzSI=vN > Iy[l; Ite0|afw<8YRQ$7Ӄx|@&dgIyEQ*'ՆU$*'7yL$b"?"e(m } E $NPe]<$z@QF8N8#(*b%%8~k; *gƎK呔ljy|@Ml%hu e&) 7mlI3`Q)y̖կws2qB3-R8ýG,Kr`gňҕo7Lqcl tI+pRzt@49>=2{'ݯ3 agOwgc:o#0mH܁8wٹWm jXק9!'㟛9uHjyG.VdUYN^d&  1nhǔe+=ڬk*{YdHAQ}7$qh?)  Ĉ/aC"H@HC40YFi%i6tL0̖xa&ĄkǘT:ٲ\Z4z{l>ļ / b>=+ߏO gNN&-3z;ə_3sޞZP\(`.$/.QIePFPmRr>*O3l ,,R,!\C&HZb}|8z2W&yHX`<= 8/1<QgXFq^!|C ENȶHʾ &*n)$UP{-y@p#n2QRhJ1x؎wlc8sr`x8'a'46х&E ڕNwM3ZS{H3f:E4@E >/ #_bv]@_:J]E3b8!55k#tCpɯ!G>_.x1b87 2c0[iZlXf-j X$Da)jUs,#/|{ CF{4;ލqN>%l!*IXJelA 4p=byl}*mԁînhɃ\,aG0 G*Q,F43VLu&y#-+87k'ʣv,oP?־ /ϓ@6pÝwYQLH౰AؕO`m8:{IS~'<0dR 4K2&E|uZgD-HE뭻[s:x uJ"B]r5b>hCP[  bBA)%_RI*]l#I _O # P"D4܌:![8?L_ *X텎Ļ `{0W SQPU>7T) (ƌv" !EՐ$U!3[2uS,M: f!3Ϋ$\-VVEeDo7z(Du$G,R{pfu\\хByƙ`Yq^_Q@%pv}GGPU(8Lߡ TssV$rYy꺁o4\u)0=ⱛ 󐼙dYya8 _}ǣ0]xߺ :xAfa@v:bzĽr=gq+d!Zs;~p?Y.YD9m՝%>VxuNdȅ@~(/YC>U$\IA(^ˈv%`r&MGla/UrVdb= 8; B@ޑ; ci8[CwU.eH3IQC^p]ԥ'_PHNQ܎~^7_KܺUG;ٕ}6UŽU1Y4ՌMI9*X FkGQ}ZdC{dsh״ \J*FU8 J%~gY#5};϶ڍc@P$p𱏼zϐ1ٗ_臫8ǫK3U5͂Ld)Lv #/ڻ$B u"^5n8P'1 ם\p5^px.i>:jǢ?HZ6ҭ\܎3]H&!. E0  i c K"_e@Hvĝuiu,uF'd\J> oPK #VP`UwI phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlockFactoryInterface.phpUT|Q^uRMO0 W6M\B8B^v4V4A.vg%E/P$ z赌*)̮{!,J s2d' ɨeP 5No73v42un'XpƥSVWå( ש$RX.SyĂu2}{L-BZNA< %jSM @ﱚ֢||uMy:@hG-h <%ɒm #钺͈>0/dy/kI}? t/>D,6.y6uf`1p :s\'[PK #VP) phpDocumentor-ReflectionDocBlock-cd72d39/UT|Q^PK #VP5 PphpDocumentor-ReflectionDocBlock-cd72d39/.dependabot/UT|Q^PK #VP|j:? phpDocumentor-ReflectionDocBlock-cd72d39/.dependabot/config.ymlUT|Q^PK #VP1 phpDocumentor-ReflectionDocBlock-cd72d39/.github/UT|Q^PK #VP;  phpDocumentor-ReflectionDocBlock-cd72d39/.github/workflows/UT|Q^PK #VP h;C ophpDocumentor-ReflectionDocBlock-cd72d39/.github/workflows/push.ymlUT|Q^PK #VP|80 AphpDocumentor-ReflectionDocBlock-cd72d39/LICENSEUT|Q^PK #VPQl51  phpDocumentor-ReflectionDocBlock-cd72d39/MakefileUT|Q^PK #VP.=xc 2 1 phpDocumentor-ReflectionDocBlock-cd72d39/README.mdUT|Q^PK #VP딿=E phpDocumentor-ReflectionDocBlock-cd72d39/composer-require-config.jsonUT|Q^PK #VPMBV6 phpDocumentor-ReflectionDocBlock-cd72d39/composer.jsonUT|Q^PK #VP+2 @phpDocumentor-ReflectionDocBlock-cd72d39/phive.xmlUT|Q^PK #VP}A*e7 =phpDocumentor-ReflectionDocBlock-cd72d39/phpcs.xml.distUT|Q^PK #VPv%w%5 phpDocumentor-ReflectionDocBlock-cd72d39/phpstan.neonUT|Q^PK #VPl[ 2 phpDocumentor-ReflectionDocBlock-cd72d39/psalm.xmlUT|Q^PK #VP- phpDocumentor-ReflectionDocBlock-cd72d39/src/UT|Q^PK #VP/qH{9 phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock.phpUT|Q^PK #VP6 y"phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/UT|Q^PK #VPO E "phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Description.phpUT|Q^PK #VP k vL U(phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/DescriptionFactory.phpUT|Q^PK #VPDfG f2phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/ExampleFinder.phpUT|Q^PK #VP6R+SD 8phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Serializer.phpUT|Q^PK #VPg .0L =phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/StandardTagFactory.phpUT|Q^PK #VP1l= KphpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tag.phpUT|Q^PK #VPI41{D MphpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/TagFactory.phpUT|Q^PK #VP; 5SphpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/UT|Q^PK #VP뒊E SphpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Author.phpUT|Q^PK #VPe؋{F WphpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/BaseTag.phpUT|Q^PK #VPDE YphpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Covers.phpUT|Q^PK #VP,x&| I \]phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Deprecated.phpUT|Q^PK #VPɵ+֪4F aphpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Example.phpUT|Q^PK #VPC  hphpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Factory/UT|Q^PK #VPP,SS shphpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Factory/StaticMethod.phpUT|Q^PK #VPv=,+@H @jphpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Formatter.phpUT|Q^PK #VPE kphpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Formatter/UT|Q^PK #VPx"W [lphpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Formatter/AlignFormatter.phpUT|Q^PK #VP e.q] nphpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Formatter/PassthroughFormatter.phpUT|Q^PK #VP*˾< F pphpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Generic.phpUT|Q^PK #VP$]I uphpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/InvalidTag.phpUT|Q^PK #VPҒC zphpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Link.phpUT|Q^PK #VP2 Ӯ4E }phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Method.phpUT|Q^PK #VPD ~phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Param.phpUT|Q^PK #VP>Wx G phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Property.phpUT|Q^PK #VP׺I~ K ϐphpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/PropertyRead.phpUT|Q^PK #VPE} L phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/PropertyWrite.phpUT|Q^PK #VPE phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Reference/UT|Q^PK #VP v N phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Reference/Fqsen.phpUT|Q^PK #VP.R +phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Reference/Reference.phpUT|Q^PK #VPL žphpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Reference/Url.phpUT|Q^PK #VP˽KF phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Return_.phpUT|Q^PK #VPa> B phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/See.phpUT|Q^PK #VP&8 D sphpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Since.phpUT|Q^PK #VPtWV E phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Source.phpUT|Q^PK #VP5rJ _phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/TagWithType.phpUT|Q^PK #VP㐴uFE BphpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Throws.phpUT|Q^PK #VP8C #phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Uses.phpUT|Q^PK #VP}2|wn C phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Var_.phpUT|Q^PK #VPN)7/ F fphpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlock/Tags/Version.phpUT|Q^PK #VPהf E%@ phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlockFactory.phpUT|Q^PK #VP`UwI phpDocumentor-ReflectionDocBlock-cd72d39/src/DocBlockFactoryInterface.phpUT|Q^PK<<c(cd72d394ca794d3466a3b2fc09d5a6c1dc86b47ePK!]]@reflection-docblock/8dff474b657832a5f4f52148225055696fe8e20f.zipnuIwPK a#Q) phpDocumentor-ReflectionDocBlock-069a785/UTs@Q_PK a#Q|80 phpDocumentor-ReflectionDocBlock-069a785/LICENSEUTs@Q_]RKo0Wzj%qo8q͑KpF;CV] { i w{ Kmr>}??AZxmFUv:dwop1.d-=}3lC3N.6nthag&}4|ăηco>6q0tj%sɆ80pc;;^h|: }y7'9ޝ#&%m&㛟 a`PSCOx[Q̥ǯN\`4"g:+6R~~9 ?3Xjv^}DW tUo7;{[QD!]3O36%VKZEf";^c|FZK^n,J,\ 2י,as‡,#Q@7()j+NW̥&l)MIKCŵ:T->CRK,yDV́xsb|5TU[-WV*&E.Th*͹,x<E3jJP8~$*0A|nd-ZִVEh8f+V _.-k9by/{dPK a#Q.=xc 2 phpDocumentor-ReflectionDocBlock-069a785/README.mdUTs@Q_U]o6|`;b)c.I&=4@r- Qb#*IYIN^ZئWt?\}$el!m$u|Iqu5n#ZN7Qsݘ"mqݷ1`~+xtEF⺨/uT6o()sR+T!m|+~<.l~0+2,-~-ue՞^ = !~HPYqV Ɵ28?d9&',_K eЃK mD)EGN%X&Zdb)W>MIc43pcDt0{aʾam?$ɞ ٓcW7&m}+?Z!7 ]^9Y.xƒaK˿;>~ ^2o~A*&T"jq)Y7K G5τqԵ6/R(5YJKܐ3VĥBTPU)9xUlDe)3IT؂n!>g=ؕq881"ʷ[^d_w5xqRbUNBӜ7V%$3P(>"W?PP$؛ ?;ߘD黮VxOͦ/' $`?<Ra`܎)ImO["xV k?%KrЕ/k2x\Yq \u* 5(oJQ heY "-<=F|L OOO//.?|?w~dA_EU&WUwvKƖgG\``tI!XՀO-)jK0q}\Kh+T*8G6bI>Ha_k'IL[+]`ZKEl; SλLd޲녖ퟰ F="VN8k[91 R k,,9,۫'kn?mt5BǩM( ~0|5't?3؈Px`QeWT5;ꜿG/*k}n 4ŻS2vM p3>^|ImhogqR;U^1 ɼr}2ơ@3µE&\+&%FMNnL\ৠ)ڂVj )bSׁց@yX%QpA+{  uQS "ne$ᙡ8mu[9cU WDttѤnn ,BMUJ4` NvMEʌTY!uh<_;dϾC_^=q,sxzez ti9a E`śa=\g*F$k>I&3rZ΋}qcy9'ۀ#z6d2bq{tX$Ht2/}c8ks25Rc)re/YTx輞OvPK a#Q- phpDocumentor-ReflectionDocBlock-069a785/src/UTs@Q_PK a#Q/qH{9 phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock.phpUTs@Q_Xmo6_bbgi}u&ihCRԴDYDdR#)^(Q${y (I[gd⾹M)htrx8b6e Kn+T+6 i\.XVKt1r;U eʴYq':be!8<[KHz/?~ȟ˹cܲT"ED `2G ]s:9f OF#W–:K"B$ V^B'|yJJ _X+/0IŁ[˂| å%,.߰ `؄u*P4r͝`omZqG +a#KMy*F_%{  Ÿ1|PKZ:S&'t풴fCLK#&uR/toE0WudW-I'dsIQ˼KYh mWѺu&3'Veζ K{[A{rde(PXo߾G _F A(=N$YFn qsA2g0̗8ln}P:twPSP-AsSطoJxT; *ry{2̷VV[. } g 1-%}ʒ~*T +A !)4k{ Dq?1-;tJqRg #}`Yzb]:4M]eッIk ZpH0f?DynL_H_[w$å 2"lDՉ`? )ԭᴉ41@þBHf0{L[:[A_ xLja_c?bGSbjH$+_O?'s/ajJA'P9'0ṔywZlqBO1 '?O0|~ߴ^d[5<-*n_82S?+G0`p,%OӤV2Y#C{S[tQGV)' ԔqfdBP([yuZ"C>HwIs+0l:/>5$O!3y0JB=\:~G;` 5P3O=W>;Y }4usfN`, 6/UD5pߣ3~[.>sMGfAIf~"Q>aof+*qyT:8I+%v89i*S/^έ{vG J oiC2[+qQK.~NN$a?iHS[ Z8x ((a3^fjFOPK a#Q6 phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/UTs@Q_PK a#QO E phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Description.phpUTs@Q_V]O#7}ϯU&(na) !Uv x2.M^{>B:d|}ιs]ԣQRZ8ouVht|x8NTߵ^\`W6+Uycg0#Kc/ț7V/ /dRrpQƮצTZ=߯\| WҋGD)EU&/\il(Smg?c$tfǣQ%WJWyRkIЂƽn~#n~uye?]?sY/\M[VW>c7 jBj)r5oBmԶQܤB7+n3ƥԕh=`MxP셧.u6qЕR,L|{E9XHUaLYR >l0̣## a,̨`(o=(( ny98mL#MSfUsJSZ'eT®]&US`Jpا3ͥLAL\ySX_4ZAlwjRwab`؈1iobr7TT9DBDPۜ *z.~ӀtcA2 ܚ_Myư6Hưom(yh?͹SδM_rMK _9Ԃ?ǹt:kPr# + !~GW 3:4LCoײ q&]_|q33#*CB[fvj^̀FVPA5g_>tx[J_2~NtƓk}vT KU)+K`w{dDYSlS*7E8Ԟw8IݖbC!_=TE_ggѣ9nPY s2p4zQ q$3`JkJ\Dڂng-4[Kj'ڻu2sȎ4+]f1\ c%W1Q,Ĝ8Q}߉QȘrc}DŽR*X8-Ikߛ0ͶBc]ZIؾ@і2)=/H;iw"Oc1rt~&aL{S d7!gv.2zC]w"]ϣPK a#Q:z .L phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/DescriptionFactory.phpUTs@Q_X[s9~ϯzB!6 ELQ)6e[VoKǛ3~xDtb%5I7+J%v 5e)0U%E;ҹ&bッL:*\QDE$5VKLts_ToMŸgO_325QfVuk5Z yS<wxnrb=2uכw?~t_BI"):gZfoJ,ʰ=3@G<:n xjE "dI7trA4 JĐ`DҵX[StSNuHg "kiIR **!=ЊBe*nEĕ1>Jq3sۦe<7bAB0Y2JEʞ'Sqx% R2"ѱ rB;1/L [ <z:Snnϴnb7Bڔ0u0Bqc b$BLe]_u^A ĖJiIqQ)@LSdtU̓ҔVڅ0L3Y[򆌖L΂U H3,xw" 1%<ӭUBy)3$ d8L +m3)gVTkH񀬌_"- }D ]$. q[&l􎽹JJ"4^sDO&5榾6jؒi6/^7yW:Rre1rGbkHe8u=DۉxӪCa?E<mmdPRsT5G\ >?Gr 񖏝e+իbt|r&x~.~d)]}uQPi ҝ΀PL S1<Φ υ2IJ Dy!A+ {b*,[H\ &M 6iIx$G"27oߺTȨ4 C=HvK/Km˶Z'b>=W xuT6i44輤胳ϗ2xFB`@M-/^*+Az[WxF-8*@7cڴ~ Bֿ,_.K\:tPV+ZtJa@r93<`d0jUe@FS 5sԊĪ>,ݯߟw짧(Kcԡ5<&3Ap; _F5m|Q"MQ8Nf1d=;zx>UgNwVH+$Syh 0t;@ HO~]\o/ˇi7޺K/R͵[|[sC.aG&#)`II$P]c3yť䁰bX 2it,,X_iOPuO'ӗ55 D͵x@dfqp}M˨? / W"L_wq:?g[*"I,b#Tj~mՕ~[u8Gl0ڮvkHBO[֓fow kK.JBNkC&?0j-Y*̝KX)={p)? Y~P6nU/k8QWͨU;aQ-Jn-;`OՃ$euZاW3Gd$Z<q;GYn˪[U3z;\?6ë 1T-8s C+8Ssʜn\ ,ex΁`;hݱŋj1i{|(A_ \׻d}-^քh~oi7eq;WM!BPK a#QDfG phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/ExampleFinder.phpUTs@Q_Xn6}Wޕxm4IhI^"%b#K*Iu{g(._UP393g.WIz>B&~ֻE7>;<BRw¤x z{G:##ɻX8,0/NvR ,!\3-hImO/32eӰe |A-R} Eũ8^܃PD/`@d2~b^/bkz5 G~0^0:AnVj>ЅY&%=+xCG+8h6OճgZ7T"ERЋ#a6}盇d4dJ cts"hQ0#A+rIXΌ{j_ޡQ.{(}x-\o|"a:F 9 Ɉ.q/_[\[p_7њ D4FM#)8,3~1coOH*"ߵ 0n,)D^4#2?3~!MT(FqȧoXμTnGrʂKQ&k#bp&^ٙ3.˯{֔FP2u;哈;pStCV¥2Jd;+cd\rcoPB 8,Xu}\J&~3Y\/#O8Wm{ls x,!RfVT%EkR繩kal]~ʱdZ}59SU?me4A4 u6+)W4SlBJх Gx`LvӚ10;͚ 4V.Yh:I/P0wGhG]*rBY?iq>{šD q ;yl56GL]s3ߎ`p%+wB>]M0K 6/ԾBs5 ' @S>EuH:Apu1ɐW]Gц/r&V1" YoӲ7o>Ƚ;ťXlo2rf(uOczhWIAӟn-^R?~E~MӓCJL6* ϩN6@!֢iozwyI{4Zq2~HL++mm_"RC7iftlʾ"qF!mdž a!%s |A ^e ?jW kY Ե:e6ۃoAzPK a#Q6R+SD phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Serializer.phpUTs@Q_Wn6}WL,,b߲:i6)v-QHt(uV33\|2hA=D'S0/.&p}"!NR ǀxXd).f5i !_E+ ,4 )\dD%cp{yu]xjO QF=\$/DH1PD ӄ=^j>#θdHFeNФW4)mPSg'靤Yܛj R/v`d.T'AsJ{Rp7ظ@@Ăg8x?*P5Bժ<Ӆ#´$Y̴R E$Mbu`\>VkMc$,N5*L;ֹ AtSbUHٖ z *PXF0[S}Oѥ'B* 5)exJri #y0f(\/yK0.MLCuY TEv!og>5Ԅn0&`P(պ׸Hf&X> ]i4WVp&; \ +;Jw@MCܟ{|1pْ-n{H\oklZgxD4&Ec :DbgF{BEI=E=`^}Q华x%;qX+JEWϮˏ]@gQaXXKm-gօLʥzǢ ʢ%^^S~h_z|Qgʨ(IoOC#jxo7 y+Fz}\ Z'K8LwT5OLJ*1w`b6.|g$f-<Ԕ8 yia>X,+7L& },d*VZ%'iA3~kAt[鋛l,h KkEFP#^v0q]YF >Q$ף^cfnvo9l݊a ΐv֌%3 rwI̒)k9;vطdmz m5wפҮ`>mm6dDH{(({7¾} ^aIl-ȖTh\\u K-GosAHv6SRۺl|W8R7[9[ z;EyCʺUҾ[94+)` 5ǦWC(S{ [ qozƴNm'3Rk6KvjM?'S >t:0qWn| ;(*w5&PK a#Qs S1L phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/StandardTagFactory.phpUTs@Q_[[w6~@{|**+ۛru99fϱ\"!k` ҊߙM]X3~0_elo/as"dBx:|w{.b8 fˆ~N朥F3.&4?4q#1S)㎾sl j*ic`H!&IqZUjk0|%[Bۀ;Qwq=v=GV3a8sm~Ha9 j\{az<=gPk*747X۾CiO#@[T.Tqsa2woČ< BeގHHuMV"#RԀWj>|Vq}ڮ;sAV꧃ۧ^56W ;#ZF[8ꎿzdZձ^i-z\ 7<>^ոf44تcGqQ`JLLd1Ye&l hnɪ{{pr#VA;?0&1NCnkW2ӅpeJ=gpT?L37IF#3*Px=ņaOe.s)2j]7[j Wם ޅXN4 5fVX{jL ~{ ءi! jpWMGkeh4ÃQ=+uE6H+3eIQ"rwQKx1B4%Ah#znC9+ 7uwں1fJL0Xzs\n/fQٜ@/֭YG(4 )dP z6V"D2@Y3uRׇWgbhP6wsR$sMOҮ_`>L$o N/-o2>0dVc)kd7φCкv{ߘDΤLO)yLJ%0i܉C#x)T|{y%3*="nRT*EX{ɚםZ2F{nqLEq-2^WCsG ll oIN%$>2i  IilG|+Vt[dV /ߴ{h%IT+v2{0To, ΥΔt 4G-5W7'X 6Mδ!:&<NJrEG؍$m.Hۇ4 $@gh D!v[R-Y箬#4!~F`Kaug!(͔ŘĔC{,,H>v :=3 &W䢄j^=6c<7L~aCf _ؙ LKj]oD|L#f)U9BkOWi+>Ƶ|B=ģ[73(!RHW}@4*llF_sjN س5P`O(BNcֱy.{Q~V59̥ˬ cJf ,3 k}iʽt3GV7|*S)։ecG"<}yGs#TWmy7+e˻TQڡ,QV3}'Q!:aa eW#B$ˬbs|-_X1Oc+L4j}lahpV< rl-v&L൏댁m%"GK8I"Ї5yF!BPXb~8ZǞZTk . Ò,i+p-By'ՄgKfo>qA5YA& ye|CC hEzdߤ8\i c'BLs qՆpgoJ kGpf C |[5}ڝ>+(mwsATF zbZR/Oƶ%$E8G𧌴"X9oew]:i2͇+1D/OondQi}ⴳ& 7m;?~.஍^VTӶpޅBM/Zl=PK a#Q; phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/UTs@Q_PK a#Qmq E phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Author.phpUTs@Q_Vn8}WLFэ㸭0!1N ZYʤ@RNER$+JU&rf!<=/(c m<'7:=)א 9SdIFjHfJ*0)BRdD2P|`"G(4T;fgghm]/>οm(Ϥ=snSលvx@pqRchDc ۡ_`ad!hC&%jjAAb29D[n7)s FpA%ʥH mjq߬]/>͖lqbL'n&#+Lj{϶``@ellCWx*Yi? Xz [+QSVX>#O! pIeCl #bPD9N2Z9W|bp` O%E_RgIrkŬ=3r wg 4M$/7dPJuD֪(ʹSl4׎uUD&j95+tJ. 4:<;WǤJރy0Ē"i[`qPk.CG8|{ #J{-j'Z[I_;.Bfzܢ՘U_U'E?wc[Z"w=_l{:,Fg'ΆyDNOt<8ðOKC/D3_K% TG;#Is[>؄0Uߘ>[|1) sGr'ذ!,?Rh,N5fIЁ3nh}53G߂Vwa0 Q៕Q.+nR*vyvvT_ݵ a D.$ɩEh6)j^PK a#Qe؋{F phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/BaseTag.phpUTs@Q_SMo0 WN&Y Eh`PdHD7(:T u]RJL"k7WӥRL Zxёs !o _-J2A>5Y@]سCۇ_B֣Rt̊]CR7%&B 6uOP՗k̼PB)k)GӟWhDRʛt4` Fl-wwuA2̭}@mxb15:Ha_QY ]LP +:xblD|#QxQÙޱ;{p,]ݠ+LnR\DJY@$'SHZ؛S;e{>yҮGGe]qLć1z! 7G~iTL!=no ;z;&mӾWPK a#Qt@} E phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Covers.phpUTs@Q_VoF~_1'!a>h#\"FUHՇpU&Wxyڬ(*0XiYz yrE㳳~])( D ErDa&FHkkEj*GBnOS6ׯW׷kek)(*nj,kzC\heQ;uauıHGgT 5ҜV?"߳{e՘ŋrrھym*Q?|'<\ I,wRU\̟܈o/J^- d#nBJԤan/ o*re..G@#oYqV+I /|&ݛ Yw}>d7kQDD@bOL1_lHYp`:BCb˳:ti%wJ~啮X]}C|MK.t [,r\SƂA{PRt:=>vk g~S; ߸(@ 2su9ʷB_o-( }Kh oE('#f*g]5Wt<Y;L} 0Qn%N 56 2m]LJ^POW?t aHG1=z;XH2|LOliHX {ϭxeHK, sVzٻ8t1 J?< $IPN CGGG`K[0,?n21qkoO;`%B%Hr<.voxΩ8g=!h<E_a\d:䂭XpݔPK %bhD VXBF|KլIFT,$\`SVLL¿Zܣ!8يv.B|v@5S`a|7s=Y ZJI)n[&֖KO Z>lx bFeRt2rCWH)1zI#vT?}kyNfPJ?'!Av/%Xx=iޢƥ8t[V<". Hdi.vD[675xr& &yv{'§s QV@BTH,#|se4{ٸȒ- ܄1geE챑i[0n7 CiuBez}W\M7U\`5w|VH봅Y6ewSȐ5C/OFB7feɣݰy@՞k :GiUV< ALbYI!p-c/2i{i'jO:5ԶF_m \:A{g<b?sLKQ NK`|Td%NkuZ\]}~H"}7~,H?1%;cNw;8X1u[ě7yw{n%A;U}g?Ml3Cc;?/^w8>gKR?dY{v coDžuX@=S- ?tЫ7PK a#Q* F phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Example.phpUTs@Q_X[o6~`R׮9ܭIMPP-іPYTI*$/\ NsL8" b.69c1'- 1.^аXLP62IyE1A"MQH KV@8P$ "[R")pv˛٥ 9nQDpX8-XH@QD*$'"F4ᐲ܏z 1Y&dP ߃x?L~!59e)>Ûw`wsFVsS; ?,%ڹS0}SWxtD1 A>p8w'^2x30y!M*. R&G!mD>&"Q'ѻ{$$[OX2(!p4!SNтs4@~JLRpΒ{ g/)l 7zK ^70Bif p+#\Up2J<'4]fzP:%\@Ɓ?CyOLe2Y.SX,ynj>{`/BG Q/ l%T窆ݜO+cMPdRPqƫ!AsIWs 340[_K~^J:;7S!4KB;qTK5B\pO9a6}eU [hJ:o *7[G'цѠS (\-kjg? e +h0e-I$l^G-Y&2b$?e:`kRBzAxȒ\:PWUFb4BW=|R;еaȩc#4+7 cIRE3[ ~ ^G^>7</~BdVR܄nvi.0#l"u9Z7*¯;U{ 6P Z nN؝ָTjLlsw(t-yӻ3D sf0 /n{S5GV:~]WiMǾOeԣz-]^`>.GcsKx.]*'Rttr`tW (jw "et:(AweTչnln}[jo%e^}u^d#J{rط=`N+]5sQOGx9 :S24Ia +Y"2׵AʌѫWNޘѩi 0‡Hj1#Ƶ"{֓UU) 4pև5膶Zu } sWHk |Bm8 Ɠ3zD$R \2Y ohġw ,KoV ʕR' LƖȾ-wfWDlۊ~mAGv7xMܾn"¼ڒ e\Z)w= moPK ZW s.bFU\z00hrPK a#QC phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Factory/UTs@Q_PK a#QP,SS phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Factory/StaticMethod.phpUTs@Q_UMK1 9xEv zp8 63-iKui›7ɓ:(FdL*z9b:;Y,,`kl:LNjSHK:$ O΁ qNv0kpV\!lJ5nYRIp-tD`pYrBnY Q%.!X\48ֹ秇|4HQ&ЦgB ;%2_wָ²mYjcV'?'ްWWV}`G~SEOuD3H ٳ%Y.t=D T@*.3(2QpvRVC/2bhkyo 8*vT`9,'ڕ?PK a#QE phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Formatter/UTs@Q_PK a#Qx"W phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Formatter/AlignFormatter.phpUTs@Q_SMo0 W N8Y=l-Cȴ-T N d'SlA=>6U$9J-}rHEX)n#pW+ YqZȼB(ZAfTYVgSXW RL(8Uu߾> PU`'<*۴9U|\mDnR+TD|Ds+3J'5Fp@;egmQ~u:vo,[=u!TYPvؠ 3Yz*TNw\r+8OCSU5(!x[RBA, ĈS5=X|AX_0b@JCcm57"P>f=f߿.JJsbuNc8BVv\x䯌pFaf7Gab3)أt2tsK:}W-7:|B%>lyV :RuX*Sy/ǐF-x*8tn/\jEoKPK a#Q e.q] phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Formatter/PassthroughFormatter.phpUTs@Q_RMK1WAūǂM0d*$Jof޼y3o.B8Nw Ώ'B4ө)i3 #[o:qưH#tZP>|EkZFKL:IƻC%WPy%J&hMQȄ- isTȃZ*}@ MN^|)HYaEUt9{m>^i϶;JW]EaOߢ_+1ݔR=qo̲rt !U"C.'cb GSߐ_+Ǽ0NQb33]`VG=1pf6A&9y19P.Δ6E:(]ԏbSI{.iEZJBayMi2t"p()ǯz-n28R,2>gtHjVO Qo0[=>_x[IOo×W(uM|~Ё/BjlI˹ءMAQ9CHPg>T + .2>7Y+b`-(Ƣ[jJ1Wz#I^XDP?cM^˯"e?Ks%RQ7û(?{g3r'u^!.\z4ue'ī p#]\m"/h<ZvͺՙmC9TQ[ "xBjyēE_ZMDNWaLùK;(&vVCCq[o5 Ge:0j`JglhU Sm3m%'9\&\FB%{ΘoĮ`N+ZͰDqݮx( „Tɟt T8MyfItﱇU. 9naq #+KC mҠPpHqܰ?-gݺKفp=QOUo ڍt|Z#RkM+thv62;bE5܏F&7w#eܭ vA'ē&J9CT¬@hnhsGBѺ.&ޥU)p-r \8"whTOs/PK a#Qះ%I phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/InvalidTag.phpUTs@Q_WYo6~`/,NҾ&ͱ-E}IMln(Q );n$kw*b3R`o~^FO\Cߴ(RȜ6A@8W~RZ>E- \_Zx(2ҟWFoBU$%XK]0;Y $Tx/7(97l' ser5~\#M"^']ўtYw=UiV7No^j%E^ۮߗ^,~NhC9RlT|썪vi>'&d~'0|f^k`gݖkph+-AV}-+~C͝N77CW'E|fL׊^{~4UC[~S{ª:/Ak$@ ncuh,d{3S[7f'sGwaˬaғMw^ ي+Y_PK a#QJy\ E phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Method.phpUTs@Q_Ymo8_$e]ٽiۦmHsw8^h[,"ǛEdV_lpv 2"1U9o {w NݬsyAnq]"`DzCJN1 ϴB|Mв. Wkp"OI@D#-ۜ$ߗ_>^^}>0CY.[Ԝdh5̀-UJ@QF y9ߞMǴZ`P a[ ,k,H*LMOo j0yZI˻l9OUWY>Op=0Zܒl1$Xw$??4o(K;cQ˺lWϿ=s&ݶPpFMpED+g|[3];z-u`ƝAдqnq5uAp$:8OD7ia\(˨^%.4WEDʌpAKt4Mq8<`zf!![ o+(8xCq~;)c"0 _~9ACE}q\rc%Bߙ;B"1H|gv< [+CB{|?K]k!`+z$O'YrK~߮|BX<̗胍N아-o6f 6e/DH[8o|"kkL,."*H{w ޝϚO5K>C;5k.bR B?I=+ PcwZlG\RNjcST ;[}%œ]Ξ".!Fא2uRM亝9jo몒8Tefh"4ǘ9d CdX1VdVgP<qq:G HzpUE`"s%6h^&XV}0SFXKR!!08nVӎ֋0Y'0W 4BH0͒>T ͻe2t!oy2Am}}eMBK? }oG&}:pUWy( 9 4sɉO:azE$4%<Xz¢bM2GA$EB ˕0!ס,@n(|gOϯN(}\nC1U$1R"X#ŤB.OJ|<!ИECƗ?tpMD"$)~HYsv.ڡ!>!"4WY>RmF< R1;f$ /|#5b^RfRdB\h}ȶuwU XYX&$\\38t=?9=y~iٍB9 0{AK YͰP>(Jh%υ&D,Foʒ=QPwv%1DXܹ8E,&J--3U?PL W?A;SSE5\ud(S줞Vh쬭N6K7^ׇt U4/㵏TGގ3vGldLج1w:W+D_Mv-M۲#zS SjȂgX%n Gl`dMɕOG 2ԅAK-TJw-Rk83_\^_}zwYWv`(r,`Ξ ) bs(9A%.  R,,o+;Gx#l h5p"RATcD_^GEI1͗O9u^EgI#Zl>jl,f ǜ 챚ܰ H֛o7SO@W̩I΋,Xzl'{C0ӧ=<ۊc5]oވl}ZJnD]Kzʤf5B;[b" wS -[Ete4+2JY7Y7B_ QK-^/a%𽟤R[CK'.тb,`oL::TSLɤ|9-T8iTPppA4J2cH)RH5_%ۊ(1K_4([oGKR!z k;߾#~0pr\3uWቴB/U8!>p.147=JY38(- 6!fțŒYĕ:Ah9tvqvSޱufO%FqtxRj +Ou)sc5zX OCﲁ7j;9S^e>tƝsέ!j6_c]mwv 6&~b#?:^F9k1k.|UL hv1kc):+AU+-\1깚er~WK jzFV]7 31ҖW=N`e'#ܖs?PK a#QOO) L phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/PropertyWrite.phpUTs@Q_Vn8}WF%eGgsiw 8<ԅAKMTwH)IVy59sӟŪgDP*b5WۂI7::bjbM0TS)l/Txe%˗-F@ bEFo1sZ.j2sC(cW<L}p 9v,ʜ~X\fqfz<7 QM?}ݮgv"$'M}7o(@j&VJܞzҤ5(]d;K@oӵn{xvӪЏV(E0I`n 褥suB/ڰO2j1bhc,`ҬutvM3BȘ Q8GiTPpA4J2G#`:R^1/1K;_4&;o't{-Yw~;vAfԯ3a^qB|]bh6&M\2KpHǞFqÄMf@,Rbzx 8Q8uޱuc@_CZgG8ò]$Gvpj~o(gU YL6=Մ`РVS]P C7gռxvAx)*EYT4.m~rΤ@+Q\RskGiD۱^Ev;? 'm_/ڽkf}>[ZתF&[zv kc):+AU+-\1깚e2r+%~W]7Ɵ31ҖWN{pWϽPK a#QE phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Reference/UTs@Q_PK a#Q v N phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Reference/Fqsen.phpUTs@Q_Ok1s6i^5m( FzEdIژv&"VOogt=Qӄd 1}(Uf fuGM  ۢ@Wr-߄@-B9&Mˠ} I2|h ѡ}qq_JEn5^'m[w5-M J5 sg 񺪄*FJ);6MfZYoRvt =jW> 5@jXua( cz-u:!nٟUԫY3WJ$ӌp [ˠd~ jew'2-L^y$_ NY:-Lܑ^h%1ٸ#4P.O?>*բqp#w <6AgQC@_zt-@=Bgоg $ 4hPlkqWy,U ;%:3FҤɠ8x0w?AgөlT)LQ wgS7,:$!O)Sr@g 4]"jz-=:RV .Գ9b&(5Maq$ՌpJ:k "_a2 +=x9LJfGCy?Л |2ۓieaYFc%LY~PK a#Q."-F phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Return_.phpUTs@Q_TMo0 Wp@8E`di~=,Ct,ԑ Ind;tCl|{YQ ϙX-]Mfy0QGp `ڂJR//(C9`3sh,0@.8JC%dY192= |y߿]\]R͘gf ݲ!.F#5Jap ʬ-ƣM*(l`a~iSr~o}5  YV-V9 =2BNPW `ؑ&8 ,@$zE$dEeJcJnc_\} `K)HWjlvr,ӄЯ&O\=̷`=C t?~.YwEݡ+-U9Eg*j۵`UVo* ` 4fX*{Cl0yN g-nET\hiqtZӦbDt S]Mzڀq}Yk'vV]H&VK7b}mB5 @#q-`NVgViH Vh x[UaMçkIejf`mPK a#QGP B phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/See.phpUTs@Q_Vmo6_qXkiS&K]Q)a. F:DdR#$n;J(ۛDsGv^-(1+:#37s U%BZ(d@JR}fLb,y B*Kt6rp TPY2 mIFP(hNOls ^X%Y9^W&CrE)-,$!("%h+A*=+,JҔvߔ:^Sߡ͌xWI [T@9 A;+Cs@:}'K[7KX=ZlaR^1b= vX[ψ٢kPYj,ţEbS}i{RQE*UJ&Ѡftɲ?-t}~.n&5gü]w sO-=gONR~C[,7n# ]fL+·\yl<8ʃ3P4uh.Z:nIͅk(l};A0n6I>zN[C ;%z6{;zA'Q,j)/4,EiDb?æ>e|X[)M듪.$Ss2Y FM|dI^]\xIn+8jP8[.X+HnY&ȞOÓ, #O :A2 c5-b^H;Q/ %v6=撥w;>!w6l}v8\2yݡ]XHa]3pA 9q"u6H&1!mt72U)d y =BCʛ &=mѵ#6o[EDChf8{:7ֶq}vvAfήǤr4qؕ%]ii0[~!s۩l1܅gg섆bhwOi9d:~sSPK a#Qe0s D phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Since.phpUTs@Q_VmoFίH1~tJHqI-2&ά.l33(fVȂ̒JāZC}j z`%Dq/P#K'.@mDy@7[~B,h"*iٓx2OȔ'_BuXO b<CG!;"N* ypA;&3!x3%, \$[{-41Gl9~nÎqR@b[*&VxeF[ kw)%Лʯo5xt n<`RE^G\O~v4(ZDTb1ƌu0.e C*X~҇Q> [~)*Zu싘r5e`  GZ7bMu$k#H5 3bFx<kTX-T.RH")±*+$1%q:OX&!$q /c KЧ]ZozV?}aЭr!2"X$G!\&qIMF#`G[Ozp`p-m‚/#\w(gUIѼQY^TWU:(_ peQrd7w \*A)lP, JjFq'ʢ$4Rvo֖2Pƹ\H/ oJ˝A:(8L.|O`l^ӋSIŊO+ T 8 QLWsB,[ţrXwDXLJTrrʯrl ^ګ6%~TVwGqD$Rȑ)`"^Q$G U,CW4#"N 4{' B>"ROQ XDu'4ۚGP8pK5j]؝Cf4TjM(Qw4TMM˘I2G,v{b?Hu圬[p?8zTt<+T3 zAB.%0Ywd@2gzɽue9Ys:Բ  h azӉI1^S^|v Ro8إ?3컽ȿڃ25z(\+ҲJ|G7.~ ƻ.Lnj`ՑfpABJ*~|\ ,vliY[cڃ>M єzNA0xpTO ,uLB5쉸_;s<̎IcX%B#mK ՚o)]pc _{ҒmwvLk*2vmð-0pZj i@nZh)_l>=F,-Z$XE3&c9 `}PK a#Q5rJ phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/TagWithType.phpUTs@Q_SMO0W̡" -tJZ@살im\gXvd;@wiiS'y|dtQu(+a1q*F7fQ4<>KP=ka=(7X%BTHSZΡR0v)2zu'!׏?9U,9<+_8XDVe#Sz_ $47هQ]-(S %zU8 G}h'ԯ, JP͜j]`h@G3!G;F\2 .D2Z[I,حoxR7V0sf2*1!`Pw5I^0>6y;=W^Lf]ڷj5@=n15+6\l?` ql پLǐ^'-_F0ZmH/KRll3Qtu¢$$i! EuuxOUNvX0Gℯ _,HD~?{ &{ D9|ZEu|VaHڿ]Rp4f'4褚muPK a#QoVUE phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Throws.phpUTs@Q_TMo@+!Jl8͗T!C]Ee0(x.q,)>̼Ӵʫ HLa*y2 c<I'0 YQ"Ŕ^K^P[Y]eQ27D eQh*!2VRBU"K&뗫rf`4e .LNOHR\xʍшZQB]1;a~YSy>cKM{{ר**-#sFrZ/+) $4@{tX_$ָ{c_ E|B`bkr% [" ;!++۔CRS)$\XE,q ÿeU {cĥ DMК޾!LY6n έcn5Ú=aOn ݌+d]QN% nNwѩcwrszؾXu^y{P (4Mg$,:`؏Sފ~=IKV%m*jH;;W.z÷em j)4 #oD+oD}SdulKv{@8ߑC`ab) vPK a#Q)T C phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Uses.phpUTs@Q_VMo8WLl?h"Nu`"ZJ;hݺk$ g<^AcV1Ҳ\ojT*F\ݪTP]k&5(Ț5r-܌獐WESUz#J9Te\/\3] @]!#cO6wL?(^1 OLA^vFcO^ qQF9\W%u:\dC!4 ֨jF!=[,* YV"{ݱ4wߣdYaymDE%Gg|LgL-R` L7]Vk41K).bpLJ?fIuuE=+n6h$-L5EY?y-ĬIp&泩&)fQD~#94\K p`tc XlNI,PRyKVMbFՔ-:fAg_<5xOV0Ƚ1p:l465Tp>z |Vv:4F`!MY'= *9(Γ9 2wzYRPX^ZM) E>\b|[R3GkRӺ*ufѴ WxJԍibWVgk[>ٗ3R^ /߸9{L ="+Ax$,xr$LNϴ̆'=0yW70MMAw~dY@p2F&tw'5$QɊ.>~߼tk};#4d7AZ53~ֶ]l:ǏD:J'RݡBX^-1ӱYxآ{`r9ՖJJ_"nqM,Ň;BoL&<:KHnc#?wPK a#Q!N2 C phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Var_.phpUTs@Q_VmOH_1'Eͅxi!(B*Īv\̮{m8xvvgi{)WZ&MW8I9I "z!b3-HRH+q|#J"Hg Mdk O9CCͽtB?b(!tBĢD!C"Ep&O0J|<!HC!x>2*gx av㔇kOR!zWLr+,D+719oPJ\AUE/̒\TYo|bY>*wa\d0)fVI}Rd]g:O1 )B.TSX,PnȔۻ?br}y~ݤ* PXX ~=?0drw`A W&l,B&hsMATcՇ^G%0\Qug˧]Y.FlX}H"7Xp bmUQ0ejԚt/ԠS%ZB?X8SPmE1R#DfK٠,hZJ8H)'=;$*Prs!`'=w{+tZj] aRcP=玳%#ܖs?PK a#QN~82 F phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Version.phpUTs@Q_Vms6_G=c#fp\z3m. Lc-'H2 w%o4`[ڗgw]80 `I(V>ư7m!NR&ƀiXH&(sQLJ~ Ė@\)4?ddIH2&]  OI{<*߿N74m 1%ݺ$DlpZT.${7"ƈ.e<FTg$NI(!{_)(LxȒ\n/ARw4.f*,3#hK=iJn&[UK2-j^2GR I-Lk[3U2MLyQ3${fe$`CQ`N wGy7S;->#hq0,ϵ]mV+UvVkV*X~eVW>J G~*76WVorq+F$)EWQ +.6R*WMD2ykuk$븪t3/TYQ'2$ّ(u&#`dxNVH@cC3 mkݶ: m36x:37aQ3T^?4^93߮V=%|1X2];NsueML!ck_;s;J4N"ddR~Ճ:ngi9^$ @FݛɻV+AˆWNBS%?j }pvB& @RjɲNzv 9Qv+Kb^˂1ٲ᫃Z%YPK a#Qהf E%@ phpDocumentor-ReflectionDocBlock-069a785/src/DocBlockFactory.phpUTs@Q_Z[w۸~@bRzSI=vN > Iy[l; Ite0|afw<8YRQ$7Ӄx|@&dgIyEQ*'ՆU$*'7yL$b"?"e(m } E $NPe]<$z@QF8N8#(*b%%8~k; *gƎK呔ljy|@Ml%hu e&) 7mlI3`Q)y̖կws2qB3-R8ýG,Kr`gňҕo7Lqcl tI+pRzt@49>=2{'ݯ3 agOwgc:o#0mH܁8wٹWm jXק9!'㟛9uHjyG.VdUYN^d&  1nhǔe+=ڬk*{YdHAQ}7$qh?)  Ĉ/aC"H@HC40YFi%i6tL0̖xa&ĄkǘT:ٲ\Z4z{l>ļ / b>=+ߏO gNN&-3z;ə_3sޞZP\(`.$/.QIePFPmRr>*O3l ,,R,!\C&HZb}|8z2W&yHX`<= 8/1<QgXFq^!|C ENȶHʾ &*n)$UP{-y@p#n2QRhJ1x؎wlc8sr`x8'a'46х&E ڕNwM3ZS{H3f:E4@E >/ #_bv]@_:J]E3b8!55k#tCpɯ!G>_.x1b87 2c0[iZlXf-j X$Da)jUs,#/|{ CF{4;ލqN>%l!*IXJelA 4p=byl}*mԁînhɃ\,aG0 G*Q,F43VLu&y#-+87k'ʣv,oP?־ /ϓ@6pÝwYQLH౰AؕO`m8:{IS~'<0dR 4K2&E|uZgD-HE뭻[s:x uJ"B]r5b>hCP[  bBA)%_RI*]l#I _O # P"D4܌:![8?L_ *X텎Ļ `{0W SQPU>7T) (ƌv" !EՐ$U!3[2uS,M: f!3Ϋ$\-VVEeDo7z(Du$G,R{pfu\\хByƙ`Yq^_Q@%pv}GGPU(8Lߡ TssV$rYy꺁o4\u)0=ⱛ 󐼙dYya8 _}ǣ0]xߺ :xAfa@v:bzĽr=gq+d!Zs;~p?Y.YD9m՝%>VxuNdȅ@~(/YC>U$\IA(^ˈv%`r&MGla/UrVdb= 8; B@ޑ; ci8[CwU.eH3IQC^p]ԥ'_PHNQ܎~^7_KܺUG;ٕ}6UŽU1Y4ՌMI9*X FkGQ}ZdC{dsh״ \J*FU8 J%~gY#5};϶ڍc@P$p𱏼zϐ1ٗ_臫8ǫK3U5͂Ld)Lv #/ڻ$B u"^5n8P'1 ם\p5^px.i>:jǢ?HZ6ҭ\܎3]H&!. E0  i c K"_e@Hvĝuiu,uF'd\J> oPK a#Q`UwI phpDocumentor-ReflectionDocBlock-069a785/src/DocBlockFactoryInterface.phpUTs@Q_uRMO0 W6M\B8B^v4V4A.vg%E/P$ z赌*)̮{!,J s2d' ɨeP 5No73v42un'XpƥSVWå( ש$RX.SyĂu2}{L-BZNA< %jSM @ﱚ֢||uMy:@hG-h <%ɒm #钺͈>0/dy/kI}? t/>D,6.y6uf`1p :s\'[PK a#Q7 phpDocumentor-ReflectionDocBlock-069a785/src/Exception/UTs@Q_PK a#Q4ZU\H phpDocumentor-ReflectionDocBlock-069a785/src/Exception/PcreException.phpUTs@Q_SMO@ﯘ ͠QL,FҬ۩lhwݭ` mB#:uC LgF=Gsݽ%D M8#/2V5$Enk1/3G/ B X*~'pr%ARwD9#9=Ep|s KH0 }:OS_Wtg9H"$K9k ,'el"\K*8ˬ{$ WYk-6ҞL*.`TEJav x#Zgnӫh -A:ƷVR Tmyֵ mJ3Zw1.|}g s-߶2{{ xY1&HZɭT;Y݉zSr PK a#Qg22 6 phpDocumentor-ReflectionDocBlock-069a785/src/Utils.phpUTs@Q_Vmo6_q(6\;.hu0(dqHzmH)~i l`K;׮qEQ(Dd\ŭpq6~Uɤ 7*@4;#h{+M~Fflyi=i֫uA h0ʚ)8=(ܤ}W7w vb#"lDJ1XFņVKH@ het51VVά_(h18AB|Fɼ(.xDӫLq"zosiE ڽ!|QRBF҄ҡZpX(|M7/CJe_a}o;lɵ^[lj 5%+gҶs*eYu+d ΃q^j[[ |%eF,gK7CPFb.V~t"JE80j@TuZ-V $2{y? 喤!V (e`1tl88yw]I/qG]Ѭ)Nݜg~{_s 0T|[p#^cpj ..&UxH޶-ʣctۗ3fPK a#Q) phpDocumentor-ReflectionDocBlock-069a785/UTs@Q_PK a#Q|80 PphpDocumentor-ReflectionDocBlock-069a785/LICENSEUTs@Q_PK a#Q.=xc 2 #phpDocumentor-ReflectionDocBlock-069a785/README.mdUTs@Q_PK a#QLAw<6 phpDocumentor-ReflectionDocBlock-069a785/composer.jsonUTs@Q_PK a#Q-  phpDocumentor-ReflectionDocBlock-069a785/src/UTs@Q_PK a#Q/qH{9 [ phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock.phpUTs@Q_PK a#Q6 phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/UTs@Q_PK a#QO E 1phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Description.phpUTs@Q_PK a#Q:z .L phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/DescriptionFactory.phpUTs@Q_PK a#QDfG  phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/ExampleFinder.phpUTs@Q_PK a#Q6R+SD O&phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Serializer.phpUTs@Q_PK a#Qs S1L +phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/StandardTagFactory.phpUTs@Q_PK a#Q1l= <:phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tag.phpUTs@Q_PK a#QI41{D  <phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/TagFactory.phpUTs@Q_PK a#Q; AphpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/UTs@Q_PK a#Qmq E  BphpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Author.phpUTs@Q_PK a#Qe؋{F (FphpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/BaseTag.phpUTs@Q_PK a#Qt@} E HphpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Covers.phpUTs@Q_PK a#Q#M5 I LphpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Deprecated.phpUTs@Q_PK a#Q* F oQphpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Example.phpUTs@Q_PK a#QC XphpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Factory/UTs@Q_PK a#QP,SS pXphpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Factory/StaticMethod.phpUTs@Q_PK a#Qv=,+@H =ZphpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Formatter.phpUTs@Q_PK a#QE [phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Formatter/UTs@Q_PK a#Qx"W X\phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Formatter/AlignFormatter.phpUTs@Q_PK a#Q e.q] ^phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Formatter/PassthroughFormatter.phpUTs@Q_PK a#Q[ F `phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Generic.phpUTs@Q_PK a#Qះ%I &ephpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/InvalidTag.phpUTs@Q_PK a#QtC jphpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Link.phpUTs@Q_PK a#QJy\ E "nphpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Method.phpUTs@Q_PK a#QĦD wphpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Param.phpUTs@Q_PK a#Q8G O}phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Property.phpUTs@Q_PK a#Q?iK sphpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/PropertyRead.phpUTs@Q_PK a#QOO) L phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/PropertyWrite.phpUTs@Q_PK a#QE ьphpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Reference/UTs@Q_PK a#Q v N =phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Reference/Fqsen.phpUTs@Q_PK a#Q.R MphpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Reference/Reference.phpUTs@Q_PK a#QL phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Reference/Url.phpUTs@Q_PK a#Q."-F ߒphpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Return_.phpUTs@Q_PK a#QGP B phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/See.phpUTs@Q_PK a#Qe0s D ~phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Since.phpUTs@Q_PK a#QBKa E phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Source.phpUTs@Q_PK a#Q5rJ phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/TagWithType.phpUTs@Q_PK a#QoVUE ɦphpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Throws.phpUTs@Q_PK a#Q)T C phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Uses.phpUTs@Q_PK a#Q!N2 C phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Var_.phpUTs@Q_PK a#QN~82 F phpDocumentor-ReflectionDocBlock-069a785/src/DocBlock/Tags/Version.phpUTs@Q_PK a#Qהf E%@ phpDocumentor-ReflectionDocBlock-069a785/src/DocBlockFactory.phpUTs@Q_PK a#Q`UwI phpDocumentor-ReflectionDocBlock-069a785/src/DocBlockFactoryInterface.phpUTs@Q_PK a#Q7 HphpDocumentor-ReflectionDocBlock-069a785/src/Exception/UTs@Q_PK a#Q4ZU\H phpDocumentor-ReflectionDocBlock-069a785/src/Exception/PcreException.phpUTs@Q_PK a#Qg22 6 phpDocumentor-ReflectionDocBlock-069a785/src/Utils.phpUTs@Q_PK44((069a785b2141f5bcf49f3e353548dc1cce6df556PK!ܵ\##type-resolver/README.mdnuIw[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) ![](https://github.com/phpdocumentor/typeresolver/workflows/Qa%20workflow/badge.svg?branch=1.x) [![Coveralls Coverage](https://img.shields.io/coveralls/github/phpDocumentor/TypeResolver.svg)](https://coveralls.io/github/phpDocumentor/TypeResolver?branch=1.x) [![Scrutinizer Code Coverage](https://img.shields.io/scrutinizer/coverage/g/phpDocumentor/TypeResolver.svg)](https://scrutinizer-ci.com/g/phpDocumentor/TypeResolver/?branch=1.x) [![Scrutinizer Code Quality](https://img.shields.io/scrutinizer/g/phpDocumentor/TypeResolver.svg)](https://scrutinizer-ci.com/g/phpDocumentor/TypeResolver/?branch=1.x) ![Packagist Version](https://img.shields.io/packagist/v/phpdocumentor/type-resolver?label=Packagist%20stable) ![Packagist Version](https://img.shields.io/packagist/vpre/phpdocumentor/type-resolver?label=Packagist%20unstable) TypeResolver and FqsenResolver ============================== The specification on types in DocBlocks (PSR-5) describes various keywords and special constructs but also how to statically resolve the partial name of a Class into a Fully Qualified Class Name (FQCN). PSR-5 also introduces an additional way to describe deeper elements than Classes, Interfaces and Traits called the Fully Qualified Structural Element Name (FQSEN). Using this it is possible to refer to methods, properties and class constants but also functions and global constants. This package provides two Resolvers that are capable of 1. Returning a series of Value Object for given expression while resolving any partial class names, and 2. Returning an FQSEN object after resolving any partial Structural Element Names into Fully Qualified Structural Element names. ## Installing The easiest way to install this library is with [Composer](https://getcomposer.org) using the following command: $ composer require phpdocumentor/type-resolver ## Examples Ready to dive in and don't want to read through all that text below? Just consult the [examples](examples) folder and check which type of action that your want to accomplish. ## On Types and Element Names This component can be used in one of two ways 1. To resolve a Type or 2. To resolve a Fully Qualified Structural Element Name The big difference between these two is in the number of things it can resolve. The TypeResolver can resolve: - a php primitive or pseudo-primitive such as a string or void (`@var string` or `@return void`). - a composite such as an array of string (`@var string[]`). - a compound such as a string or integer (`@var string|integer`). - an array expression (`@var (string|TypeResolver)[]`) - an object or interface such as the TypeResolver class (`@var TypeResolver` or `@var \phpDocumentor\Reflection\TypeResolver`) > please note that if you want to pass partial class names that additional steps are necessary, see the > chapter `Resolving partial classes and FQSENs` for more information. Where the FqsenResolver can resolve: - Constant expressions (i.e. `@see \MyNamespace\MY_CONSTANT`) - Function expressions (i.e. `@see \MyNamespace\myFunction()`) - Class expressions (i.e. `@see \MyNamespace\MyClass`) - Interface expressions (i.e. `@see \MyNamespace\MyInterface`) - Trait expressions (i.e. `@see \MyNamespace\MyTrait`) - Class constant expressions (i.e. `@see \MyNamespace\MyClass::MY_CONSTANT`) - Property expressions (i.e. `@see \MyNamespace\MyClass::$myProperty`) - Method expressions (i.e. `@see \MyNamespace\MyClass::myMethod()`) ## Resolving a type In order to resolve a type you will have to instantiate the class `\phpDocumentor\Reflection\TypeResolver` and call its `resolve` method like this: ```php $typeResolver = new \phpDocumentor\Reflection\TypeResolver(); $type = $typeResolver->resolve('string|integer'); ``` In this example you will receive a Value Object of class `\phpDocumentor\Reflection\Types\Compound` that has two elements, one of type `\phpDocumentor\Reflection\Types\String_` and one of type `\phpDocumentor\Reflection\Types\Integer`. The real power of this resolver is in its capability to expand partial class names into fully qualified class names; but in order to do that we need an additional `\phpDocumentor\Reflection\Types\Context` class that will inform the resolver in which namespace the given expression occurs and which namespace aliases (or imports) apply. ### Resolving nullable types Php 7.1 introduced nullable types e.g. `?string`. Type resolver will resolve the original type without the nullable notation `?` just like it would do without the `?`. After that the type is wrapped in a `\phpDocumentor\Reflection\Types\Nullable` object. The `Nullable` type has a method to fetch the actual type. ## Resolving an FQSEN A Fully Qualified Structural Element Name is a reference to another element in your code bases and can be resolved using the `\phpDocumentor\Reflection\FqsenResolver` class' `resolve` method, like this: ```php $fqsenResolver = new \phpDocumentor\Reflection\FqsenResolver(); $fqsen = $fqsenResolver->resolve('\phpDocumentor\Reflection\FqsenResolver::resolve()'); ``` In this example we resolve a Fully Qualified Structural Element Name (meaning that it includes the full namespace, class name and element name) and receive a Value Object of type `\phpDocumentor\Reflection\Fqsen`. The real power of this resolver is in its capability to expand partial element names into Fully Qualified Structural Element Names; but in order to do that we need an additional `\phpDocumentor\Reflection\Types\Context` class that will inform the resolver in which namespace the given expression occurs and which namespace aliases (or imports) apply. ## Resolving partial Classes and Structural Element Names Perhaps the best feature of this library is that it knows how to resolve partial class names into fully qualified class names. For example, you have this file: ```php namespace My\Example; use phpDocumentor\Reflection\Types; class Classy { /** * @var Types\Context * @see Classy::otherFunction() */ public function __construct($context) {} public function otherFunction(){} } ``` Suppose that you would want to resolve (and expand) the type in the `@var` tag and the element name in the `@see` tag. For the resolvers to know how to expand partial names you have to provide a bit of _Context_ for them by instantiating a new class named `\phpDocumentor\Reflection\Types\Context` with the name of the namespace and the aliases that are in play. ### Creating a Context You can do this by manually creating a Context like this: ```php $context = new \phpDocumentor\Reflection\Types\Context( '\My\Example', [ 'Types' => '\phpDocumentor\Reflection\Types'] ); ``` Or by using the `\phpDocumentor\Reflection\Types\ContextFactory` to instantiate a new context based on a Reflector object or by providing the namespace that you'd like to extract and the source code of the file in which the given type expression occurs. ```php $contextFactory = new \phpDocumentor\Reflection\Types\ContextFactory(); $context = $contextFactory->createFromReflector(new ReflectionMethod('\My\Example\Classy', '__construct')); ``` or ```php $contextFactory = new \phpDocumentor\Reflection\Types\ContextFactory(); $context = $contextFactory->createForNamespace('\My\Example', file_get_contents('My/Example/Classy.php')); ``` ### Using the Context After you have obtained a Context it is just a matter of passing it along with the `resolve` method of either Resolver class as second argument and the Resolvers will take this into account when resolving partial names. To obtain the resolved class name for the `@var` tag in the example above you can do: ```php $typeResolver = new \phpDocumentor\Reflection\TypeResolver(); $type = $typeResolver->resolve('Types\Context', $context); ``` When you do this you will receive an object of class `\phpDocumentor\Reflection\Types\Object_` for which you can call the `getFqsen` method to receive a Value Object that represents the complete FQSEN. So that would be `phpDocumentor\Reflection\Types\Context`. > Why is the FQSEN wrapped in another object `Object_`? > > The resolve method of the TypeResolver only returns object with the interface `Type` and the FQSEN is a common type that does not represent a Type. Also: in some cases a type can represent an "Untyped Object", meaning that it is an object (signified by the `object` keyword) but does not refer to a specific element using an FQSEN. Another example is on how to resolve the FQSEN of a method as can be seen with the `@see` tag in the example above. To resolve that you can do the following: ```php $fqsenResolver = new \phpDocumentor\Reflection\FqsenResolver(); $type = $fqsenResolver->resolve('Classy::otherFunction()', $context); ``` Because Classy is a Class in the current namespace its FQSEN will have the `My\Example` namespace and by calling the `resolve` method of the FQSEN Resolver you will receive an `Fqsen` object that refers to `\My\Example\Classy::otherFunction()`. PK!88type-resolver/LICENSEnuIwThe MIT License (MIT) Copyright (c) 2010 Mike van Riel 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. PK!%type-resolver/phpbench.jsonnuIw{ "bootstrap": "vendor/autoload.php", "path": "tests/benchmark", "extensions": [ "Jaapio\\Blackfire\\Extension" ], "blackfire" : { "env": "c12030d0-c177-47e2-b466-4994c40dc993" } } PK!qMtype-resolver/composer.jsonnuIw{ "name": "phpdocumentor/type-resolver", "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "type": "library", "license": "MIT", "authors": [ { "name": "Mike van Riel", "email": "me@mikevanriel.com" } ], "require": { "php": "^7.2 || ^8.0", "phpdocumentor/reflection-common": "^2.0" }, "require-dev": { "ext-tokenizer": "*" }, "autoload": { "psr-4": { "phpDocumentor\\Reflection\\": "src" } }, "autoload-dev": { "psr-4": { "phpDocumentor\\Reflection\\": ["tests/unit", "tests/benchmark"] } }, "extra": { "branch-alias": { "dev-1.x": "1.x-dev" } } } PK!ҟnn type-resolver/src/PseudoType.phpnuIw` * 2. `ACollectionObject` * * - ACollectionObject can be 'array' or an object that can act as an array * - aValueType and aKeyType can be any type expression * * @psalm-immutable */ final class Collection extends AbstractList { /** @var Fqsen|null */ private $fqsen; /** * Initializes this representation of an array with the given Type or Fqsen. */ public function __construct(?Fqsen $fqsen, Type $valueType, ?Type $keyType = null) { parent::__construct($valueType, $keyType); $this->fqsen = $fqsen; } /** * Returns the FQSEN associated with this object. */ public function getFqsen() : ?Fqsen { return $this->fqsen; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. */ public function __toString() : string { $objectType = (string) ($this->fqsen ?? 'object'); if ($this->keyType === null) { return $objectType . '<' . $this->valueType . '>'; } return $objectType . '<' . $this->keyType . ',' . $this->valueType . '>'; } } PK!#type-resolver/src/Types/Static_.phpnuIwvalueType = $valueType; } /** * Returns the value for the keys of this array. */ public function getValueType() : Type { return $this->valueType; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. */ public function __toString() : string { return '(' . $this->valueType . ')'; } } PK!||(type-resolver/src/Types/AbstractList.phpnuIwvalueType = $valueType; $this->defaultKeyType = new Compound([new String_(), new Integer()]); $this->keyType = $keyType; } /** * Returns the type for the keys of this array. */ public function getKeyType() : Type { return $this->keyType ?? $this->defaultKeyType; } /** * Returns the value for the keys of this array. */ public function getValueType() : Type { return $this->valueType; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. */ public function __toString() : string { if ($this->keyType) { return 'array<' . $this->keyType . ',' . $this->valueType . '>'; } if ($this->valueType instanceof Mixed_) { return 'array'; } if ($this->valueType instanceof Compound) { return '(' . $this->valueType . ')[]'; } return $this->valueType . '[]'; } } PK!$&mm%type-resolver/src/Types/Callable_.phpnuIw */ abstract class AggregatedType implements Type, IteratorAggregate { /** * @psalm-allow-private-mutation * @var array */ private $types = []; /** @var string */ private $token; /** * @param array $types */ public function __construct(array $types, string $token) { foreach ($types as $type) { $this->add($type); } $this->token = $token; } /** * Returns the type at the given index. */ public function get(int $index) : ?Type { if (!$this->has($index)) { return null; } return $this->types[$index]; } /** * Tests if this compound type has a type with the given index. */ public function has(int $index) : bool { return array_key_exists($index, $this->types); } /** * Tests if this compound type contains the given type. */ public function contains(Type $type) : bool { foreach ($this->types as $typePart) { // if the type is duplicate; do not add it if ((string) $typePart === (string) $type) { return true; } } return false; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. */ public function __toString() : string { return implode($this->token, $this->types); } /** * @return ArrayIterator */ public function getIterator() : ArrayIterator { return new ArrayIterator($this->types); } /** * @psalm-suppress ImpureMethodCall */ private function add(Type $type) : void { if ($type instanceof self) { foreach ($type->getIterator() as $subType) { $this->add($subType); } return; } // if the type is duplicate; do not add it if ($this->contains($type)) { return; } $this->types[] = $type; } } PK!/fqsen = $fqsen; } /** * Returns the FQSEN associated with this object. */ public function getFqsen() : ?Fqsen { return $this->fqsen; } public function __toString() : string { if ($this->fqsen) { return (string) $this->fqsen; } return 'object'; } } PK!bb#type-resolver/src/Types/Integer.phpnuIw $types */ public function __construct(array $types) { parent::__construct($types, '|'); } } PK!z(type-resolver/src/Types/Intersection.phpnuIw $types */ public function __construct(array $types) { parent::__construct($types, '&'); } } PK!-bMj:j:*type-resolver/src/Types/ContextFactory.phpnuIw $reflector */ return $this->createFromReflectionClass($reflector); } if ($reflector instanceof ReflectionParameter) { return $this->createFromReflectionParameter($reflector); } if ($reflector instanceof ReflectionMethod) { return $this->createFromReflectionMethod($reflector); } if ($reflector instanceof ReflectionProperty) { return $this->createFromReflectionProperty($reflector); } if ($reflector instanceof ReflectionClassConstant) { return $this->createFromReflectionClassConstant($reflector); } throw new UnexpectedValueException('Unhandled \Reflector instance given: ' . get_class($reflector)); } private function createFromReflectionParameter(ReflectionParameter $parameter) : Context { $class = $parameter->getDeclaringClass(); if (!$class) { throw new InvalidArgumentException('Unable to get class of ' . $parameter->getName()); } //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable /** @var ReflectionClass $class */ return $this->createFromReflectionClass($class); } private function createFromReflectionMethod(ReflectionMethod $method) : Context { //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable /** @var ReflectionClass $class */ $class = $method->getDeclaringClass(); return $this->createFromReflectionClass($class); } private function createFromReflectionProperty(ReflectionProperty $property) : Context { //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable /** @var ReflectionClass $class */ $class = $property->getDeclaringClass(); return $this->createFromReflectionClass($class); } private function createFromReflectionClassConstant(ReflectionClassConstant $constant) : Context { //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable /** @var ReflectionClass $class */ $class = $constant->getDeclaringClass(); return $this->createFromReflectionClass($class); } /** * @param ReflectionClass $class */ private function createFromReflectionClass(ReflectionClass $class) : Context { $fileName = $class->getFileName(); $namespace = $class->getNamespaceName(); if (is_string($fileName) && file_exists($fileName)) { $contents = file_get_contents($fileName); if ($contents === false) { throw new RuntimeException('Unable to read file "' . $fileName . '"'); } return $this->createForNamespace($namespace, $contents); } return new Context($namespace, []); } /** * Build a Context for a namespace in the provided file contents. * * @see Context for more information on Contexts. * * @param string $namespace It does not matter if a `\` precedes the namespace name, * this method first normalizes. * @param string $fileContents The file's contents to retrieve the aliases from with the given namespace. */ public function createForNamespace(string $namespace, string $fileContents) : Context { $namespace = trim($namespace, '\\'); $useStatements = []; $currentNamespace = ''; $tokens = new ArrayIterator(token_get_all($fileContents)); while ($tokens->valid()) { $currentToken = $tokens->current(); switch ($currentToken[0]) { case T_NAMESPACE: $currentNamespace = $this->parseNamespace($tokens); break; case T_CLASS: // Fast-forward the iterator through the class so that any // T_USE tokens found within are skipped - these are not // valid namespace use statements so should be ignored. $braceLevel = 0; $firstBraceFound = false; while ($tokens->valid() && ($braceLevel > 0 || !$firstBraceFound)) { $currentToken = $tokens->current(); if ($currentToken === '{' || in_array($currentToken[0], [T_CURLY_OPEN, T_DOLLAR_OPEN_CURLY_BRACES], true)) { if (!$firstBraceFound) { $firstBraceFound = true; } ++$braceLevel; } if ($currentToken === '}') { --$braceLevel; } $tokens->next(); } break; case T_USE: if ($currentNamespace === $namespace) { $useStatements += $this->parseUseStatement($tokens); } break; } $tokens->next(); } return new Context($namespace, $useStatements); } /** * Deduce the name from tokens when we are at the T_NAMESPACE token. * * @param ArrayIterator $tokens */ private function parseNamespace(ArrayIterator $tokens) : string { // skip to the first string or namespace separator $this->skipToNextStringOrNamespaceSeparator($tokens); $name = ''; $acceptedTokens = [T_STRING, T_NS_SEPARATOR, T_NAME_QUALIFIED]; while ($tokens->valid() && in_array($tokens->current()[0], $acceptedTokens, true)) { $name .= $tokens->current()[1]; $tokens->next(); } return $name; } /** * Deduce the names of all imports when we are at the T_USE token. * * @param ArrayIterator $tokens * * @return string[] * * @psalm-return array */ private function parseUseStatement(ArrayIterator $tokens) : array { $uses = []; while ($tokens->valid()) { $this->skipToNextStringOrNamespaceSeparator($tokens); $uses += $this->extractUseStatements($tokens); $currentToken = $tokens->current(); if ($currentToken[0] === self::T_LITERAL_END_OF_USE) { return $uses; } } return $uses; } /** * Fast-forwards the iterator as longs as we don't encounter a T_STRING or T_NS_SEPARATOR token. * * @param ArrayIterator $tokens */ private function skipToNextStringOrNamespaceSeparator(ArrayIterator $tokens) : void { while ($tokens->valid()) { $currentToken = $tokens->current(); if (in_array($currentToken[0], [T_STRING, T_NS_SEPARATOR], true)) { break; } if ($currentToken[0] === T_NAME_QUALIFIED) { break; } if (defined('T_NAME_FULLY_QUALIFIED') && $currentToken[0] === T_NAME_FULLY_QUALIFIED) { break; } $tokens->next(); } } /** * Deduce the namespace name and alias of an import when we are at the T_USE token or have not reached the end of * a USE statement yet. This will return a key/value array of the alias => namespace. * * @param ArrayIterator $tokens * * @return string[] * * @psalm-suppress TypeDoesNotContainType * * @psalm-return array */ private function extractUseStatements(ArrayIterator $tokens) : array { $extractedUseStatements = []; $groupedNs = ''; $currentNs = ''; $currentAlias = ''; $state = 'start'; while ($tokens->valid()) { $currentToken = $tokens->current(); $tokenId = is_string($currentToken) ? $currentToken : $currentToken[0]; $tokenValue = is_string($currentToken) ? null : $currentToken[1]; switch ($state) { case 'start': switch ($tokenId) { case T_STRING: case T_NS_SEPARATOR: $currentNs .= (string) $tokenValue; $currentAlias = $tokenValue; break; case T_NAME_QUALIFIED: case T_NAME_FULLY_QUALIFIED: $currentNs .= (string) $tokenValue; $currentAlias = substr( (string) $tokenValue, (int) (strrpos((string) $tokenValue, '\\')) + 1 ); break; case T_CURLY_OPEN: case '{': $state = 'grouped'; $groupedNs = $currentNs; break; case T_AS: $state = 'start-alias'; break; case self::T_LITERAL_USE_SEPARATOR: case self::T_LITERAL_END_OF_USE: $state = 'end'; break; default: break; } break; case 'start-alias': switch ($tokenId) { case T_STRING: $currentAlias = $tokenValue; break; case self::T_LITERAL_USE_SEPARATOR: case self::T_LITERAL_END_OF_USE: $state = 'end'; break; default: break; } break; case 'grouped': switch ($tokenId) { case T_STRING: case T_NS_SEPARATOR: $currentNs .= (string) $tokenValue; $currentAlias = $tokenValue; break; case T_AS: $state = 'grouped-alias'; break; case self::T_LITERAL_USE_SEPARATOR: $state = 'grouped'; $extractedUseStatements[(string) $currentAlias] = $currentNs; $currentNs = $groupedNs; $currentAlias = ''; break; case self::T_LITERAL_END_OF_USE: $state = 'end'; break; default: break; } break; case 'grouped-alias': switch ($tokenId) { case T_STRING: $currentAlias = $tokenValue; break; case self::T_LITERAL_USE_SEPARATOR: $state = 'grouped'; $extractedUseStatements[(string) $currentAlias] = $currentNs; $currentNs = $groupedNs; $currentAlias = ''; break; case self::T_LITERAL_END_OF_USE: $state = 'end'; break; default: break; } } if ($state === 'end') { break; } $tokens->next(); } if ($groupedNs !== $currentNs) { $extractedUseStatements[(string) $currentAlias] = $currentNs; } return $extractedUseStatements; } } PK!٬!type-resolver/src/Types/Self_.phpnuIwfqsen = $fqsen; } /** * Returns the FQSEN associated with this object. */ public function getFqsen() : ?Fqsen { return $this->fqsen; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. */ public function __toString() : string { if ($this->fqsen === null) { return 'class-string'; } return 'class-string<' . (string) $this->fqsen . '>'; } } PK!rr"type-resolver/src/Types/Mixed_.phpnuIw@ #type-resolver/src/Types/Context.phpnuIw Fully Qualified Namespace. * @psalm-var array */ private $namespaceAliases; /** * Initializes the new context and normalizes all passed namespaces to be in Qualified Namespace Name (QNN) * format (without a preceding `\`). * * @param string $namespace The namespace where this DocBlock resides in. * @param string[] $namespaceAliases List of namespace aliases => Fully Qualified Namespace. * * @psalm-param array $namespaceAliases */ public function __construct(string $namespace, array $namespaceAliases = []) { $this->namespace = $namespace !== 'global' && $namespace !== 'default' ? trim($namespace, '\\') : ''; foreach ($namespaceAliases as $alias => $fqnn) { if ($fqnn[0] === '\\') { $fqnn = substr($fqnn, 1); } if ($fqnn[strlen($fqnn) - 1] === '\\') { $fqnn = substr($fqnn, 0, -1); } $namespaceAliases[$alias] = $fqnn; } $this->namespaceAliases = $namespaceAliases; } /** * Returns the Qualified Namespace Name (thus without `\` in front) where the associated element is in. */ public function getNamespace() : string { return $this->namespace; } /** * Returns a list of Qualified Namespace Names (thus without `\` in front) that are imported, the keys represent * the alias for the imported Namespace. * * @return string[] * * @psalm-return array */ public function getNamespaceAliases() : array { return $this->namespaceAliases; } } PK!"B1eGG$type-resolver/src/Types/Nullable.phpnuIwrealType = $realType; } /** * Provide access to the actual type directly, if needed. */ public function getActualType() : Type { return $this->realType; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. */ public function __toString() : string { return '?' . $this->realType->__toString(); } } PK!9qq%type-resolver/src/Types/Resource_.phpnuIwkeyType) { return 'iterable<' . $this->keyType . ',' . $this->valueType . '>'; } if ($this->valueType instanceof Mixed_) { return 'iterable'; } return 'iterable<' . $this->valueType . '>'; } } PK!F!type-resolver/src/Types/Void_.phpnuIw List of recognized keywords and unto which Value Object they map * @psalm-var array> */ private $keywords = [ 'string' => Types\String_::class, 'class-string' => Types\ClassString::class, 'int' => Types\Integer::class, 'integer' => Types\Integer::class, 'bool' => Types\Boolean::class, 'boolean' => Types\Boolean::class, 'real' => Types\Float_::class, 'float' => Types\Float_::class, 'double' => Types\Float_::class, 'object' => Object_::class, 'mixed' => Types\Mixed_::class, 'array' => Array_::class, 'resource' => Types\Resource_::class, 'void' => Types\Void_::class, 'null' => Types\Null_::class, 'scalar' => Types\Scalar::class, 'callback' => Types\Callable_::class, 'callable' => Types\Callable_::class, 'false' => PseudoTypes\False_::class, 'true' => PseudoTypes\True_::class, 'self' => Types\Self_::class, '$this' => Types\This::class, 'static' => Types\Static_::class, 'parent' => Types\Parent_::class, 'iterable' => Iterable_::class, ]; /** * @var FqsenResolver * @psalm-readonly */ private $fqsenResolver; /** * Initializes this TypeResolver with the means to create and resolve Fqsen objects. */ public function __construct(?FqsenResolver $fqsenResolver = null) { $this->fqsenResolver = $fqsenResolver ?: new FqsenResolver(); } /** * Analyzes the given type and returns the FQCN variant. * * When a type is provided this method checks whether it is not a keyword or * Fully Qualified Class Name. If so it will use the given namespace and * aliases to expand the type to a FQCN representation. * * This method only works as expected if the namespace and aliases are set; * no dynamic reflection is being performed here. * * @uses Context::getNamespaceAliases() to check whether the first part of the relative type name should not be * replaced with another namespace. * @uses Context::getNamespace() to determine with what to prefix the type name. * * @param string $type The relative or absolute type. */ public function resolve(string $type, ?Context $context = null) : Type { $type = trim($type); if (!$type) { throw new InvalidArgumentException('Attempted to resolve "' . $type . '" but it appears to be empty'); } if ($context === null) { $context = new Context(''); } // split the type string into tokens `|`, `?`, `<`, `>`, `,`, `(`, `)`, `[]`, '<', '>' and type names $tokens = preg_split( '/(\\||\\?|<|>|&|, ?|\\(|\\)|\\[\\]+)/', $type, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE ); if ($tokens === false) { throw new InvalidArgumentException('Unable to split the type string "' . $type . '" into tokens'); } /** @var ArrayIterator $tokenIterator */ $tokenIterator = new ArrayIterator($tokens); return $this->parseTypes($tokenIterator, $context, self::PARSER_IN_COMPOUND); } /** * Analyse each tokens and creates types * * @param ArrayIterator $tokens the iterator on tokens * @param int $parserContext on of self::PARSER_* constants, indicating * the context where we are in the parsing */ private function parseTypes(ArrayIterator $tokens, Context $context, int $parserContext) : Type { $types = []; $token = ''; $compoundToken = '|'; while ($tokens->valid()) { $token = $tokens->current(); if ($token === null) { throw new RuntimeException( 'Unexpected nullable character' ); } if ($token === '|' || $token === '&') { if (count($types) === 0) { throw new RuntimeException( 'A type is missing before a type separator' ); } if (!in_array($parserContext, [ self::PARSER_IN_COMPOUND, self::PARSER_IN_ARRAY_EXPRESSION, self::PARSER_IN_COLLECTION_EXPRESSION, ], true) ) { throw new RuntimeException( 'Unexpected type separator' ); } $compoundToken = $token; $tokens->next(); } elseif ($token === '?') { if (!in_array($parserContext, [ self::PARSER_IN_COMPOUND, self::PARSER_IN_ARRAY_EXPRESSION, self::PARSER_IN_COLLECTION_EXPRESSION, ], true) ) { throw new RuntimeException( 'Unexpected nullable character' ); } $tokens->next(); $type = $this->parseTypes($tokens, $context, self::PARSER_IN_NULLABLE); $types[] = new Nullable($type); } elseif ($token === '(') { $tokens->next(); $type = $this->parseTypes($tokens, $context, self::PARSER_IN_ARRAY_EXPRESSION); $token = $tokens->current(); if ($token === null) { // Someone did not properly close their array expression .. break; } $tokens->next(); $resolvedType = new Expression($type); $types[] = $resolvedType; } elseif ($parserContext === self::PARSER_IN_ARRAY_EXPRESSION && $token[0] === ')') { break; } elseif ($token === '<') { if (count($types) === 0) { throw new RuntimeException( 'Unexpected collection operator "<", class name is missing' ); } $classType = array_pop($types); if ($classType !== null) { if ((string) $classType === 'class-string') { $types[] = $this->resolveClassString($tokens, $context); } else { $types[] = $this->resolveCollection($tokens, $classType, $context); } } $tokens->next(); } elseif ($parserContext === self::PARSER_IN_COLLECTION_EXPRESSION && ($token === '>' || trim($token) === ',') ) { break; } elseif ($token === self::OPERATOR_ARRAY) { end($types); $last = key($types); $lastItem = $types[$last]; if ($lastItem instanceof Expression) { $lastItem = $lastItem->getValueType(); } $types[$last] = new Array_($lastItem); $tokens->next(); } else { $type = $this->resolveSingleType($token, $context); $tokens->next(); if ($parserContext === self::PARSER_IN_NULLABLE) { return $type; } $types[] = $type; } } if ($token === '|' || $token === '&') { throw new RuntimeException( 'A type is missing after a type separator' ); } if (count($types) === 0) { if ($parserContext === self::PARSER_IN_NULLABLE) { throw new RuntimeException( 'A type is missing after a nullable character' ); } if ($parserContext === self::PARSER_IN_ARRAY_EXPRESSION) { throw new RuntimeException( 'A type is missing in an array expression' ); } if ($parserContext === self::PARSER_IN_COLLECTION_EXPRESSION) { throw new RuntimeException( 'A type is missing in a collection expression' ); } } elseif (count($types) === 1) { return $types[0]; } if ($compoundToken === '|') { return new Compound(array_values($types)); } return new Intersection(array_values($types)); } /** * resolve the given type into a type object * * @param string $type the type string, representing a single type * * @return Type|Array_|Object_ * * @psalm-mutation-free */ private function resolveSingleType(string $type, Context $context) : object { switch (true) { case $this->isKeyword($type): return $this->resolveKeyword($type); case $this->isFqsen($type): return $this->resolveTypedObject($type); case $this->isPartialStructuralElementName($type): return $this->resolveTypedObject($type, $context); // @codeCoverageIgnoreStart default: // I haven't got the foggiest how the logic would come here but added this as a defense. throw new RuntimeException( 'Unable to resolve type "' . $type . '", there is no known method to resolve it' ); } // @codeCoverageIgnoreEnd } /** * Adds a keyword to the list of Keywords and associates it with a specific Value Object. * * @psalm-param class-string $typeClassName */ public function addKeyword(string $keyword, string $typeClassName) : void { if (!class_exists($typeClassName)) { throw new InvalidArgumentException( 'The Value Object that needs to be created with a keyword "' . $keyword . '" must be an existing class' . ' but we could not find the class ' . $typeClassName ); } if (!in_array(Type::class, class_implements($typeClassName), true)) { throw new InvalidArgumentException( 'The class "' . $typeClassName . '" must implement the interface "phpDocumentor\Reflection\Type"' ); } $this->keywords[$keyword] = $typeClassName; } /** * Detects whether the given type represents a PHPDoc keyword. * * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. * * @psalm-mutation-free */ private function isKeyword(string $type) : bool { return array_key_exists(strtolower($type), $this->keywords); } /** * Detects whether the given type represents a relative structural element name. * * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. * * @psalm-mutation-free */ private function isPartialStructuralElementName(string $type) : bool { return ($type[0] !== self::OPERATOR_NAMESPACE) && !$this->isKeyword($type); } /** * Tests whether the given type is a Fully Qualified Structural Element Name. * * @psalm-mutation-free */ private function isFqsen(string $type) : bool { return strpos($type, self::OPERATOR_NAMESPACE) === 0; } /** * Resolves the given keyword (such as `string`) into a Type object representing that keyword. * * @psalm-mutation-free */ private function resolveKeyword(string $type) : Type { $className = $this->keywords[strtolower($type)]; return new $className(); } /** * Resolves the given FQSEN string into an FQSEN object. * * @psalm-mutation-free */ private function resolveTypedObject(string $type, ?Context $context = null) : Object_ { return new Object_($this->fqsenResolver->resolve($type, $context)); } /** * Resolves class string * * @param ArrayIterator $tokens */ private function resolveClassString(ArrayIterator $tokens, Context $context) : Type { $tokens->next(); $classType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); if (!$classType instanceof Object_ || $classType->getFqsen() === null) { throw new RuntimeException( $classType . ' is not a class string' ); } $token = $tokens->current(); if ($token !== '>') { if (empty($token)) { throw new RuntimeException( 'class-string: ">" is missing' ); } throw new RuntimeException( 'Unexpected character "' . $token . '", ">" is missing' ); } return new ClassString($classType->getFqsen()); } /** * Resolves the collection values and keys * * @param ArrayIterator $tokens * * @return Array_|Iterable_|Collection */ private function resolveCollection(ArrayIterator $tokens, Type $classType, Context $context) : Type { $isArray = ((string) $classType === 'array'); $isIterable = ((string) $classType === 'iterable'); // allow only "array", "iterable" or class name before "<" if (!$isArray && !$isIterable && (!$classType instanceof Object_ || $classType->getFqsen() === null)) { throw new RuntimeException( $classType . ' is not a collection' ); } $tokens->next(); $valueType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); $keyType = null; $token = $tokens->current(); if ($token !== null && trim($token) === ',') { // if we have a comma, then we just parsed the key type, not the value type $keyType = $valueType; if ($isArray) { // check the key type for an "array" collection. We allow only // strings or integers. if (!$keyType instanceof String_ && !$keyType instanceof Integer && !$keyType instanceof Compound ) { throw new RuntimeException( 'An array can have only integers or strings as keys' ); } if ($keyType instanceof Compound) { foreach ($keyType->getIterator() as $item) { if (!$item instanceof String_ && !$item instanceof Integer ) { throw new RuntimeException( 'An array can have only integers or strings as keys' ); } } } } $tokens->next(); // now let's parse the value type $valueType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); } $token = $tokens->current(); if ($token !== '>') { if (empty($token)) { throw new RuntimeException( 'Collection: ">" is missing' ); } throw new RuntimeException( 'Unexpected character "' . $token . '", ">" is missing' ); } if ($isArray) { return new Array_($valueType, $keyType); } if ($isIterable) { return new Iterable_($valueType, $keyType); } if ($classType instanceof Object_) { return $this->makeCollectionFromObject($classType, $valueType, $keyType); } throw new RuntimeException('Invalid $classType provided'); } /** * @psalm-pure */ private function makeCollectionFromObject(Object_ $object, Type $valueType, ?Type $keyType = null) : Collection { return new Collection($object->getFqsen(), $valueType, $keyType); } } PK!G6x#type-resolver/src/FqsenResolver.phpnuIwisFqsen($fqsen)) { return new Fqsen($fqsen); } return $this->resolvePartialStructuralElementName($fqsen, $context); } /** * Tests whether the given type is a Fully Qualified Structural Element Name. */ private function isFqsen(string $type) : bool { return strpos($type, self::OPERATOR_NAMESPACE) === 0; } /** * Resolves a partial Structural Element Name (i.e. `Reflection\DocBlock`) to its FQSEN representation * (i.e. `\phpDocumentor\Reflection\DocBlock`) based on the Namespace and aliases mentioned in the Context. * * @throws InvalidArgumentException When type is not a valid FQSEN. */ private function resolvePartialStructuralElementName(string $type, Context $context) : Fqsen { $typeParts = explode(self::OPERATOR_NAMESPACE, $type, 2); $namespaceAliases = $context->getNamespaceAliases(); // if the first segment is not an alias; prepend namespace name and return if (!isset($namespaceAliases[$typeParts[0]])) { $namespace = $context->getNamespace(); if ($namespace !== '') { $namespace .= self::OPERATOR_NAMESPACE; } return new Fqsen(self::OPERATOR_NAMESPACE . $namespace . $type); } $typeParts[0] = $namespaceAliases[$typeParts[0]]; return new Fqsen(self::OPERATOR_NAMESPACE . implode(self::OPERATOR_NAMESPACE, $typeParts)); } } PK!"WAss(type-resolver/src/PseudoTypes/False_.phpnuIwfqsen = $fqsen; if (isset($matches[2])) { $this->name = $matches[2]; } else { $matches = explode('\\', $fqsen); $name = end($matches); assert(is_string($name)); $this->name = trim($name, '()'); } } /** * converts this class to string. */ public function __toString() : string { return $this->fqsen; } /** * Returns the name of the element without path. */ public function getName() : string { return $this->name; } } PK!2XX(reflection-common/src/ProjectFactory.phpnuIwlineNumber = $lineNumber; $this->columnNumber = $columnNumber; } /** * Returns the line number that is covered by this location. */ public function getLineNumber() : int { return $this->lineNumber; } /** * Returns the column number (character position on a line) for this location object. */ public function getColumnNumber() : int { return $this->columnNumber; } } PK!079!reflection-common/src/Project.phpnuIwcreate($docComment); ``` The `create` method will yield an object of type `\phpDocumentor\Reflection\DocBlock` whose methods can be queried: ```php // Contains the summary for this DocBlock $summary = $docblock->getSummary(); // Contains \phpDocumentor\Reflection\DocBlock\Description object $description = $docblock->getDescription(); // You can either cast it to string $description = (string) $docblock->getDescription(); // Or use the render method to get a string representation of the Description. $description = $docblock->getDescription()->render(); ``` > For more examples it would be best to review the scripts in the [`/examples` folder](/examples). PK!88reflection-docblock/LICENSEnuIwThe MIT License (MIT) Copyright (c) 2010 Mike van Riel 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. PK!LAw<<!reflection-docblock/composer.jsonnuIw{ "name": "phpdocumentor/reflection-docblock", "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "type": "library", "license": "MIT", "authors": [ { "name": "Mike van Riel", "email": "me@mikevanriel.com" }, { "name": "Jaap van Otterdijk", "email": "account@ijaap.nl" } ], "require": { "php": "^7.2 || ^8.0", "phpdocumentor/type-resolver": "^1.3", "webmozart/assert": "^1.9.1", "phpdocumentor/reflection-common": "^2.2", "ext-filter": "*" }, "require-dev": { "mockery/mockery": "~1.3.2" }, "autoload": { "psr-4": { "phpDocumentor\\Reflection\\": "src" } }, "autoload-dev": { "psr-4": { "phpDocumentor\\Reflection\\": "tests/unit" } }, "extra": { "branch-alias": { "dev-master": "5.x-dev" } } } PK!/qH{{$reflection-docblock/src/DocBlock.phpnuIwsummary = $summary; $this->description = $description ?: new DocBlock\Description(''); foreach ($tags as $tag) { $this->addTag($tag); } $this->context = $context; $this->location = $location; $this->isTemplateEnd = $isTemplateEnd; $this->isTemplateStart = $isTemplateStart; } public function getSummary() : string { return $this->summary; } public function getDescription() : DocBlock\Description { return $this->description; } /** * Returns the current context. */ public function getContext() : ?Types\Context { return $this->context; } /** * Returns the current location. */ public function getLocation() : ?Location { return $this->location; } /** * Returns whether this DocBlock is the start of a Template section. * * A Docblock may serve as template for a series of subsequent DocBlocks. This is indicated by a special marker * (`#@+`) that is appended directly after the opening `/**` of a DocBlock. * * An example of such an opening is: * * ``` * /**#@+ * * My DocBlock * * / * ``` * * The description and tags (not the summary!) are copied onto all subsequent DocBlocks and also applied to all * elements that follow until another DocBlock is found that contains the closing marker (`#@-`). * * @see self::isTemplateEnd() for the check whether a closing marker was provided. */ public function isTemplateStart() : bool { return $this->isTemplateStart; } /** * Returns whether this DocBlock is the end of a Template section. * * @see self::isTemplateStart() for a more complete description of the Docblock Template functionality. */ public function isTemplateEnd() : bool { return $this->isTemplateEnd; } /** * Returns the tags for this DocBlock. * * @return Tag[] */ public function getTags() : array { return $this->tags; } /** * Returns an array of tags matching the given name. If no tags are found * an empty array is returned. * * @param string $name String to search by. * * @return Tag[] */ public function getTagsByName(string $name) : array { $result = []; foreach ($this->getTags() as $tag) { if ($tag->getName() !== $name) { continue; } $result[] = $tag; } return $result; } /** * Checks if a tag of a certain type is present in this DocBlock. * * @param string $name Tag name to check for. */ public function hasTag(string $name) : bool { foreach ($this->getTags() as $tag) { if ($tag->getName() === $name) { return true; } } return false; } /** * Remove a tag from this DocBlock. * * @param Tag $tagToRemove The tag to remove. */ public function removeTag(Tag $tagToRemove) : void { foreach ($this->tags as $key => $tag) { if ($tag === $tagToRemove) { unset($this->tags[$key]); break; } } } /** * Adds a tag to this DocBlock. * * @param Tag $tag The tag to add. */ private function addTag(Tag $tag) : void { $this->tags[] = $tag; } } PK!g2 2 !reflection-docblock/src/Utils.phpnuIwversion = $version; $this->description = $description; } public static function create( ?string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ) : ?self { if (empty($body)) { return new static(); } $matches = []; if (!preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) { return null; } $description = null; if ($descriptionFactory !== null) { $description = $descriptionFactory->create($matches[2] ?? '', $context); } return new static( $matches[1], $description ); } /** * Gets the version section of the tag. */ public function getVersion() : ?string { return $this->version; } /** * Returns a string representation for this tag. */ public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $version = (string) $this->version; return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); } } PK!e؋{{1reflection-docblock/src/DocBlock/Tags/BaseTag.phpnuIwname; } public function getDescription() : ?Description { return $this->description; } public function render(?Formatter $formatter = null) : string { if ($formatter === null) { $formatter = new Formatter\PassthroughFormatter(); } return $formatter->format($this); } } PK!82reflection-docblock/src/DocBlock/Tags/Property.phpnuIwname = 'property'; $this->variableName = $variableName; $this->type = $type; $this->description = $description; } public static function create( string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ) : self { Assert::stringNotEmpty($body); Assert::notNull($typeResolver); Assert::notNull($descriptionFactory); [$firstPart, $body] = self::extractTypeFromBody($body); $type = null; $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); $variableName = ''; // if the first item that is encountered is not a variable; it is a type if ($firstPart && $firstPart[0] !== '$') { $type = $typeResolver->resolve($firstPart, $context); } else { // first part is not a type; we should prepend it to the parts array for further processing array_unshift($parts, $firstPart); } // if the next item starts with a $ it must be the variable name if (isset($parts[0]) && strpos($parts[0], '$') === 0) { $variableName = array_shift($parts); if ($type) { array_shift($parts); } Assert::notNull($variableName); $variableName = substr($variableName, 1); } $description = $descriptionFactory->create(implode('', $parts), $context); return new static($variableName, $type, $description); } /** * Returns the variable's name. */ public function getVariableName() : ?string { return $this->variableName; } /** * Returns a string representation for this tag. */ public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } if ($this->variableName) { $variableName = '$' . $this->variableName; } else { $variableName = ''; } $type = (string) $this->type; return $type . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); } } PK!t.reflection-docblock/src/DocBlock/Tags/Link.phpnuIwlink = $link; $this->description = $description; } public static function create( string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ) : self { Assert::notNull($descriptionFactory); $parts = Utils::pregSplit('/\s+/Su', $body, 2); $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null; return new static($parts[0], $description); } /** * Gets the link */ public function getLink() : string { return $this->link; } /** * Returns a string representation for this tag. */ public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $link = (string) $this->link; return $link . ($description !== '' ? ($link !== '' ? ' ' : '') . $description : ''); } } PK!."--1reflection-docblock/src/DocBlock/Tags/Return_.phpnuIwname = 'return'; $this->type = $type; $this->description = $description; } public static function create( string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ) : self { Assert::notNull($typeResolver); Assert::notNull($descriptionFactory); [$type, $description] = self::extractTypeFromBody($body); $type = $typeResolver->resolve($type, $context); $description = $descriptionFactory->create($description, $context); return new static($type, $description); } public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $type = $this->type ? '' . $this->type : 'mixed'; return $type . ($description !== '' ? ($type !== '' ? ' ' : '') . $description : ''); } } PK!J\ \ 0reflection-docblock/src/DocBlock/Tags/Method.phpnuIw * @var array> */ private $arguments; /** @var bool */ private $isStatic; /** @var Type */ private $returnType; /** * @param array> $arguments * * @phpstan-param array $arguments */ public function __construct( string $methodName, array $arguments = [], ?Type $returnType = null, bool $static = false, ?Description $description = null ) { Assert::stringNotEmpty($methodName); if ($returnType === null) { $returnType = new Void_(); } $this->methodName = $methodName; $this->arguments = $this->filterArguments($arguments); $this->returnType = $returnType; $this->isStatic = $static; $this->description = $description; } public static function create( string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ) : ?self { Assert::stringNotEmpty($body); Assert::notNull($typeResolver); Assert::notNull($descriptionFactory); // 1. none or more whitespace // 2. optionally the keyword "static" followed by whitespace // 3. optionally a word with underscores followed by whitespace : as // type for the return value // 4. then optionally a word with underscores followed by () and // whitespace : as method name as used by phpDocumentor // 5. then a word with underscores, followed by ( and any character // until a ) and whitespace : as method name with signature // 6. any remaining text : as description if (!preg_match( '/^ # Static keyword # Declares a static method ONLY if type is also present (?: (static) \s+ )? # Return type (?: ( (?:[\w\|_\\\\]*\$this[\w\|_\\\\]*) | (?: (?:[\w\|_\\\\]+) # array notation (?:\[\])* )*+ ) \s+ )? # Method name ([\w_]+) # Arguments (?: \(([^\)]*)\) )? \s* # Description (.*) $/sux', $body, $matches )) { return null; } [, $static, $returnType, $methodName, $argumentLines, $description] = $matches; $static = $static === 'static'; if ($returnType === '') { $returnType = 'void'; } $returnType = $typeResolver->resolve($returnType, $context); $description = $descriptionFactory->create($description, $context); /** @phpstan-var array $arguments */ $arguments = []; if ($argumentLines !== '') { $argumentsExploded = explode(',', $argumentLines); foreach ($argumentsExploded as $argument) { $argument = explode(' ', self::stripRestArg(trim($argument)), 2); if (strpos($argument[0], '$') === 0) { $argumentName = substr($argument[0], 1); $argumentType = new Mixed_(); } else { $argumentType = $typeResolver->resolve($argument[0], $context); $argumentName = ''; if (isset($argument[1])) { $argument[1] = self::stripRestArg($argument[1]); $argumentName = substr($argument[1], 1); } } $arguments[] = ['name' => $argumentName, 'type' => $argumentType]; } } return new static($methodName, $arguments, $returnType, $static, $description); } /** * Retrieves the method name. */ public function getMethodName() : string { return $this->methodName; } /** * @return array> * * @phpstan-return array */ public function getArguments() : array { return $this->arguments; } /** * Checks whether the method tag describes a static method or not. * * @return bool TRUE if the method declaration is for a static method, FALSE otherwise. */ public function isStatic() : bool { return $this->isStatic; } public function getReturnType() : Type { return $this->returnType; } public function __toString() : string { $arguments = []; foreach ($this->arguments as $argument) { $arguments[] = $argument['type'] . ' $' . $argument['name']; } $argumentStr = '(' . implode(', ', $arguments) . ')'; if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $static = $this->isStatic ? 'static' : ''; $returnType = (string) $this->returnType; $methodName = (string) $this->methodName; return $static . ($returnType !== '' ? ($static !== '' ? ' ' : '') . $returnType : '') . ($methodName !== '' ? ($static !== '' || $returnType !== '' ? ' ' : '') . $methodName : '') . $argumentStr . ($description !== '' ? ' ' . $description : ''); } /** * @param mixed[][]|string[] $arguments * * @return mixed[][] * * @phpstan-param array $arguments * @phpstan-return array */ private function filterArguments(array $arguments = []) : array { $result = []; foreach ($arguments as $argument) { if (is_string($argument)) { $argument = ['name' => $argument]; } if (!isset($argument['type'])) { $argument['type'] = new Mixed_(); } $keys = array_keys($argument); sort($keys); if ($keys !== ['name', 'type']) { throw new InvalidArgumentException( 'Arguments can only have the "name" and "type" fields, found: ' . var_export($keys, true) ); } $result[] = $argument; } return $result; } private static function stripRestArg(string $argument) : string { if (strpos($argument, '...') === 0) { $argument = trim(substr($argument, 3)); } return $argument; } } PK!ះ4reflection-docblock/src/DocBlock/Tags/InvalidTag.phpnuIwname = $name; $this->body = $body; } public function getException() : ?Throwable { return $this->throwable; } public function getName() : string { return $this->name; } public static function create(string $body, string $name = '') : self { return new self($name, $body); } public function withError(Throwable $exception) : self { $this->flattenExceptionBacktrace($exception); $tag = new self($this->name, $this->body); $tag->throwable = $exception; return $tag; } /** * Removes all complex types from backtrace * * Not all objects are serializable. So we need to remove them from the * stored exception to be sure that we do not break existing library usage. */ private function flattenExceptionBacktrace(Throwable $exception) : void { $traceProperty = (new ReflectionClass(Exception::class))->getProperty('trace'); $traceProperty->setAccessible(true); do { $trace = $exception->getTrace(); if (isset($trace[0]['args'])) { $trace = array_map( function (array $call) : array { $call['args'] = array_map([$this, 'flattenArguments'], $call['args']); return $call; }, $trace ); } $traceProperty->setValue($exception, $trace); $exception = $exception->getPrevious(); } while ($exception !== null); $traceProperty->setAccessible(false); } /** * @param mixed $value * * @return mixed * * @throws ReflectionException */ private function flattenArguments($value) { if ($value instanceof Closure) { $closureReflection = new ReflectionFunction($value); $value = sprintf( '(Closure at %s:%s)', $closureReflection->getFileName(), $closureReflection->getStartLine() ); } elseif (is_object($value)) { $value = sprintf('object(%s)', get_class($value)); } elseif (is_resource($value)) { $value = sprintf('resource(%s)', get_resource_type($value)); } elseif (is_array($value)) { $value = array_map([$this, 'flattenArguments'], $value); } return $value; } public function render(?Formatter $formatter = null) : string { if ($formatter === null) { $formatter = new Formatter\PassthroughFormatter(); } return $formatter->format($this); } public function __toString() : string { return $this->body; } } PK!7reflection-docblock/src/DocBlock/Tags/Reference/Url.phpnuIwuri = $uri; } public function __toString() : string { return $this->uri; } } PK! v  9reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.phpnuIwfqsen = $fqsen; } /** * @return string string representation of the referenced fqsen */ public function __toString() : string { return (string) $this->fqsen; } } PK!.=reflection-docblock/src/DocBlock/Tags/Reference/Reference.phpnuIwstartingLine = (int) $startingLine; $this->lineCount = $lineCount !== null ? (int) $lineCount : null; $this->description = $description; } public static function create( string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ) : self { Assert::stringNotEmpty($body); Assert::notNull($descriptionFactory); $startingLine = 1; $lineCount = null; $description = null; // Starting line / Number of lines / Description if (preg_match('/^([1-9]\d*)\s*(?:((?1))\s+)?(.*)$/sux', $body, $matches)) { $startingLine = (int) $matches[1]; if (isset($matches[2]) && $matches[2] !== '') { $lineCount = (int) $matches[2]; } $description = $matches[3]; } return new static($startingLine, $lineCount, $descriptionFactory->create($description??'', $context)); } /** * Gets the starting line. * * @return int The starting line, relative to the structural element's * location. */ public function getStartingLine() : int { return $this->startingLine; } /** * Returns the number of lines. * * @return int|null The number of lines, relative to the starting line. NULL * means "to the end". */ public function getLineCount() : ?int { return $this->lineCount; } public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $startingLine = (string) $this->startingLine; $lineCount = $this->lineCount !== null ? '' . $this->lineCount : ''; return $startingLine . ($lineCount !== '' ? ($startingLine || $startingLine === '0' ? ' ' : '') . $lineCount : '') . ($description !== '' ? ($startingLine || $startingLine === '0' || $lineCount !== '' ? ' ' : '') . $description : ''); } } PK!55reflection-docblock/src/DocBlock/Tags/TagWithType.phpnuIwtype; } /** * @return string[] */ protected static function extractTypeFromBody(string $body) : array { $type = ''; $nestingLevel = 0; for ($i = 0, $iMax = strlen($body); $i < $iMax; $i++) { $character = $body[$i]; if ($nestingLevel === 0 && trim($character) === '') { break; } $type .= $character; if (in_array($character, ['<', '(', '[', '{'])) { $nestingLevel++; continue; } if (in_array($character, ['>', ')', ']', '}'])) { $nestingLevel--; continue; } } $description = trim(substr($body, strlen($type))); return [$type, $description]; } } PK![Ϩ 1reflection-docblock/src/DocBlock/Tags/Generic.phpnuIwvalidateTagName($name); $this->name = $name; $this->description = $description; } /** * Creates a new tag that represents any unknown tag type. * * @return static */ public static function create( string $body, string $name = '', ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ) : self { Assert::stringNotEmpty($name); Assert::notNull($descriptionFactory); $description = $body !== '' ? $descriptionFactory->create($body, $context) : null; return new static($name, $description); } /** * Returns the tag as a serialized string */ public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } return $description; } /** * Validates if the tag name matches the expected format, otherwise throws an exception. */ private function validateTagName(string $name) : void { if (!preg_match('/^' . StandardTagFactory::REGEX_TAGNAME . '$/u', $name)) { throw new InvalidArgumentException( 'The tag name "' . $name . '" is not wellformed. Tags may only consist of letters, underscores, ' . 'hyphens and backslashes.' ); } } } PK!oVU0reflection-docblock/src/DocBlock/Tags/Throws.phpnuIwname = 'throws'; $this->type = $type; $this->description = $description; } public static function create( string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ) : self { Assert::notNull($typeResolver); Assert::notNull($descriptionFactory); [$type, $description] = self::extractTypeFromBody($body); $type = $typeResolver->resolve($type, $context); $description = $descriptionFactory->create($description, $context); return new static($type, $description); } public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $type = (string) $this->type; return $type . ($description !== '' ? ($type !== '' ? ' ' : '') . $description : ''); } } PK!!N2 .reflection-docblock/src/DocBlock/Tags/Var_.phpnuIwname = 'var'; $this->variableName = $variableName; $this->type = $type; $this->description = $description; } public static function create( string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ) : self { Assert::stringNotEmpty($body); Assert::notNull($typeResolver); Assert::notNull($descriptionFactory); [$firstPart, $body] = self::extractTypeFromBody($body); $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); $type = null; $variableName = ''; // if the first item that is encountered is not a variable; it is a type if ($firstPart && $firstPart[0] !== '$') { $type = $typeResolver->resolve($firstPart, $context); } else { // first part is not a type; we should prepend it to the parts array for further processing array_unshift($parts, $firstPart); } // if the next item starts with a $ it must be the variable name if (isset($parts[0]) && strpos($parts[0], '$') === 0) { $variableName = array_shift($parts); if ($type) { array_shift($parts); } Assert::notNull($variableName); $variableName = substr($variableName, 1); } $description = $descriptionFactory->create(implode('', $parts), $context); return new static($variableName, $type, $description); } /** * Returns the variable's name. */ public function getVariableName() : ?string { return $this->variableName; } /** * Returns a string representation for this tag. */ public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } if ($this->variableName) { $variableName = '$' . $this->variableName; } else { $variableName = ''; } $type = (string) $this->type; return $type . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); } } PK!#5 5 4reflection-docblock/src/DocBlock/Tags/Deprecated.phpnuIwversion = $version; $this->description = $description; } /** * @return static */ public static function create( ?string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ) : self { if (empty($body)) { return new static(); } $matches = []; if (!preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) { return new static( null, $descriptionFactory !== null ? $descriptionFactory->create($body, $context) : null ); } Assert::notNull($descriptionFactory); return new static( $matches[1], $descriptionFactory->create($matches[2] ?? '', $context) ); } /** * Gets the version section of the tag. */ public function getVersion() : ?string { return $this->version; } /** * Returns a string representation for this tag. */ public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $version = (string) $this->version; return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); } } PK!es s /reflection-docblock/src/DocBlock/Tags/Since.phpnuIwversion = $version; $this->description = $description; } public static function create( ?string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ) : ?self { if (empty($body)) { return new static(); } $matches = []; if (!preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) { return null; } Assert::notNull($descriptionFactory); return new static( $matches[1], $descriptionFactory->create($matches[2] ?? '', $context) ); } /** * Gets the version section of the tag. */ public function getVersion() : ?string { return $this->version; } /** * Returns a string representation for this tag. */ public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $version = (string) $this->version; return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); } } PK!OO)  7reflection-docblock/src/DocBlock/Tags/PropertyWrite.phpnuIwname = 'property-write'; $this->variableName = $variableName; $this->type = $type; $this->description = $description; } public static function create( string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ) : self { Assert::stringNotEmpty($body); Assert::notNull($typeResolver); Assert::notNull($descriptionFactory); [$firstPart, $body] = self::extractTypeFromBody($body); $type = null; $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); $variableName = ''; // if the first item that is encountered is not a variable; it is a type if ($firstPart && $firstPart[0] !== '$') { $type = $typeResolver->resolve($firstPart, $context); } else { // first part is not a type; we should prepend it to the parts array for further processing array_unshift($parts, $firstPart); } // if the next item starts with a $ it must be the variable name if (isset($parts[0]) && strpos($parts[0], '$') === 0) { $variableName = array_shift($parts); if ($type) { array_shift($parts); } Assert::notNull($variableName); $variableName = substr($variableName, 1); } $description = $descriptionFactory->create(implode('', $parts), $context); return new static($variableName, $type, $description); } /** * Returns the variable's name. */ public function getVariableName() : ?string { return $this->variableName; } /** * Returns a string representation for this tag. */ public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } if ($this->variableName) { $variableName = '$' . $this->variableName; } else { $variableName = ''; } $type = (string) $this->type; return $type . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); } } PK! e.Hreflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.phpnuIwgetName() . ' ' . $tag); } } PK!x폣Breflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.phpnuIwmaxLen = max($this->maxLen, strlen($tag->getName())); } } /** * Formats the given tag to return a simple plain text version. */ public function format(Tag $tag) : string { return '@' . $tag->getName() . str_repeat( ' ', $this->maxLen - strlen($tag->getName()) + 1 ) . $tag; } } PK!v=,+3reflection-docblock/src/DocBlock/Tags/Formatter.phpnuIwname = 'property-read'; $this->variableName = $variableName; $this->type = $type; $this->description = $description; } public static function create( string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ) : self { Assert::stringNotEmpty($body); Assert::notNull($typeResolver); Assert::notNull($descriptionFactory); [$firstPart, $body] = self::extractTypeFromBody($body); $type = null; $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); $variableName = ''; // if the first item that is encountered is not a variable; it is a type if ($firstPart && $firstPart[0] !== '$') { $type = $typeResolver->resolve($firstPart, $context); } else { // first part is not a type; we should prepend it to the parts array for further processing array_unshift($parts, $firstPart); } // if the next item starts with a $ it must be the variable name if (isset($parts[0]) && strpos($parts[0], '$') === 0) { $variableName = array_shift($parts); if ($type) { array_shift($parts); } Assert::notNull($variableName); $variableName = substr($variableName, 1); } $description = $descriptionFactory->create(implode('', $parts), $context); return new static($variableName, $type, $description); } /** * Returns the variable's name. */ public function getVariableName() : ?string { return $this->variableName; } /** * Returns a string representation for this tag. */ public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } if ($this->variableName) { $variableName = '$' . $this->variableName; } else { $variableName = ''; } $type = (string) $this->type; return $type . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); } } PK!)T T .reflection-docblock/src/DocBlock/Tags/Uses.phpnuIwrefers = $refers; $this->description = $description; } public static function create( string $body, ?FqsenResolver $resolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ) : self { Assert::notNull($resolver); Assert::notNull($descriptionFactory); $parts = Utils::pregSplit('/\s+/Su', $body, 2); return new static( self::resolveFqsen($parts[0], $resolver, $context), $descriptionFactory->create($parts[1] ?? '', $context) ); } private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context) : Fqsen { Assert::notNull($fqsenResolver); $fqsenParts = explode('::', $parts); $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); if (!array_key_exists(1, $fqsenParts)) { return $resolved; } return new Fqsen($resolved . '::' . $fqsenParts[1]); } /** * Returns the structural element this tag refers to. */ public function getReference() : Fqsen { return $this->refers; } /** * Returns a string representation of this tag. */ public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $refers = (string) $this->refers; return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); } } PK!  1reflection-docblock/src/DocBlock/Tags/Example.phpnuIwfilePath = $filePath; $this->startingLine = $startingLine; $this->lineCount = $lineCount; if ($content !== null) { $this->content = trim($content); } $this->isURI = $isURI; } public function getContent() : string { if ($this->content === null || $this->content === '') { $filePath = $this->filePath; if ($this->isURI) { $filePath = $this->isUriRelative($this->filePath) ? str_replace('%2F', '/', rawurlencode($this->filePath)) : $this->filePath; } return trim($filePath); } return $this->content; } public function getDescription() : ?string { return $this->content; } public static function create(string $body) : ?Tag { // File component: File path in quotes or File URI / Source information if (!preg_match('/^\s*(?:(\"[^\"]+\")|(\S+))(?:\s+(.*))?$/sux', $body, $matches)) { return null; } $filePath = null; $fileUri = null; if ($matches[1] !== '') { $filePath = $matches[1]; } else { $fileUri = $matches[2]; } $startingLine = 1; $lineCount = 0; $description = null; if (array_key_exists(3, $matches)) { $description = $matches[3]; // Starting line / Number of lines / Description if (preg_match('/^([1-9]\d*)(?:\s+((?1))\s*)?(.*)$/sux', $matches[3], $contentMatches)) { $startingLine = (int) $contentMatches[1]; if (isset($contentMatches[2])) { $lineCount = (int) $contentMatches[2]; } if (array_key_exists(3, $contentMatches)) { $description = $contentMatches[3]; } } } return new static( $filePath ?? ($fileUri ?? ''), $fileUri !== null, $startingLine, $lineCount, $description ); } /** * Returns the file path. * * @return string Path to a file to use as an example. * May also be an absolute URI. */ public function getFilePath() : string { return trim($this->filePath, '"'); } /** * Returns a string representation for this tag. */ public function __toString() : string { $filePath = (string) $this->filePath; $isDefaultLine = $this->startingLine === 1 && $this->lineCount === 0; $startingLine = !$isDefaultLine ? (string) $this->startingLine : ''; $lineCount = !$isDefaultLine ? (string) $this->lineCount : ''; $content = (string) $this->content; return $filePath . ($startingLine !== '' ? ($filePath !== '' ? ' ' : '') . $startingLine : '') . ($lineCount !== '' ? ($filePath !== '' || $startingLine !== '' ? ' ' : '') . $lineCount : '') . ($content !== '' ? ($filePath !== '' || $startingLine !== '' || $lineCount !== '' ? ' ' : '') . $content : ''); } /** * Returns true if the provided URI is relative or contains a complete scheme (and thus is absolute). */ private function isUriRelative(string $uri) : bool { return strpos($uri, ':') === false; } public function getStartingLine() : int { return $this->startingLine; } public function getLineCount() : int { return $this->lineCount; } public function getName() : string { return 'example'; } public function render(?Formatter $formatter = null) : string { if ($formatter === null) { $formatter = new Formatter\PassthroughFormatter(); } return $formatter->format($this); } } PK!Ħ/reflection-docblock/src/DocBlock/Tags/Param.phpnuIwname = 'param'; $this->variableName = $variableName; $this->type = $type; $this->isVariadic = $isVariadic; $this->description = $description; $this->isReference = $isReference; } public static function create( string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ) : self { Assert::stringNotEmpty($body); Assert::notNull($typeResolver); Assert::notNull($descriptionFactory); [$firstPart, $body] = self::extractTypeFromBody($body); $type = null; $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); $variableName = ''; $isVariadic = false; $isReference = false; // if the first item that is encountered is not a variable; it is a type if ($firstPart && !self::strStartsWithVariable($firstPart)) { $type = $typeResolver->resolve($firstPart, $context); } else { // first part is not a type; we should prepend it to the parts array for further processing array_unshift($parts, $firstPart); } // if the next item starts with a $ or ...$ or &$ or &...$ it must be the variable name if (isset($parts[0]) && self::strStartsWithVariable($parts[0])) { $variableName = array_shift($parts); if ($type) { array_shift($parts); } Assert::notNull($variableName); if (strpos($variableName, '$') === 0) { $variableName = substr($variableName, 1); } elseif (strpos($variableName, '&$') === 0) { $isReference = true; $variableName = substr($variableName, 2); } elseif (strpos($variableName, '...$') === 0) { $isVariadic = true; $variableName = substr($variableName, 4); } elseif (strpos($variableName, '&...$') === 0) { $isVariadic = true; $isReference = true; $variableName = substr($variableName, 5); } } $description = $descriptionFactory->create(implode('', $parts), $context); return new static($variableName, $type, $isVariadic, $description, $isReference); } /** * Returns the variable's name. */ public function getVariableName() : ?string { return $this->variableName; } /** * Returns whether this tag is variadic. */ public function isVariadic() : bool { return $this->isVariadic; } /** * Returns whether this tag is passed by reference. */ public function isReference() : bool { return $this->isReference; } /** * Returns a string representation for this tag. */ public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $variableName = ''; if ($this->variableName) { $variableName .= ($this->isReference ? '&' : '') . ($this->isVariadic ? '...' : ''); $variableName .= '$' . $this->variableName; } $type = (string) $this->type; return $type . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); } private static function strStartsWithVariable(string $str) : bool { return strpos($str, '$') === 0 || strpos($str, '...$') === 0 || strpos($str, '&$') === 0 || strpos($str, '&...$') === 0; } } PK!mq 0reflection-docblock/src/DocBlock/Tags/Author.phpnuIwauthorName = $authorName; $this->authorEmail = $authorEmail; } /** * Gets the author's name. * * @return string The author's name. */ public function getAuthorName() : string { return $this->authorName; } /** * Returns the author's email. * * @return string The author's email. */ public function getEmail() : string { return $this->authorEmail; } /** * Returns this tag in string form. */ public function __toString() : string { if ($this->authorEmail) { $authorEmail = '<' . $this->authorEmail . '>'; } else { $authorEmail = ''; } $authorName = (string) $this->authorName; return $authorName . ($authorEmail !== '' ? ($authorName !== '' ? ' ' : '') . $authorEmail : ''); } /** * Attempts to create a new Author object based on †he tag body. */ public static function create(string $body) : ?self { $splitTagContent = preg_match('/^([^\<]*)(?:\<([^\>]*)\>)?$/u', $body, $matches); if (!$splitTagContent) { return null; } $authorName = trim($matches[1]); $email = isset($matches[2]) ? trim($matches[2]) : ''; return new static($authorName, $email); } } PK!P,>reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.phpnuIwrefers = $refers; $this->description = $description; } public static function create( string $body, ?DescriptionFactory $descriptionFactory = null, ?FqsenResolver $resolver = null, ?TypeContext $context = null ) : self { Assert::stringNotEmpty($body); Assert::notNull($descriptionFactory); Assert::notNull($resolver); $parts = Utils::pregSplit('/\s+/Su', $body, 2); return new static( self::resolveFqsen($parts[0], $resolver, $context), $descriptionFactory->create($parts[1] ?? '', $context) ); } private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context) : Fqsen { Assert::notNull($fqsenResolver); $fqsenParts = explode('::', $parts); $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); if (!array_key_exists(1, $fqsenParts)) { return $resolved; } return new Fqsen($resolved . '::' . $fqsenParts[1]); } /** * Returns the structural element this tag refers to. */ public function getReference() : Fqsen { return $this->refers; } /** * Returns a string representation of this tag. */ public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $refers = (string) $this->refers; return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); } } PK!GP -reflection-docblock/src/DocBlock/Tags/See.phpnuIwrefers = $refers; $this->description = $description; } public static function create( string $body, ?FqsenResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ) : self { Assert::notNull($descriptionFactory); $parts = Utils::pregSplit('/\s+/Su', $body, 2); $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null; // https://tools.ietf.org/html/rfc2396#section-3 if (preg_match('/\w:\/\/\w/i', $parts[0])) { return new static(new Url($parts[0]), $description); } return new static(new FqsenRef(self::resolveFqsen($parts[0], $typeResolver, $context)), $description); } private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context) : Fqsen { Assert::notNull($fqsenResolver); $fqsenParts = explode('::', $parts); $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); if (!array_key_exists(1, $fqsenParts)) { return $resolved; } return new Fqsen($resolved . '::' . $fqsenParts[1]); } /** * Returns the ref of this tag. */ public function getReference() : Reference { return $this->refers; } /** * Returns a string representation of this tag. */ public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $refers = (string) $this->refers; return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); } } PK!O 0reflection-docblock/src/DocBlock/Description.phpnuIwcreate('This is a {@see Description}', $context); * * The description factory will interpret the given body and create a body template and list of tags from them, and pass * that onto the constructor if this class. * * > The $context variable is a class of type {@see \phpDocumentor\Reflection\Types\Context} and contains the namespace * > and the namespace aliases that apply to this DocBlock. These are used by the Factory to resolve and expand partial * > type names and FQSENs. * * If you do not want to use the DescriptionFactory you can pass a body template and tag listing like this: * * $description = new Description( * 'This is a %1$s', * [ new See(new Fqsen('\phpDocumentor\Reflection\DocBlock\Description')) ] * ); * * It is generally recommended to use the Factory as that will also apply escaping rules, while the Description object * is mainly responsible for rendering. * * @see DescriptionFactory to create a new Description. * @see Description\Formatter for the formatting of the body and tags. */ class Description { /** @var string */ private $bodyTemplate; /** @var Tag[] */ private $tags; /** * Initializes a Description with its body (template) and a listing of the tags used in the body template. * * @param Tag[] $tags */ public function __construct(string $bodyTemplate, array $tags = []) { $this->bodyTemplate = $bodyTemplate; $this->tags = $tags; } /** * Returns the body template. */ public function getBodyTemplate() : string { return $this->bodyTemplate; } /** * Returns the tags for this DocBlock. * * @return Tag[] */ public function getTags() : array { return $this->tags; } /** * Renders this description as a string where the provided formatter will format the tags in the expected string * format. */ public function render(?Formatter $formatter = null) : string { if ($formatter === null) { $formatter = new PassthroughFormatter(); } $tags = []; foreach ($this->tags as $tag) { $tags[] = '{' . $formatter->format($tag) . '}'; } return vsprintf($this->bodyTemplate, $tags); } /** * Returns a plain string representation of this description. */ public function __toString() : string { return $this->render(); } } PK!1(reflection-docblock/src/DocBlock/Tag.phpnuIw Important: each parameter in addition to the body variable for the `create` method must default to null, otherwise * > it violates the constraint with the interface; it is recommended to use the {@see Assert::notNull()} method to * > verify that a dependency is actually passed. * * This Factory also features a Service Locator component that is used to pass the right dependencies to the * `create` method of a tag; each dependency should be registered as a service or as a parameter. * * When you want to use a Tag of your own with custom handling you need to call the `registerTagHandler` method, pass * the name of the tag and a Fully Qualified Class Name pointing to a class that implements the Tag interface. */ final class StandardTagFactory implements TagFactory { /** PCRE regular expression matching a tag name. */ public const REGEX_TAGNAME = '[\w\-\_\\\\:]+'; /** * @var array> An array with a tag as a key, and an * FQCN to a class that handles it as an array value. */ private $tagHandlerMappings = [ 'author' => Author::class, 'covers' => Covers::class, 'deprecated' => Deprecated::class, // 'example' => '\phpDocumentor\Reflection\DocBlock\Tags\Example', 'link' => LinkTag::class, 'method' => Method::class, 'param' => Param::class, 'property-read' => PropertyRead::class, 'property' => Property::class, 'property-write' => PropertyWrite::class, 'return' => Return_::class, 'see' => SeeTag::class, 'since' => Since::class, 'source' => Source::class, 'throw' => Throws::class, 'throws' => Throws::class, 'uses' => Uses::class, 'var' => Var_::class, 'version' => Version::class, ]; /** * @var array> An array with a anotation s a key, and an * FQCN to a class that handles it as an array value. */ private $annotationMappings = []; /** * @var ReflectionParameter[][] a lazy-loading cache containing parameters * for each tagHandler that has been used. */ private $tagHandlerParameterCache = []; /** @var FqsenResolver */ private $fqsenResolver; /** * @var mixed[] an array representing a simple Service Locator where we can store parameters and * services that can be inserted into the Factory Methods of Tag Handlers. */ private $serviceLocator = []; /** * Initialize this tag factory with the means to resolve an FQSEN and optionally a list of tag handlers. * * If no tag handlers are provided than the default list in the {@see self::$tagHandlerMappings} property * is used. * * @see self::registerTagHandler() to add a new tag handler to the existing default list. * * @param array> $tagHandlers */ public function __construct(FqsenResolver $fqsenResolver, ?array $tagHandlers = null) { $this->fqsenResolver = $fqsenResolver; if ($tagHandlers !== null) { $this->tagHandlerMappings = $tagHandlers; } $this->addService($fqsenResolver, FqsenResolver::class); } public function create(string $tagLine, ?TypeContext $context = null) : Tag { if (!$context) { $context = new TypeContext(''); } [$tagName, $tagBody] = $this->extractTagParts($tagLine); return $this->createTag(trim($tagBody), $tagName, $context); } /** * @param mixed $value */ public function addParameter(string $name, $value) : void { $this->serviceLocator[$name] = $value; } public function addService(object $service, ?string $alias = null) : void { $this->serviceLocator[$alias ?: get_class($service)] = $service; } public function registerTagHandler(string $tagName, string $handler) : void { Assert::stringNotEmpty($tagName); Assert::classExists($handler); Assert::implementsInterface($handler, Tag::class); if (strpos($tagName, '\\') && $tagName[0] !== '\\') { throw new InvalidArgumentException( 'A namespaced tag must have a leading backslash as it must be fully qualified' ); } $this->tagHandlerMappings[$tagName] = $handler; } /** * Extracts all components for a tag. * * @return string[] */ private function extractTagParts(string $tagLine) : array { $matches = []; if (!preg_match('/^@(' . self::REGEX_TAGNAME . ')((?:[\s\(\{])\s*([^\s].*)|$)/us', $tagLine, $matches)) { throw new InvalidArgumentException( 'The tag "' . $tagLine . '" does not seem to be wellformed, please check it for errors' ); } if (count($matches) < 3) { $matches[] = ''; } return array_slice($matches, 1); } /** * Creates a new tag object with the given name and body or returns null if the tag name was recognized but the * body was invalid. */ private function createTag(string $body, string $name, TypeContext $context) : Tag { $handlerClassName = $this->findHandlerClassName($name, $context); $arguments = $this->getArgumentsForParametersFromWiring( $this->fetchParametersForHandlerFactoryMethod($handlerClassName), $this->getServiceLocatorWithDynamicParameters($context, $name, $body) ); try { $callable = [$handlerClassName, 'create']; Assert::isCallable($callable); /** @phpstan-var callable(string): ?Tag $callable */ $tag = call_user_func_array($callable, $arguments); return $tag ?? InvalidTag::create($body, $name); } catch (InvalidArgumentException $e) { return InvalidTag::create($body, $name)->withError($e); } } /** * Determines the Fully Qualified Class Name of the Factory or Tag (containing a Factory Method `create`). * * @return class-string */ private function findHandlerClassName(string $tagName, TypeContext $context) : string { $handlerClassName = Generic::class; if (isset($this->tagHandlerMappings[$tagName])) { $handlerClassName = $this->tagHandlerMappings[$tagName]; } elseif ($this->isAnnotation($tagName)) { // TODO: Annotation support is planned for a later stage and as such is disabled for now $tagName = (string) $this->fqsenResolver->resolve($tagName, $context); if (isset($this->annotationMappings[$tagName])) { $handlerClassName = $this->annotationMappings[$tagName]; } } return $handlerClassName; } /** * Retrieves the arguments that need to be passed to the Factory Method with the given Parameters. * * @param ReflectionParameter[] $parameters * @param mixed[] $locator * * @return mixed[] A series of values that can be passed to the Factory Method of the tag whose parameters * is provided with this method. */ private function getArgumentsForParametersFromWiring(array $parameters, array $locator) : array { $arguments = []; foreach ($parameters as $parameter) { $type = $parameter->getType(); $typeHint = null; if ($type instanceof ReflectionNamedType) { $typeHint = $type->getName(); if ($typeHint === 'self') { $declaringClass = $parameter->getDeclaringClass(); if ($declaringClass !== null) { $typeHint = $declaringClass->getName(); } } } if (isset($locator[$typeHint])) { $arguments[] = $locator[$typeHint]; continue; } $parameterName = $parameter->getName(); if (isset($locator[$parameterName])) { $arguments[] = $locator[$parameterName]; continue; } $arguments[] = null; } return $arguments; } /** * Retrieves a series of ReflectionParameter objects for the static 'create' method of the given * tag handler class name. * * @param class-string $handlerClassName * * @return ReflectionParameter[] */ private function fetchParametersForHandlerFactoryMethod(string $handlerClassName) : array { if (!isset($this->tagHandlerParameterCache[$handlerClassName])) { $methodReflection = new ReflectionMethod($handlerClassName, 'create'); $this->tagHandlerParameterCache[$handlerClassName] = $methodReflection->getParameters(); } return $this->tagHandlerParameterCache[$handlerClassName]; } /** * Returns a copy of this class' Service Locator with added dynamic parameters, * such as the tag's name, body and Context. * * @param TypeContext $context The Context (namespace and aliasses) that may be * passed and is used to resolve FQSENs. * @param string $tagName The name of the tag that may be * passed onto the factory method of the Tag class. * @param string $tagBody The body of the tag that may be * passed onto the factory method of the Tag class. * * @return mixed[] */ private function getServiceLocatorWithDynamicParameters( TypeContext $context, string $tagName, string $tagBody ) : array { return array_merge( $this->serviceLocator, [ 'name' => $tagName, 'body' => $tagBody, TypeContext::class => $context, ] ); } /** * Returns whether the given tag belongs to an annotation. * * @todo this method should be populated once we implement Annotation notation support. */ private function isAnnotation(string $tagContent) : bool { // 1. Contains a namespace separator // 2. Contains parenthesis // 3. Is present in a list of known annotations (make the algorithm smart by first checking is the last part // of the annotation class name matches the found tag name return false; } } PK!:..7reflection-docblock/src/DocBlock/DescriptionFactory.phpnuIwtagFactory = $tagFactory; } /** * Returns the parsed text of this description. */ public function create(string $contents, ?TypeContext $context = null) : Description { $tokens = $this->lex($contents); $count = count($tokens); $tagCount = 0; $tags = []; for ($i = 1; $i < $count; $i += 2) { $tags[] = $this->tagFactory->create($tokens[$i], $context); $tokens[$i] = '%' . ++$tagCount . '$s'; } //In order to allow "literal" inline tags, the otherwise invalid //sequence "{@}" is changed to "@", and "{}" is changed to "}". //"%" is escaped to "%%" because of vsprintf. //See unit tests for examples. for ($i = 0; $i < $count; $i += 2) { $tokens[$i] = str_replace(['{@}', '{}', '%'], ['@', '}', '%%'], $tokens[$i]); } return new Description(implode('', $tokens), $tags); } /** * Strips the contents from superfluous whitespace and splits the description into a series of tokens. * * @return string[] A series of tokens of which the description text is composed. */ private function lex(string $contents) : array { $contents = $this->removeSuperfluousStartingWhitespace($contents); // performance optimalization; if there is no inline tag, don't bother splitting it up. if (strpos($contents, '{@') === false) { return [$contents]; } return Utils::pregSplit( '/\{ # "{@}" is not a valid inline tag. This ensures that we do not treat it as one, but treat it literally. (?!@\}) # We want to capture the whole tag line, but without the inline tag delimiters. (\@ # Match everything up to the next delimiter. [^{}]* # Nested inline tag content should not be captured, or it will appear in the result separately. (?: # Match nested inline tags. (?: # Because we did not catch the tag delimiters earlier, we must be explicit with them here. # Notice that this also matches "{}", as a way to later introduce it as an escape sequence. \{(?1)?\} | # Make sure we match hanging "{". \{ ) # Match content after the nested inline tag. [^{}]* )* # If there are more inline tags, match them as well. We use "*" since there may not be any # nested inline tags. ) \}/Sux', $contents, 0, PREG_SPLIT_DELIM_CAPTURE ); } /** * Removes the superfluous from a multi-line description. * * When a description has more than one line then it can happen that the second and subsequent lines have an * additional indentation. This is commonly in use with tags like this: * * {@}since 1.1.0 This is an example * description where we have an * indentation in the second and * subsequent lines. * * If we do not normalize the indentation then we have superfluous whitespace on the second and subsequent * lines and this may cause rendering issues when, for example, using a Markdown converter. */ private function removeSuperfluousStartingWhitespace(string $contents) : string { $lines = explode("\n", $contents); // if there is only one line then we don't have lines with superfluous whitespace and // can use the contents as-is if (count($lines) <= 1) { return $contents; } // determine how many whitespace characters need to be stripped $startingSpaceCount = 9999999; for ($i = 1, $iMax = count($lines); $i < $iMax; ++$i) { // lines with a no length do not count as they are not indented at all if (trim($lines[$i]) === '') { continue; } // determine the number of prefixing spaces by checking the difference in line length before and after // an ltrim $startingSpaceCount = min($startingSpaceCount, strlen($lines[$i]) - strlen(ltrim($lines[$i]))); } // strip the number of spaces from each line if ($startingSpaceCount > 0) { for ($i = 1, $iMax = count($lines); $i < $iMax; ++$i) { $lines[$i] = substr($lines[$i], $startingSpaceCount); } } return implode("\n", $lines); } } PK!I4{{/reflection-docblock/src/DocBlock/TagFactory.phpnuIw $handler FQCN of handler. * * @throws InvalidArgumentException If the tag name is not a string. * @throws InvalidArgumentException If the tag name is namespaced (contains backslashes) but * does not start with a backslash. * @throws InvalidArgumentException If the handler is not a string. * @throws InvalidArgumentException If the handler is not an existing class. * @throws InvalidArgumentException If the handler does not implement the {@see Tag} interface. */ public function registerTagHandler(string $tagName, string $handler) : void; } PK!ff2reflection-docblock/src/DocBlock/ExampleFinder.phpnuIwgetFilePath(); $file = $this->getExampleFileContents($filename); if (!$file) { return sprintf('** File not found : %s **', $filename); } return implode('', array_slice($file, $example->getStartingLine() - 1, $example->getLineCount())); } /** * Registers the project's root directory where an 'examples' folder can be expected. */ public function setSourceDirectory(string $directory = '') : void { $this->sourceDirectory = $directory; } /** * Returns the project's root directory where an 'examples' folder can be expected. */ public function getSourceDirectory() : string { return $this->sourceDirectory; } /** * Registers a series of directories that may contain examples. * * @param string[] $directories */ public function setExampleDirectories(array $directories) : void { $this->exampleDirectories = $directories; } /** * Returns a series of directories that may contain examples. * * @return string[] */ public function getExampleDirectories() : array { return $this->exampleDirectories; } /** * Attempts to find the requested example file and returns its contents or null if no file was found. * * This method will try several methods in search of the given example file, the first one it encounters is * returned: * * 1. Iterates through all examples folders for the given filename * 2. Checks the source folder for the given filename * 3. Checks the 'examples' folder in the current working directory for examples * 4. Checks the path relative to the current working directory for the given filename * * @return string[] all lines of the example file */ private function getExampleFileContents(string $filename) : ?array { $normalizedPath = null; foreach ($this->exampleDirectories as $directory) { $exampleFileFromConfig = $this->constructExamplePath($directory, $filename); if (is_readable($exampleFileFromConfig)) { $normalizedPath = $exampleFileFromConfig; break; } } if (!$normalizedPath) { if (is_readable($this->getExamplePathFromSource($filename))) { $normalizedPath = $this->getExamplePathFromSource($filename); } elseif (is_readable($this->getExamplePathFromExampleDirectory($filename))) { $normalizedPath = $this->getExamplePathFromExampleDirectory($filename); } elseif (is_readable($filename)) { $normalizedPath = $filename; } } $lines = $normalizedPath && is_readable($normalizedPath) ? file($normalizedPath) : false; return $lines !== false ? $lines : null; } /** * Get example filepath based on the example directory inside your project. */ private function getExamplePathFromExampleDirectory(string $file) : string { return getcwd() . DIRECTORY_SEPARATOR . 'examples' . DIRECTORY_SEPARATOR . $file; } /** * Returns a path to the example file in the given directory.. */ private function constructExamplePath(string $directory, string $file) : string { return rtrim($directory, '\\/') . DIRECTORY_SEPARATOR . $file; } /** * Get example filepath based on sourcecode. */ private function getExamplePathFromSource(string $file) : string { return sprintf( '%s%s%s', trim($this->getSourceDirectory(), '\\/'), DIRECTORY_SEPARATOR, trim($file, '"') ); } } PK!6RSS/reflection-docblock/src/DocBlock/Serializer.phpnuIwindent = $indent; $this->indentString = $indentString; $this->isFirstLineIndented = $indentFirstLine; $this->lineLength = $lineLength; $this->tagFormatter = $tagFormatter ?: new PassthroughFormatter(); } /** * Generate a DocBlock comment. * * @param DocBlock $docblock The DocBlock to serialize. * * @return string The serialized doc block. */ public function getDocComment(DocBlock $docblock) : string { $indent = str_repeat($this->indentString, $this->indent); $firstIndent = $this->isFirstLineIndented ? $indent : ''; // 3 === strlen(' * ') $wrapLength = $this->lineLength ? $this->lineLength - strlen($indent) - 3 : null; $text = $this->removeTrailingSpaces( $indent, $this->addAsterisksForEachLine( $indent, $this->getSummaryAndDescriptionTextBlock($docblock, $wrapLength) ) ); $comment = $firstIndent . "/**\n"; if ($text) { $comment .= $indent . ' * ' . $text . "\n"; $comment .= $indent . " *\n"; } $comment = $this->addTagBlock($docblock, $wrapLength, $indent, $comment); return $comment . $indent . ' */'; } private function removeTrailingSpaces(string $indent, string $text) : string { return str_replace( sprintf("\n%s * \n", $indent), sprintf("\n%s *\n", $indent), $text ); } private function addAsterisksForEachLine(string $indent, string $text) : string { return str_replace( "\n", sprintf("\n%s * ", $indent), $text ); } private function getSummaryAndDescriptionTextBlock(DocBlock $docblock, ?int $wrapLength) : string { $text = $docblock->getSummary() . ((string) $docblock->getDescription() ? "\n\n" . $docblock->getDescription() : ''); if ($wrapLength !== null) { $text = wordwrap($text, $wrapLength); return $text; } return $text; } private function addTagBlock(DocBlock $docblock, ?int $wrapLength, string $indent, string $comment) : string { foreach ($docblock->getTags() as $tag) { $tagText = $this->tagFormatter->format($tag); if ($wrapLength !== null) { $tagText = wordwrap($tagText, $wrapLength); } $tagText = str_replace( "\n", sprintf("\n%s * ", $indent), $tagText ); $comment .= sprintf("%s * %s\n", $indent, $tagText); } return $comment; } } PK!`ww4reflection-docblock/src/DocBlockFactoryInterface.phpnuIw> $additionalTags */ public static function createInstance(array $additionalTags = []) : DocBlockFactory; /** * @param string|object $docblock */ public function create($docblock, ?Types\Context $context = null, ?Location $location = null) : DocBlock; } PK!הE%E%+reflection-docblock/src/DocBlockFactory.phpnuIwdescriptionFactory = $descriptionFactory; $this->tagFactory = $tagFactory; } /** * Factory method for easy instantiation. * * @param array> $additionalTags */ public static function createInstance(array $additionalTags = []) : self { $fqsenResolver = new FqsenResolver(); $tagFactory = new StandardTagFactory($fqsenResolver); $descriptionFactory = new DescriptionFactory($tagFactory); $tagFactory->addService($descriptionFactory); $tagFactory->addService(new TypeResolver($fqsenResolver)); $docBlockFactory = new self($descriptionFactory, $tagFactory); foreach ($additionalTags as $tagName => $tagHandler) { $docBlockFactory->registerTagHandler($tagName, $tagHandler); } return $docBlockFactory; } /** * @param object|string $docblock A string containing the DocBlock to parse or an object supporting the * getDocComment method (such as a ReflectionClass object). */ public function create($docblock, ?Types\Context $context = null, ?Location $location = null) : DocBlock { if (is_object($docblock)) { if (!method_exists($docblock, 'getDocComment')) { $exceptionMessage = 'Invalid object passed; the given object must support the getDocComment method'; throw new InvalidArgumentException($exceptionMessage); } $docblock = $docblock->getDocComment(); Assert::string($docblock); } Assert::stringNotEmpty($docblock); if ($context === null) { $context = new Types\Context(''); } $parts = $this->splitDocBlock($this->stripDocComment($docblock)); [$templateMarker, $summary, $description, $tags] = $parts; return new DocBlock( $summary, $description ? $this->descriptionFactory->create($description, $context) : null, $this->parseTagBlock($tags, $context), $context, $location, $templateMarker === '#@+', $templateMarker === '#@-' ); } /** * @param class-string $handler */ public function registerTagHandler(string $tagName, string $handler) : void { $this->tagFactory->registerTagHandler($tagName, $handler); } /** * Strips the asterisks from the DocBlock comment. * * @param string $comment String containing the comment text. */ private function stripDocComment(string $comment) : string { $comment = preg_replace('#[ \t]*(?:\/\*\*|\*\/|\*)?[ \t]?(.*)?#u', '$1', $comment); Assert::string($comment); $comment = trim($comment); // reg ex above is not able to remove */ from a single line docblock if (substr($comment, -2) === '*/') { $comment = trim(substr($comment, 0, -2)); } return str_replace(["\r\n", "\r"], "\n", $comment); } // phpcs:disable /** * Splits the DocBlock into a template marker, summary, description and block of tags. * * @param string $comment Comment to split into the sub-parts. * * @return string[] containing the template marker (if any), summary, description and a string containing the tags. * * @author Mike van Riel for extending the regex with template marker support. * * @author Richard van Velzen (@_richardJ) Special thanks to Richard for the regex responsible for the split. */ private function splitDocBlock(string $comment) : array { // phpcs:enable // Performance improvement cheat: if the first character is an @ then only tags are in this DocBlock. This // method does not split tags so we return this verbatim as the fourth result (tags). This saves us the // performance impact of running a regular expression if (strpos($comment, '@') === 0) { return ['', '', '', $comment]; } // clears all extra horizontal whitespace from the line endings to prevent parsing issues $comment = preg_replace('/\h*$/Sum', '', $comment); Assert::string($comment); /* * Splits the docblock into a template marker, summary, description and tags section. * * - The template marker is empty, #@+ or #@- if the DocBlock starts with either of those (a newline may * occur after it and will be stripped). * - The short description is started from the first character until a dot is encountered followed by a * newline OR two consecutive newlines (horizontal whitespace is taken into account to consider spacing * errors). This is optional. * - The long description, any character until a new line is encountered followed by an @ and word * characters (a tag). This is optional. * - Tags; the remaining characters * * Big thanks to RichardJ for contributing this Regular Expression */ preg_match( '/ \A # 1. Extract the template marker (?:(\#\@\+|\#\@\-)\n?)? # 2. Extract the summary (?: (?! @\pL ) # The summary may not start with an @ ( [^\n.]+ (?: (?! \. \n | \n{2} ) # End summary upon a dot followed by newline or two newlines [\n.]* (?! [ \t]* @\pL ) # End summary when an @ is found as first character on a new line [^\n.]+ # Include anything else )* \.? )? ) # 3. Extract the description (?: \s* # Some form of whitespace _must_ precede a description because a summary must be there (?! @\pL ) # The description may not start with an @ ( [^\n]+ (?: \n+ (?! [ \t]* @\pL ) # End description when an @ is found as first character on a new line [^\n]+ # Include anything else )* ) )? # 4. Extract the tags (anything that follows) (\s+ [\s\S]*)? # everything that follows /ux', $comment, $matches ); array_shift($matches); while (count($matches) < 4) { $matches[] = ''; } return $matches; } /** * Creates the tag objects. * * @param string $tags Tag block to parse. * @param Types\Context $context Context of the parsed Tag * * @return DocBlock\Tag[] */ private function parseTagBlock(string $tags, Types\Context $context) : array { $tags = $this->filterTagBlock($tags); if ($tags === null) { return []; } $result = []; $lines = $this->splitTagBlockIntoTagLines($tags); foreach ($lines as $key => $tagLine) { $result[$key] = $this->tagFactory->create(trim($tagLine), $context); } return $result; } /** * @return string[] */ private function splitTagBlockIntoTagLines(string $tags) : array { $result = []; foreach (explode("\n", $tags) as $tagLine) { if ($tagLine !== '' && strpos($tagLine, '@') === 0) { $result[] = $tagLine; } else { $result[count($result) - 1] .= "\n" . $tagLine; } } return $result; } private function filterTagBlock(string $tags) : ?string { $tags = trim($tags); if (!$tags) { return null; } if ($tags[0] !== '@') { // @codeCoverageIgnoreStart // Can't simulate this; this only happens if there is an error with the parsing of the DocBlock that // we didn't foresee. throw new LogicException('A tag block started with text instead of an at-sign(@): ' . $tags); // @codeCoverageIgnoreEnd } return $tags; } } PK!ę:type-resolver/752161aedc0d6ed781ada8f3aa9db4973e187d1f.zipnuIwPK!:atype-resolver/2c8696b6cc4243b079e2f016d2da20c00c38c3e0.zipnuIwPK!$i= = >Mreflection-common/6243ab17e2330fb7ce63d34391d53104cc913dc0.zipnuIwPK! ts)s)><reflection-common/989820d4d3bc32a26c6e3cc70dd511d1b2102399.zipnuIwPK! @freflection-docblock/4a69b083486dbc03314e937e5613b9afb9863ebf.zipnuIwPK!]]@iTreflection-docblock/8dff474b657832a5f4f52148225055696fe8e20f.zipnuIwPK!ܵ\##6:type-resolver/README.mdnuIwPK!88&^type-resolver/LICENSEnuIwPK!%btype-resolver/phpbench.jsonnuIwPK!qMctype-resolver/composer.jsonnuIwPK!ҟnn gtype-resolver/src/PseudoType.phpnuIwPK!9:&htype-resolver/src/Types/Collection.phpnuIwPK!#otype-resolver/src/Types/Static_.phpnuIwPK!tV@--& ttype-resolver/src/Types/Expression.phpnuIwPK!||(xtype-resolver/src/Types/AbstractList.phpnuIwPK!$&mm%dtype-resolver/src/Types/Callable_.phpnuIwPK!?*jj!&type-resolver/src/Types/Null_.phpnuIwPK!6"type-resolver/src/Types/Scalar.phpnuIwPK! #وtype-resolver/src/Types/Parent_.phpnuIwPK!]"type-resolver/src/Types/Array_.phpnuIwPK!`! *(type-resolver/src/Types/AggregatedType.phpnuIwPK!/@ #type-resolver/src/Types/Context.phpnuIwPK!"B1eGG$type-resolver/src/Types/Nullable.phpnuIwPK!9qq% type-resolver/src/Types/Resource_.phpnuIwPK!=KK Utype-resolver/src/Types/This.phpnuIwPK!"PB::%type-resolver/src/Types/Iterable_.phpnuIwPK!F!type-resolver/src/Types/Void_.phpnuIwPK!28)type-resolver/src/Type.phpnuIwPK!rTP7H7H"type-resolver/src/TypeResolver.phpnuIwPK!G6x#qctype-resolver/src/FqsenResolver.phpnuIwPK!"WAss(ltype-resolver/src/PseudoTypes/False_.phpnuIwPK!)xoo'ptype-resolver/src/PseudoTypes/True_.phpnuIwPK!F|  Nttype-resolver/composer.locknuIwPK! һOO}reflection-common/README.mdnuIwPK!*2Ȑ99Lreflection-common/LICENSEnuIwPK! ļΆreflection-common/composer.jsonnuIwPK!(n`,ىreflection-common/.github/workflows/push.ymlnuIwPK!bί(reflection-common/.github/dependabot.ymlnuIwPK!.oreflection-common/src/File.phpnuIwPK!kDk!reflection-common/src/Element.phpnuIwPK!^Lreflection-common/src/Fqsen.phpnuIwPK!2XX(+reflection-common/src/ProjectFactory.phpnuIwPK!p˜"۴reflection-common/src/Location.phpnuIwPK!079!reflection-common/src/Project.phpnuIwPK!.=x reflection-docblock/README.mdnuIwPK!88`reflection-docblock/LICENSEnuIwPK!LAw<<!reflection-docblock/composer.jsonnuIwPK!/qH{{$preflection-docblock/src/DocBlock.phpnuIwPK!g2 2 !?reflection-docblock/src/Utils.phpnuIwPK!4ZU\3reflection-docblock/src/Exception/PcreException.phpnuIwPK!N~8 1reflection-docblock/src/DocBlock/Tags/Version.phpnuIwPK!e؋{{1reflection-docblock/src/DocBlock/Tags/BaseTag.phpnuIwPK!82reflection-docblock/src/DocBlock/Tags/Property.phpnuIwPK!t. reflection-docblock/src/DocBlock/Tags/Link.phpnuIwPK!."--1reflection-docblock/src/DocBlock/Tags/Return_.phpnuIwPK!J\ \ 0"reflection-docblock/src/DocBlock/Tags/Method.phpnuIwPK!ះ4OCreflection-docblock/src/DocBlock/Tags/InvalidTag.phpnuIwPK!7uSreflection-docblock/src/DocBlock/Tags/Reference/Url.phpnuIwPK! v  9Vreflection-docblock/src/DocBlock/Tags/Reference/Fqsen.phpnuIwPK!.=&Zreflection-docblock/src/DocBlock/Tags/Reference/Reference.phpnuIwPK!BK 0`\reflection-docblock/src/DocBlock/Tags/Source.phpnuIwPK!55fjreflection-docblock/src/DocBlock/Tags/TagWithType.phpnuIwPK![Ϩ 1tpreflection-docblock/src/DocBlock/Tags/Generic.phpnuIwPK!oVU0}zreflection-docblock/src/DocBlock/Tags/Throws.phpnuIwPK!!N2 .reflection-docblock/src/DocBlock/Tags/Var_.phpnuIwPK!#5 5 49reflection-docblock/src/DocBlock/Tags/Deprecated.phpnuIwPK!es s /қreflection-docblock/src/DocBlock/Tags/Since.phpnuIwPK!OO)  7reflection-docblock/src/DocBlock/Tags/PropertyWrite.phpnuIwPK! e.Hreflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.phpnuIwPK!x폣B3reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.phpnuIwPK!v=,+3Hreflection-docblock/src/DocBlock/Tags/Formatter.phpnuIwPK!?i6reflection-docblock/src/DocBlock/Tags/PropertyRead.phpnuIwPK!)T T .0reflection-docblock/src/DocBlock/Tags/Uses.phpnuIwPK!  1reflection-docblock/src/DocBlock/Tags/Example.phpnuIwPK!Ħ/Preflection-docblock/src/DocBlock/Tags/Param.phpnuIwPK!mq 0dreflection-docblock/src/DocBlock/Tags/Author.phpnuIwPK!P,> reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.phpnuIwPK!t@} } 0reflection-docblock/src/DocBlock/Tags/Covers.phpnuIwPK!GP -reflection-docblock/src/DocBlock/Tags/See.phpnuIwPK!O 05'reflection-docblock/src/DocBlock/Description.phpnuIwPK!1(e5reflection-docblock/src/DocBlock/Tag.phpnuIwPK!sS1S17Z8reflection-docblock/src/DocBlock/StandardTagFactory.phpnuIwPK!:..7jreflection-docblock/src/DocBlock/DescriptionFactory.phpnuIwPK!I4{{/reflection-docblock/src/DocBlock/TagFactory.phpnuIwPK!ff2reflection-docblock/src/DocBlock/ExampleFinder.phpnuIwPK!6RSS/Kreflection-docblock/src/DocBlock/Serializer.phpnuIwPK!`ww4reflection-docblock/src/DocBlockFactoryInterface.phpnuIwPK!הE%E%+ػreflection-docblock/src/DocBlockFactory.phpnuIwPKcc)x