PNG  IHDRQgAMA a cHRMz&u0`:pQ<bKGDgmIDATxwUﹻ& ^CX(J I@ "% (** BX +*i"]j(IH{~R)[~>h{}gy)I$Ij .I$I$ʊy@}x.: $I$Ii}VZPC)I$IF ^0ʐJ$I$Q^}{"r=OzI$gRZeC.IOvH eKX $IMpxsk.쒷/&r[޳<v| .I~)@$updYRa$I |M.e JaֶpSYR6j>h%IRز if&uJ)M$I vLi=H;7UJ,],X$I1AҒJ$ XY XzI@GNҥRT)E@;]K*Mw;#5_wOn~\ DC&$(A5 RRFkvIR}l!RytRl;~^ǷJj اy뷦BZJr&ӥ8Pjw~vnv X^(I;4R=P[3]J,]ȏ~:3?[ a&e)`e*P[4]T=Cq6R[ ~ޤrXR Հg(t_HZ-Hg M$ãmL5R uk*`%C-E6/%[t X.{8P9Z.vkXŐKjgKZHg(aK9ڦmKjѺm_ \#$5,)-  61eJ,5m| r'= &ڡd%-]J on Xm|{ RҞe $eڧY XYrԮ-a7RK6h>n$5AVڴi*ֆK)mѦtmr1p| q:흺,)Oi*ֺK)ܬ֦K-5r3>0ԔHjJئEZj,%re~/z%jVMڸmrt)3]J,T K֦OvԒgii*bKiNO~%PW0=dii2tJ9Jݕ{7"I P9JKTbu,%r"6RKU}Ij2HKZXJ,妝 XYrP ެ24c%i^IK|.H,%rb:XRl1X4Pe/`x&P8Pj28Mzsx2r\zRPz4J}yP[g=L) .Q[6RjWgp FIH*-`IMRaK9TXcq*I y[jE>cw%gLRԕiFCj-ďa`#e~I j,%r,)?[gp FI˨mnWX#>mʔ XA DZf9,nKҲzIZXJ,L#kiPz4JZF,I,`61%2s $,VOϚ2/UFJfy7K> X+6 STXIeJILzMfKm LRaK9%|4p9LwJI!`NsiazĔ)%- XMq>pk$-$Q2x#N ؎-QR}ᶦHZډ)J,l#i@yn3LN`;nڔ XuX5pF)m|^0(>BHF9(cզEerJI rg7 4I@z0\JIi䵙RR0s;$s6eJ,`n 䂦0a)S)A 1eJ,堌#635RIgpNHuTH_SԕqVe ` &S)>p;S$魁eKIuX`I4춒o}`m$1":PI<[v9^\pTJjriRŭ P{#{R2,`)e-`mgj~1ϣLKam7&U\j/3mJ,`F;M'䱀 .KR#)yhTq;pcK9(q!w?uRR,n.yw*UXj#\]ɱ(qv2=RqfB#iJmmL<]Y͙#$5 uTU7ӦXR+q,`I}qL'`6Kͷ6r,]0S$- [RKR3oiRE|nӦXR.(i:LDLTJjY%o:)6rxzҒqTJjh㞦I.$YR.ʼnGZ\ֿf:%55 I˼!6dKxm4E"mG_ s? .e*?LRfK9%q#uh$)i3ULRfK9yxm܌bj84$i1U^@Wbm4uJ,ҪA>_Ij?1v32[gLRD96oTaR׿N7%L2 NT,`)7&ƝL*꽙yp_$M2#AS,`)7$rkTA29_Iye"|/0t)$n XT2`YJ;6Jx".e<`$) PI$5V4]29SRI>~=@j]lp2`K9Jaai^" Ԋ29ORI%:XV5]JmN9]H;1UC39NI%Xe78t)a;Oi Ҙ>Xt"~G>_mn:%|~ޅ_+]$o)@ǀ{hgN;IK6G&rp)T2i୦KJuv*T=TOSV>(~D>dm,I*Ɛ:R#ۙNI%D>G.n$o;+#RR!.eU˽TRI28t)1LWϚ>IJa3oFbu&:tJ*(F7y0ZR ^p'Ii L24x| XRI%ۄ>S1]Jy[zL$adB7.eh4%%누>WETf+3IR:I3Xה)3אOۦSRO'ٺ)S}"qOr[B7ϙ.edG)^ETR"RtRݜh0}LFVӦDB^k_JDj\=LS(Iv─aTeZ%eUAM-0;~˃@i|l @S4y72>sX-vA}ϛBI!ݎߨWl*)3{'Y|iSlEڻ(5KtSI$Uv02,~ԩ~x;P4ցCrO%tyn425:KMlD ^4JRxSهF_}شJTS6uj+ﷸk$eZO%G*^V2u3EMj3k%)okI]dT)URKDS 7~m@TJR~荪fT"֛L \sM -0T KfJz+nإKr L&j()[E&I ߴ>e FW_kJR|!O:5/2跌3T-'|zX ryp0JS ~^F>-2< `*%ZFP)bSn"L :)+pʷf(pO3TMW$~>@~ū:TAIsV1}S2<%ޟM?@iT ,Eūoz%i~g|`wS(]oȤ8)$ ntu`өe`6yPl IzMI{ʣzʨ )IZ2= ld:5+請M$-ї;U>_gsY$ÁN5WzWfIZ)-yuXIfp~S*IZdt;t>KūKR|$#LcԀ+2\;kJ`]YǔM1B)UbG"IRߊ<xܾӔJ0Z='Y嵤 Leveg)$znV-º^3Ւof#0Tfk^Zs[*I꯳3{)ˬW4Ւ4 OdpbZRS|*I 55#"&-IvT&/윚Ye:i$ 9{LkuRe[I~_\ؠ%>GL$iY8 9ܕ"S`kS.IlC;Ҏ4x&>u_0JLr<J2(^$5L s=MgV ~,Iju> 7r2)^=G$1:3G< `J3~&IR% 6Tx/rIj3O< ʔ&#f_yXJiގNSz; Tx(i8%#4 ~AS+IjerIUrIj362v885+IjAhK__5X%nV%Iͳ-y|7XV2v4fzo_68"S/I-qbf; LkF)KSM$ Ms>K WNV}^`-큧32ŒVؙGdu,^^m%6~Nn&͓3ŒVZMsRpfEW%IwdǀLm[7W&bIRL@Q|)* i ImsIMmKmyV`i$G+R 0tV'!V)֏28vU7͒vHꦼtxꗞT ;S}7Mf+fIRHNZUkUx5SAJㄌ9MqμAIRi|j5)o*^'<$TwI1hEU^c_j?Е$%d`z cyf,XO IJnTgA UXRD }{H}^S,P5V2\Xx`pZ|Yk:$e ~ @nWL.j+ϝYb퇪bZ BVu)u/IJ_ 1[p.p60bC >|X91P:N\!5qUB}5a5ja `ubcVxYt1N0Zzl4]7­gKj]?4ϻ *[bg$)+À*x쳀ogO$~,5 زUS9 lq3+5mgw@np1sso Ӻ=|N6 /g(Wv7U;zωM=wk,0uTg_`_P`uz?2yI!b`kĸSo+Qx%!\οe|އԁKS-s6pu_(ֿ$i++T8=eY; צP+phxWQv*|p1. ά. XRkIQYP,drZ | B%wP|S5`~́@i޾ E;Չaw{o'Q?%iL{u D?N1BD!owPHReFZ* k_-~{E9b-~P`fE{AܶBJAFO wx6Rox5 K5=WwehS8 (JClJ~ p+Fi;ŗo+:bD#g(C"wA^ r.F8L;dzdIHUX݆ϞXg )IFqem%I4dj&ppT{'{HOx( Rk6^C٫O.)3:s(۳(Z?~ٻ89zmT"PLtw䥈5&b<8GZ-Y&K?e8,`I6e(֍xb83 `rzXj)F=l($Ij 2*(F?h(/9ik:I`m#p3MgLaKjc/U#n5S# m(^)=y=đx8ŬI[U]~SцA4p$-F i(R,7Cx;X=cI>{Km\ o(Tv2vx2qiiDJN,Ҏ!1f 5quBj1!8 rDFd(!WQl,gSkL1Bxg''՞^ǘ;pQ P(c_ IRujg(Wz bs#P­rz> k c&nB=q+ؔXn#r5)co*Ũ+G?7< |PQӣ'G`uOd>%Mctz# Ԫڞ&7CaQ~N'-P.W`Oedp03C!IZcIAMPUۀ5J<\u~+{9(FbbyAeBhOSܳ1 bÈT#ŠyDžs,`5}DC-`̞%r&ڙa87QWWp6e7 Rϫ/oY ꇅ Nܶըtc!LA T7V4Jsū I-0Pxz7QNF_iZgúWkG83 0eWr9 X]㾮݁#Jˢ C}0=3ݱtBi]_ &{{[/o[~ \q鯜00٩|cD3=4B_b RYb$óBRsf&lLX#M*C_L܄:gx)WΘsGSbuL rF$9';\4Ɍq'n[%p.Q`u hNb`eCQyQ|l_C>Lb꟟3hSb #xNxSs^ 88|Mz)}:](vbۢamŖ࿥ 0)Q7@0=?^k(*J}3ibkFn HjB׻NO z x}7p 0tfDX.lwgȔhԾŲ }6g E |LkLZteu+=q\Iv0쮑)QٵpH8/2?Σo>Jvppho~f>%bMM}\//":PTc(v9v!gոQ )UfVG+! 35{=x\2+ki,y$~A1iC6#)vC5^>+gǵ@1Hy٪7u;p psϰu/S <aʸGu'tD1ԝI<pg|6j'p:tպhX{o(7v],*}6a_ wXRk,O]Lܳ~Vo45rp"N5k;m{rZbΦ${#)`(Ŵg,;j%6j.pyYT?}-kBDc3qA`NWQū20/^AZW%NQ MI.X#P#,^Ebc&?XR tAV|Y.1!؅⨉ccww>ivl(JT~ u`ٵDm q)+Ri x/x8cyFO!/*!/&,7<.N,YDŽ&ܑQF1Bz)FPʛ?5d 6`kQձ λc؎%582Y&nD_$Je4>a?! ͨ|ȎWZSsv8 j(I&yj Jb5m?HWp=g}G3#|I,5v珿] H~R3@B[☉9Ox~oMy=J;xUVoj bUsl_35t-(ՃɼRB7U!qc+x4H_Qo֮$[GO<4`&č\GOc[.[*Af%mG/ ňM/r W/Nw~B1U3J?P&Y )`ѓZ1p]^l“W#)lWZilUQu`-m|xĐ,_ƪ|9i:_{*(3Gѧ}UoD+>m_?VPۅ15&}2|/pIOʵ> GZ9cmíتmnz)yߐbD >e}:) r|@R5qVSA10C%E_'^8cR7O;6[eKePGϦX7jb}OTGO^jn*媓7nGMC t,k31Rb (vyܴʭ!iTh8~ZYZp(qsRL ?b}cŨʊGO^!rPJO15MJ[c&~Z`"ѓޔH1C&^|Ш|rʼ,AwĴ?b5)tLU)F| &g٣O]oqSUjy(x<Ϳ3 .FSkoYg2 \_#wj{u'rQ>o;%n|F*O_L"e9umDds?.fuuQbIWz |4\0 sb;OvxOSs; G%T4gFRurj(֍ڑb uԖKDu1MK{1^ q; C=6\8FR艇!%\YÔU| 88m)֓NcLve C6z;o&X x59:q61Z(T7>C?gcļxѐ Z oo-08jہ x,`' ҔOcRlf~`jj".Nv+sM_]Zk g( UOPyεx%pUh2(@il0ݽQXxppx-NS( WO+轾 nFߢ3M<;z)FBZjciu/QoF 7R¥ ZFLF~#ȣߨ^<쩡ݛкvџ))ME>ώx4m#!-m!L;vv#~Y[đKmx9.[,UFS CVkZ +ߟrY٧IZd/ioi$%͝ب_ֶX3ܫhNU ZZgk=]=bbJS[wjU()*I =ώ:}-蹞lUj:1}MWm=̛ _ ¾,8{__m{_PVK^n3esw5ӫh#$-q=A̟> ,^I}P^J$qY~Q[ Xq9{#&T.^GVj__RKpn,b=`żY@^՝;z{paVKkQXj/)y TIc&F;FBG7wg ZZDG!x r_tƢ!}i/V=M/#nB8 XxЫ ^@CR<{䤭YCN)eKOSƟa $&g[i3.C6xrOc8TI;o hH6P&L{@q6[ Gzp^71j(l`J}]e6X☉#͕ ׈$AB1Vjh㭦IRsqFBjwQ_7Xk>y"N=MB0 ,C #o6MRc0|$)ف"1!ixY<B9mx `,tA>)5ػQ?jQ?cn>YZe Tisvh# GMމȇp:ԴVuږ8ɼH]C.5C!UV;F`mbBk LTMvPʍϤj?ԯ/Qr1NB`9s"s TYsz &9S%U԰> {<ؿSMxB|H\3@!U| k']$U+> |HHMLޢ?V9iD!-@x TIî%6Z*9X@HMW#?nN ,oe6?tQwڱ.]-y':mW0#!J82qFjH -`ѓ&M0u Uγmxϵ^-_\])@0Rt.8/?ٰCY]x}=sD3ojަЫNuS%U}ԤwHH>ڗjܷ_3gN q7[q2la*ArǓԖ+p8/RGM ]jacd(JhWko6ڎbj]i5Bj3+3!\j1UZLsLTv8HHmup<>gKMJj0@H%,W΃7R) ">c, xixј^ aܖ>H[i.UIHc U1=yW\=S*GR~)AF=`&2h`DzT󑓶J+?W+}C%P:|0H܆}-<;OC[~o.$~i}~HQ TvXΈr=b}$vizL4:ȰT|4~*!oXQR6Lk+#t/g lԁߖ[Jڶ_N$k*". xsxX7jRVbAAʯKҎU3)zSNN _'s?f)6X!%ssAkʱ>qƷb hg %n ~p1REGMHH=BJiy[<5 ǁJҖgKR*倳e~HUy)Ag,K)`Vw6bRR:qL#\rclK/$sh*$ 6덤 KԖc 3Z9=Ɣ=o>X Ώ"1 )a`SJJ6k(<c e{%kϊP+SL'TcMJWRm ŏ"w)qc ef꒵i?b7b('"2r%~HUS1\<(`1Wx9=8HY9m:X18bgD1u ~|H;K-Uep,, C1 RV.MR5άh,tWO8WC$ XRVsQS]3GJ|12 [vM :k#~tH30Rf-HYݺ-`I9%lIDTm\ S{]9gOڒMNCV\G*2JRŨ;Rҏ^ڽ̱mq1Eu?To3I)y^#jJw^Ńj^vvlB_⋌P4x>0$c>K†Aļ9s_VjTt0l#m>E-,,x,-W)سo&96RE XR.6bXw+)GAEvL)͞K4$p=Ũi_ѱOjb HY/+@θH9޼]Nԥ%n{ &zjT? Ty) s^ULlb,PiTf^<À] 62R^V7)S!nllS6~͝V}-=%* ʻ>G DnK<y&>LPy7'r=Hj 9V`[c"*^8HpcO8bnU`4JȪAƋ#1_\ XϘHPRgik(~G~0DAA_2p|J묭a2\NCr]M_0 ^T%e#vD^%xy-n}-E\3aS%yN!r_{ )sAw ڼp1pEAk~v<:`'ӭ^5 ArXOI驻T (dk)_\ PuA*BY]yB"l\ey hH*tbK)3 IKZ򹞋XjN n *n>k]X_d!ryBH ]*R 0(#'7 %es9??ښFC,ՁQPjARJ\Ρw K#jahgw;2$l*) %Xq5!U᢯6Re] |0[__64ch&_}iL8KEgҎ7 M/\`|.p,~`a=BR?xܐrQ8K XR2M8f ?`sgWS%" Ԉ 7R%$ N}?QL1|-эټwIZ%pvL3Hk>,ImgW7{E xPHx73RA @RS CC !\ȟ5IXR^ZxHл$Q[ŝ40 (>+ _C >BRt<,TrT {O/H+˟Pl6 I B)/VC<6a2~(XwV4gnXR ϱ5ǀHٻ?tw똤Eyxp{#WK qG%5],(0ӈH HZ])ג=K1j&G(FbM@)%I` XRg ʔ KZG(vP,<`[ Kn^ SJRsAʠ5xՅF`0&RbV tx:EaUE/{fi2;.IAwW8/tTxAGOoN?G}l L(n`Zv?pB8K_gI+ܗ #i?ޙ.) p$utc ~DžfՈEo3l/)I-U?aԅ^jxArA ΧX}DmZ@QLےbTXGd.^|xKHR{|ΕW_h] IJ`[G9{).y) 0X YA1]qp?p_k+J*Y@HI>^?gt.06Rn ,` ?);p pSF9ZXLBJPWjgQ|&)7! HjQt<| ؅W5 x W HIzYoVMGP Hjn`+\(dNW)F+IrS[|/a`K|ͻ0Hj{R,Q=\ (F}\WR)AgSG`IsnAR=|8$}G(vC$)s FBJ?]_u XRvύ6z ŨG[36-T9HzpW̞ú Xg큽=7CufzI$)ki^qk-) 0H*N` QZkk]/tnnsI^Gu't=7$ Z;{8^jB% IItRQS7[ϭ3 $_OQJ`7!]W"W,)Iy W AJA;KWG`IY{8k$I$^%9.^(`N|LJ%@$I}ֽp=FB*xN=gI?Q{٥4B)mw $Igc~dZ@G9K X?7)aK%݅K$IZ-`IpC U6$I\0>!9k} Xa IIS0H$I H ?1R.Чj:4~Rw@p$IrA*u}WjWFPJ$I➓/6#! LӾ+ X36x8J |+L;v$Io4301R20M I$-E}@,pS^ޟR[/s¹'0H$IKyfŸfVOπFT*a$I>He~VY/3R/)>d$I>28`Cjw,n@FU*9ttf$I~<;=/4RD~@ X-ѕzἱI$: ԍR a@b X{+Qxuq$IЛzo /~3\8ڒ4BN7$IҀj V]n18H$IYFBj3̵̚ja pp $Is/3R Ӻ-Yj+L;.0ŔI$Av? #!5"aʄj}UKmɽH$IjCYs?h$IDl843.v}m7UiI=&=0Lg0$I4: embe` eQbm0u? $IT!Sƍ'-sv)s#C0:XB2a w I$zbww{."pPzO =Ɔ\[ o($Iaw]`E).Kvi:L*#gР7[$IyGPI=@R 4yR~̮´cg I$I/<tPͽ hDgo 94Z^k盇΄8I56^W$I^0̜N?4*H`237}g+hxoq)SJ@p|` $I%>-hO0eO>\ԣNߌZD6R=K ~n($I$y3D>o4b#px2$yڪtzW~a $I~?x'BwwpH$IZݑnC㧄Pc_9sO gwJ=l1:mKB>Ab<4Lp$Ib o1ZQ@85b̍ S'F,Fe,^I$IjEdù{l4 8Ys_s Z8.x m"+{~?q,Z D!I$ϻ'|XhB)=…']M>5 rgotԎ 獽PH$IjIPhh)n#cÔqA'ug5qwU&rF|1E%I$%]!'3AFD/;Ck_`9 v!ٴtPV;x`'*bQa w I$Ix5 FC3D_~A_#O݆DvV?<qw+I$I{=Z8".#RIYyjǪ=fDl9%M,a8$I$Ywi[7ݍFe$s1ՋBVA?`]#!oz4zjLJo8$I$%@3jAa4(o ;p,,dya=F9ً[LSPH$IJYЉ+3> 5"39aZ<ñh!{TpBGkj}Sp $IlvF.F$I z< '\K*qq.f<2Y!S"-\I$IYwčjF$ w9 \ߪB.1v!Ʊ?+r:^!I$BϹB H"B;L'G[ 4U#5>੐)|#o0aڱ$I>}k&1`U#V?YsV x>{t1[I~D&(I$I/{H0fw"q"y%4 IXyE~M3 8XψL}qE$I[> nD?~sf ]o΁ cT6"?'_Ἣ $I>~.f|'!N?⟩0G KkXZE]ޡ;/&?k OۘH$IRۀwXӨ<7@PnS04aӶp.:@\IWQJ6sS%I$e5ڑv`3:x';wq_vpgHyXZ 3gЂ7{{EuԹn±}$I$8t;b|591nءQ"P6O5i }iR̈́%Q̄p!I䮢]O{H$IRϻ9s֧ a=`- aB\X0"+5"C1Hb?߮3x3&gşggl_hZ^,`5?ߎvĸ%̀M!OZC2#0x LJ0 Gw$I$I}<{Eb+y;iI,`ܚF:5ܛA8-O-|8K7s|#Z8a&><a&/VtbtLʌI$I$I$I$I$I$IRjDD%tEXtdate:create2022-05-31T04:40:26+00:00!Î%tEXtdate:modify2022-05-31T04:40:26+00:00|{2IENDB`Mini Shell

HOME


Mini Shell 1.0
DIR:/home/htlwork.com/www/himsaral/vendor/psy/psysh/src/Readline/Hoa/
Upload File :
Current File : /home/htlwork.com/www/himsaral/vendor/psy/psysh/src/Readline/Hoa/ConsoleTput.php
<?php

/**
 * Hoa
 *
 *
 * @license
 *
 * New BSD License
 *
 * Copyright © 2007-2017, Hoa community. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of the Hoa nor the names of its contributors may be
 *       used to endorse or promote products derived from this software without
 *       specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

namespace Psy\Readline\Hoa;

/**
 * Class \Hoa\Console\Tput.
 *
 * Query terminfo database.
 * Resources:
 *     • http://man.cx/terminfo(5),
 *     • http://pubs.opengroup.org/onlinepubs/7908799/xcurses/terminfo.html,
 */
class ConsoleTput
{
    /**
     * Booleans.
     */
    protected static $_booleans = [
        'auto_left_margin',
        'auto_right_margin',
        'no_esc_ctlc',
        'ceol_standout_glitch',
        'eat_newline_glitch',
        'erase_overstrike',
        'generic_type',
        'hard_copy',
        'meta_key', // originally has_meta_key
        'status_line', // originally has_status_line
        'insert_null_glitch',
        'memory_above',
        'memory_below',
        'move_insert_mode',
        'move_standout_mode',
        'over_strike',
        'status_line_esc_ok',
        'dest_tabs_magic_smso',
        'tilde_glitch',
        'transparent_underline',
        'xon_xoff',
        'needs_xon_xoff',
        'prtr_silent',
        'hard_cursor',
        'non_rev_rmcup',
        'no_pad_char',
        'non_dest_scroll_region',
        'can_change',
        'back_color_erase',
        'hue_lightness_saturation',
        'col_addr_glitch',
        'cr_cancels_micro_mode',
        'print_wheel', // originally has_print_wheel
        'row_addr_glitch',
        'semi_auto_right_margin',
        'cpi_changes_res',
        'lpi_changes_res',
        // #ifdef __INTERNAL_CAPS_VISIBLE
        'backspaces_with_bs',
        'crt_no_scrolling',
        'no_correctly_working_cr',
        'gnu_meta_key', // originally gnu_has_meta_key
        'linefeed_is_newline',
        'hardware_tabs', // originally has_hardware_tabs
        'return_does_clr_eol',
    ];

    /**
     * Numbers.
     */
    protected static $_numbers = [
        'columns',
        'init_tabs',
        'lines',
        'lines_of_memory',
        'magic_cookie_glitch',
        'padding_baud_rate',
        'virtual_terminal',
        'width_status_line',
        'num_labels',
        'label_height',
        'label_width',
        'max_attributes',
        'maximum_windows',
        'max_colors',
        'max_pairs',
        'no_color_video',
        'buffer_capacity',
        'dot_vert_spacing',
        'dot_horz_spacing',
        'max_micro_address',
        'max_micro_jump',
        'micro_col_size',
        'micro_line_size',
        'number_of_pins',
        'output_res_char',
        'output_res_line',
        'output_res_horz_inch',
        'output_res_vert_inch',
        'print_rate',
        'wide_char_size',
        'buttons',
        'bit_image_entwining',
        'bit_image_type',
        // #ifdef __INTERNAL_CAPS_VISIBLE
        'magic_cookie_glitch_ul',
        'carriage_return_delay',
        'new_line_delay',
        'backspace_delay',
        'horizontal_tab_delay',
        'number_of_function_keys',
    ];

    /**
     * Strings.
     */
    protected static $_strings = [
        'back_tab',
        'bell',
        'carriage_return',
        'change_scroll_region',
        'clear_all_tabs',
        'clear_screen',
        'clr_eol',
        'clr_eos',
        'column_address',
        'command_character',
        'cursor_address',
        'cursor_down',
        'cursor_home',
        'cursor_invisible',
        'cursor_left',
        'cursor_mem_address',
        'cursor_normal',
        'cursor_right',
        'cursor_to_ll',
        'cursor_up',
        'cursor_visible',
        'delete_character',
        'delete_line',
        'dis_status_line',
        'down_half_line',
        'enter_alt_charset_mode',
        'enter_blink_mode',
        'enter_bold_mode',
        'enter_ca_mode',
        'enter_delete_mode',
        'enter_dim_mode',
        'enter_insert_mode',
        'enter_secure_mode',
        'enter_protected_mode',
        'enter_reverse_mode',
        'enter_standout_mode',
        'enter_underline_mode',
        'erase_chars',
        'exit_alt_charset_mode',
        'exit_attribute_mode',
        'exit_ca_mode',
        'exit_delete_mode',
        'exit_insert_mode',
        'exit_standout_mode',
        'exit_underline_mode',
        'flash_screen',
        'form_feed',
        'from_status_line',
        'init_1string',
        'init_2string',
        'init_3string',
        'init_file',
        'insert_character',
        'insert_line',
        'insert_padding',
        'key_backspace',
        'key_catab',
        'key_clear',
        'key_ctab',
        'key_dc',
        'key_dl',
        'key_down',
        'key_eic',
        'key_eol',
        'key_eos',
        'key_f0',
        'key_f1',
        'key_f10',
        'key_f2',
        'key_f3',
        'key_f4',
        'key_f5',
        'key_f6',
        'key_f7',
        'key_f8',
        'key_f9',
        'key_home',
        'key_ic',
        'key_il',
        'key_left',
        'key_ll',
        'key_npage',
        'key_ppage',
        'key_right',
        'key_sf',
        'key_sr',
        'key_stab',
        'key_up',
        'keypad_local',
        'keypad_xmit',
        'lab_f0',
        'lab_f1',
        'lab_f10',
        'lab_f2',
        'lab_f3',
        'lab_f4',
        'lab_f5',
        'lab_f6',
        'lab_f7',
        'lab_f8',
        'lab_f9',
        'meta_off',
        'meta_on',
        'newline',
        'pad_char',
        'parm_dch',
        'parm_delete_line',
        'parm_down_cursor',
        'parm_ich',
        'parm_index',
        'parm_insert_line',
        'parm_left_cursor',
        'parm_right_cursor',
        'parm_rindex',
        'parm_up_cursor',
        'pkey_key',
        'pkey_local',
        'pkey_xmit',
        'print_screen',
        'prtr_off',
        'prtr_on',
        'repeat_char',
        'reset_1string',
        'reset_2string',
        'reset_3string',
        'reset_file',
        'restore_cursor',
        'row_address',
        'save_cursor',
        'scroll_forward',
        'scroll_reverse',
        'set_attributes',
        'set_tab',
        'set_window',
        'tab',
        'to_status_line',
        'underline_char',
        'up_half_line',
        'init_prog',
        'key_a1',
        'key_a3',
        'key_b2',
        'key_c1',
        'key_c3',
        'prtr_non',
        'char_padding',
        'acs_chars',
        'plab_norm',
        'key_btab',
        'enter_xon_mode',
        'exit_xon_mode',
        'enter_am_mode',
        'exit_am_mode',
        'xon_character',
        'xoff_character',
        'ena_acs',
        'label_on',
        'label_off',
        'key_beg',
        'key_cancel',
        'key_close',
        'key_command',
        'key_copy',
        'key_create',
        'key_end',
        'key_enter',
        'key_exit',
        'key_find',
        'key_help',
        'key_mark',
        'key_message',
        'key_move',
        'key_next',
        'key_open',
        'key_options',
        'key_previous',
        'key_print',
        'key_redo',
        'key_reference',
        'key_refresh',
        'key_replace',
        'key_restart',
        'key_resume',
        'key_save',
        'key_suspend',
        'key_undo',
        'key_sbeg',
        'key_scancel',
        'key_scommand',
        'key_scopy',
        'key_screate',
        'key_sdc',
        'key_sdl',
        'key_select',
        'key_send',
        'key_seol',
        'key_sexit',
        'key_sfind',
        'key_shelp',
        'key_shome',
        'key_sic',
        'key_sleft',
        'key_smessage',
        'key_smove',
        'key_snext',
        'key_soptions',
        'key_sprevious',
        'key_sprint',
        'key_sredo',
        'key_sreplace',
        'key_sright',
        'key_srsume',
        'key_ssave',
        'key_ssuspend',
        'key_sundo',
        'req_for_input',
        'key_f11',
        'key_f12',
        'key_f13',
        'key_f14',
        'key_f15',
        'key_f16',
        'key_f17',
        'key_f18',
        'key_f19',
        'key_f20',
        'key_f21',
        'key_f22',
        'key_f23',
        'key_f24',
        'key_f25',
        'key_f26',
        'key_f27',
        'key_f28',
        'key_f29',
        'key_f30',
        'key_f31',
        'key_f32',
        'key_f33',
        'key_f34',
        'key_f35',
        'key_f36',
        'key_f37',
        'key_f38',
        'key_f39',
        'key_f40',
        'key_f41',
        'key_f42',
        'key_f43',
        'key_f44',
        'key_f45',
        'key_f46',
        'key_f47',
        'key_f48',
        'key_f49',
        'key_f50',
        'key_f51',
        'key_f52',
        'key_f53',
        'key_f54',
        'key_f55',
        'key_f56',
        'key_f57',
        'key_f58',
        'key_f59',
        'key_f60',
        'key_f61',
        'key_f62',
        'key_f63',
        'clr_bol',
        'clear_margins',
        'set_left_margin',
        'set_right_margin',
        'label_format',
        'set_clock',
        'display_clock',
        'remove_clock',
        'create_window',
        'goto_window',
        'hangup',
        'dial_phone',
        'quick_dial',
        'tone',
        'pulse',
        'flash_hook',
        'fixed_pause',
        'wait_tone',
        'user0',
        'user1',
        'user2',
        'user3',
        'user4',
        'user5',
        'user6',
        'user7',
        'user8',
        'user9',
        'orig_pair',
        'orig_colors',
        'initialize_color',
        'initialize_pair',
        'set_color_pair',
        'set_foreground',
        'set_background',
        'change_char_pitch',
        'change_line_pitch',
        'change_res_horz',
        'change_res_vert',
        'define_char',
        'enter_doublewide_mode',
        'enter_draft_quality',
        'enter_italics_mode',
        'enter_leftward_mode',
        'enter_micro_mode',
        'enter_near_letter_quality',
        'enter_normal_quality',
        'enter_shadow_mode',
        'enter_subscript_mode',
        'enter_superscript_mode',
        'enter_upward_mode',
        'exit_doublewide_mode',
        'exit_italics_mode',
        'exit_leftward_mode',
        'exit_micro_mode',
        'exit_shadow_mode',
        'exit_subscript_mode',
        'exit_superscript_mode',
        'exit_upward_mode',
        'micro_column_address',
        'micro_down',
        'micro_left',
        'micro_right',
        'micro_row_address',
        'micro_up',
        'order_of_pins',
        'parm_down_micro',
        'parm_left_micro',
        'parm_right_micro',
        'parm_up_micro',
        'select_char_set',
        'set_bottom_margin',
        'set_bottom_margin_parm',
        'set_left_margin_parm',
        'set_right_margin_parm',
        'set_top_margin',
        'set_top_margin_parm',
        'start_bit_image',
        'start_char_set_def',
        'stop_bit_image',
        'stop_char_set_def',
        'subscript_characters',
        'superscript_characters',
        'these_cause_cr',
        'zero_motion',
        'char_set_names',
        'key_mouse',
        'mouse_info',
        'req_mouse_pos',
        'get_mouse',
        'set_a_foreground',
        'set_a_background',
        'pkey_plab',
        'device_type',
        'code_set_init',
        'set0_des_seq',
        'set1_des_seq',
        'set2_des_seq',
        'set3_des_seq',
        'set_lr_margin',
        'set_tb_margin',
        'bit_image_repeat',
        'bit_image_newline',
        'bit_image_carriage_return',
        'color_names',
        'define_bit_image_region',
        'end_bit_image_region',
        'set_color_band',
        'set_page_length',
        'display_pc_char',
        'enter_pc_charset_mode',
        'exit_pc_charset_mode',
        'enter_scancode_mode',
        'exit_scancode_mode',
        'pc_term_options',
        'scancode_escape',
        'alt_scancode_esc',
        'enter_horizontal_hl_mode',
        'enter_left_hl_mode',
        'enter_low_hl_mode',
        'enter_right_hl_mode',
        'enter_top_hl_mode',
        'enter_vertical_hl_mode',
        'set_a_attributes',
        'set_pglen_inch',
        // #ifdef __INTERNAL_CAPS_VISIBLE
        'termcap_init2',
        'termcap_reset',
        'linefeed_if_not_lf',
        'backspace_if_not_bs',
        'other_non_function_keys',
        'arrow_key_map',
        'acs_ulcorner',
        'acs_llcorner',
        'acs_urcorner',
        'acs_lrcorner',
        'acs_ltee',
        'acs_rtee',
        'acs_btee',
        'acs_ttee',
        'acs_hline',
        'acs_vline',
        'acs_plus',
        'memory_lock',
        'memory_unlock',
        'box_chars_1',
    ];

    /**
     * Computed informations.
     */
    protected $_informations = [];

    /**
     * Set stream and parse.
     */
    public function __construct($terminfo = null)
    {
        if (null === $terminfo) {
            $terminfo = static::getTerminfo();
        }

        $this->parse($terminfo);

        return;
    }

    /**
     * Parse.
     */
    protected function parse(string $terminfo): array
    {
        if (!\file_exists($terminfo)) {
            throw new ConsoleException('Terminfo file %s does not exist.', 0, $terminfo);
        }

        $data = \file_get_contents($terminfo);
        $length = \strlen($data);
        $out = ['file' => $terminfo];

        $headers = [
            'data_size'         => $length,
            'header_size'       => 12,
            'magic_number'      => (\ord($data[1]) << 8) | \ord($data[0]),
            'names_size'        => (\ord($data[3]) << 8) | \ord($data[2]),
            'bool_count'        => (\ord($data[5]) << 8) | \ord($data[4]),
            'number_count'      => (\ord($data[7]) << 8) | \ord($data[6]),
            'string_count'      => (\ord($data[9]) << 8) | \ord($data[8]),
            'string_table_size' => (\ord($data[11]) << 8) | \ord($data[10]),
        ];
        $out['headers'] = $headers;

        // Names.
        $i = $headers['header_size'];
        $nameAndDescription = \explode('|', \substr($data, $i, $headers['names_size'] - 1));
        $out['name'] = $nameAndDescription[0];
        $out['description'] = $nameAndDescription[1];

        // Booleans.
        $i += $headers['names_size'];
        $booleans = [];
        $booleanNames = &static::$_booleans;

        for (
            $e = 0, $max = $i + $headers['bool_count'];
            $i < $max;
            ++$e, ++$i
        ) {
            $booleans[$booleanNames[$e]] = 1 === \ord($data[$i]);
        }

        $out['booleans'] = $booleans;

        // Numbers.
        if (1 === ($i % 2)) {
            ++$i;
        }

        $numbers = [];
        $numberNames = &static::$_numbers;

        for (
            $e = 0, $max = $i + $headers['number_count'] * 2;
            $i < $max;
            ++$e, $i += 2
        ) {
            $name = $numberNames[$e];
            $data_i0 = \ord($data[$i]);
            $data_i1 = \ord($data[$i + 1]);

            if ($data_i1 === 255 && $data_i0 === 255) {
                $numbers[$name] = -1;
            } else {
                $numbers[$name] = ($data_i1 << 8) | $data_i0;
            }
        }

        $out['numbers'] = $numbers;

        // Strings.
        $strings = [];
        $stringNames = &static::$_strings;
        $ii = $i + $headers['string_count'] * 2;

        for (
            $e = 0, $max = $ii;
            $i < $max;
            ++$e, $i += 2
        ) {
            $name = $stringNames[$e];
            $data_i0 = \ord($data[$i]);
            $data_i1 = \ord($data[$i + 1]);

            if ($data_i1 === 255 && $data_i0 === 255) {
                continue;
            }

            $a = ($data_i1 << 8) | $data_i0;
            $strings[$name] = $a;

            if (65534 === $a) {
                continue;
            }

            $b = $ii + $a;
            $c = $b;

            while ($c < $length && \ord($data[$c])) {
                $c++;
            }

            $value = \substr($data, $b, $c - $b);
            $strings[$name] = false !== $value ? $value : null;
        }

        $out['strings'] = $strings;

        return $this->_informations = $out;
    }

    /**
     * Get all informations.
     */
    public function getInformations(): array
    {
        return $this->_informations;
    }

    /**
     * Get a boolean value.
     */
    public function has(string $boolean): bool
    {
        if (!isset($this->_informations['booleans'][$boolean])) {
            return false;
        }

        return $this->_informations['booleans'][$boolean];
    }

    /**
     * Get a number value.
     */
    public function count(string $number): int
    {
        if (!isset($this->_informations['numbers'][$number])) {
            return 0;
        }

        return $this->_informations['numbers'][$number];
    }

    /**
     * Get a string value.
     */
    public function get(string $string)
    {
        if (!isset($this->_informations['strings'][$string])) {
            return null;
        }

        return $this->_informations['strings'][$string];
    }

    /**
     * Get current term profile.
     */
    public static function getTerm(): string
    {
        return
            isset($_SERVER['TERM']) && !empty($_SERVER['TERM'])
                ? $_SERVER['TERM']
                : (\defined('PHP_WINDOWS_VERSION_PLATFORM') ? 'windows-ansi' : 'xterm');
    }

    /**
     * Get pathname to the current terminfo.
     */
    public static function getTerminfo($term = null): string
    {
        $paths = [];

        if (isset($_SERVER['TERMINFO'])) {
            $paths[] = $_SERVER['TERMINFO'];
        }

        if (isset($_SERVER['HOME'])) {
            $paths[] = $_SERVER['HOME'].\DIRECTORY_SEPARATOR.'.terminfo';
        }

        if (isset($_SERVER['TERMINFO_DIRS'])) {
            foreach (\explode(':', $_SERVER['TERMINFO_DIRS']) as $path) {
                $paths[] = $path;
            }
        }

        $paths[] = '/usr/share/terminfo';
        $paths[] = '/usr/share/lib/terminfo';
        $paths[] = '/lib/terminfo';
        $paths[] = '/usr/lib/terminfo';
        $paths[] = '/usr/local/share/terminfo';
        $paths[] = '/usr/local/share/lib/terminfo';
        $paths[] = '/usr/local/lib/terminfo';
        $paths[] = '/usr/local/ncurses/lib/terminfo';
        $paths[] = 'hoa://Library/Terminfo';

        $term = $term ?: static::getTerm();
        $fileHexa = \dechex(\ord($term[0])).\DIRECTORY_SEPARATOR.$term;
        $fileAlpha = $term[0].\DIRECTORY_SEPARATOR.$term;
        $pathname = null;

        foreach ($paths as $path) {
            if (\file_exists($_ = $path.\DIRECTORY_SEPARATOR.$fileHexa) ||
                \file_exists($_ = $path.\DIRECTORY_SEPARATOR.$fileAlpha)) {
                $pathname = $_;

                break;
            }
        }

        if (null === $pathname && 'xterm' !== $term) {
            return static::getTerminfo('xterm');
        }

        return $pathname ?? '';
    }

    /**
     * Check whether all required terminfo capabilities are defined.
     */
    public static function isSupported(): bool
    {
        if (static::getTerminfo() === '') {
            return false;
        }

        $requiredVars = [
            'clear_screen',
            'clr_bol',
            'clr_eol',
            'clr_eos',
            'initialize_color',
            'parm_down_cursor',
            'parm_index',
            'parm_left_cursor',
            'parm_right_cursor',
            'parm_rindex',
            'parm_up_cursor',
            'user6',
            'user7',
        ];

        $tput = new self();

        foreach ($requiredVars as $var) {
            if ($tput->get($var) === null) {
                return false;
            }
        }

        return true;
    }
}